protected MOCMAEvolutionStrategy(MOCMAEvolutionStrategy original, Cloner cloner) : base(original, cloner)
        {
            random    = cloner.Clone(original.random);
            gauss     = cloner.Clone(original.gauss);
            solutions = original.solutions != null?original.solutions.Select(cloner.Clone).ToArray() : null;

            stepSizeLearningRate           = original.stepSizeLearningRate;
            stepSizeDampeningFactor        = original.stepSizeDampeningFactor;
            targetSuccessProbability       = original.targetSuccessProbability;
            evolutionPathLearningRate      = original.evolutionPathLearningRate;
            covarianceMatrixLearningRate   = original.covarianceMatrixLearningRate;
            covarianceMatrixUnlearningRate = original.covarianceMatrixUnlearningRate;
            successThreshold = original.successThreshold;
        }
Ejemplo n.º 2
0
 public override void ShakeLocalParameters(IRandom random, double shakingFactor)
 {
     base.ShakeLocalParameters(random, shakingFactor);
     // 50% additive & 50% multiplicative
     if (random.NextDouble() < 0.5)
     {
         double x = NormalDistributedRandom.NextDouble(random, Symbol.ManipulatorMu, Symbol.ManipulatorSigma);
         Value = Value + x * shakingFactor;
     }
     else
     {
         double x = NormalDistributedRandom.NextDouble(random, 1.0, Symbol.MultiplicativeManipulatorSigma);
         Value = Value * x;
     }
 }
Ejemplo n.º 3
0
    /// <summary>
    /// Performs an adaptive normally distributed all position manipulation on the given 
    /// <paramref name="vector"/> and rounding the results to the next feasible value.
    /// </summary>
    /// <exception cref="InvalidOperationException">Thrown when the strategy vector is not
    /// as long as the vector to get manipulated.</exception>
    /// <param name="strategyParameters">The strategy vector determining the strength of the mutation.</param>
    /// <param name="random">A random number generator.</param>
    /// <param name="vector">The integer vector to manipulate.</param>
    /// <param name="bounds">The bounds and step size for each dimension (will be cycled in case there are less rows than elements in the parent vectors).</param>
    public static void Apply(IRandom random, IntegerVector vector, IntMatrix bounds, DoubleArray strategyParameters) {
      if (strategyParameters == null || strategyParameters.Length == 0) throw new ArgumentException("SelfAdaptiveRoundedNormalAllPositionsManipulator: Vector containing the standard deviations is not defined.", "sigma");
      if (bounds == null || bounds.Rows == 0 || bounds.Columns < 2) throw new ArgumentException("SelfAdaptiveRoundedNormalAllPositionsManipulator: Invalid bounds specified.", "bounds");
      var N = new NormalDistributedRandom(random, 0.0, 1.0);
      if (strategyParameters != null) {
        for (int i = 0; i < vector.Length; i++) {
          int min = bounds[i % bounds.Rows, 0], max = bounds[i % bounds.Rows, 1], step = 1;
          if (bounds.Columns > 2) step = bounds[i % bounds.Rows, 2];

          int value = (vector[i] + (int)Math.Round((N.NextDouble() * strategyParameters[i % strategyParameters.Length])) - min) / step;
          max = FloorFeasible(min, max, step, max - 1);
          vector[i] = RoundFeasible(min, max, step, value);
        }
      }
    }
Ejemplo n.º 4
0
        public override IEnumerable <IDataDescriptor> GetDataDescriptors()
        {
            var sizes           = new int[] { 50, 100, 200 };
            var pp              = new double[] { 0.1, 0.25, 0.5 };
            var noiseRatios     = new double[] { 0.01, 0.05, 0.1, 0.2 };
            var mt              = new MersenneTwister();
            var xGenerator      = new NormalDistributedRandom(mt, 0, 1);
            var weightGenerator = new UniformDistributedRandom(mt, 0, 10);

            return((from size in sizes
                    from p in pp
                    from noiseRatio in noiseRatios
                    select new FeatureSelection(size, p, noiseRatio, xGenerator, weightGenerator))
                   .Cast <IDataDescriptor>()
                   .ToList());
        }
Ejemplo n.º 5
0
        protected override void Initialize(CancellationToken cancellationToken)
        {
            if (SetSeedRandomly)
            {
                Seed = RandomSeedGenerator.GetSeed();
            }
            random.Reset(Seed);
            gauss = new NormalDistributedRandom(random, 0, 1);

            InitResults();
            InitStrategy();
            InitSolutions();
            Analyze();

            ResultsIterations = 1;
        }
Ejemplo n.º 6
0
        public static AdditiveMove[] Apply(IRandom random, RealVector vector, double sigma, int sampleSize, DoubleMatrix bounds)
        {
            AdditiveMove[]          moves = new AdditiveMove[sampleSize];
            NormalDistributedRandom N     = new NormalDistributedRandom(random, 0, sigma);

            for (int i = 0; i < sampleSize; i++)
            {
                int    index = random.Next(vector.Length);
                double strength = 0, min = bounds[index % bounds.Rows, 0], max = bounds[index % bounds.Rows, 1];
                do
                {
                    strength = N.NextDouble();
                } while (vector[index] + strength <min || vector[index] + strength> max);
                moves[i] = new AdditiveMove(index, strength);
            }
            return(moves);
        }
Ejemplo n.º 7
0
        private IEnumerable <double> SampleGaussianProcess(IRandom random, List <double>[] xs)
        {
            int nl    = xs.Length;
            int nRows = xs.First().Count;

            double[,] K = new double[nRows, nRows];

            // sample length-scales
            var l = Enumerable.Range(0, nl)
                    .Select(_ => random.NextDouble() * 2 + 0.5)
                    .ToArray();

            // calculate covariance matrix
            for (int r = 0; r < nRows; r++)
            {
                double[] xi = xs.Select(x => x[r]).ToArray();
                for (int c = 0; c <= r; c++)
                {
                    double[] xj   = xs.Select(x => x[c]).ToArray();
                    double   dSqr = xi.Zip(xj, (xik, xjk) => (xik - xjk))
                                    .Select(dk => dk * dk)
                                    .Zip(l, (dk, lk) => dk / lk)
                                    .Sum();
                    K[r, c] = Math.Exp(-dSqr);
                }
            }

            // add a small diagonal matrix for numeric stability
            for (int i = 0; i < nRows; i++)
            {
                K[i, i] += 1.0E-7;
            }

            // decompose
            alglib.trfac.spdmatrixcholesky(ref K, nRows, false);

            // sample u iid ~ N(0, 1)
            var u = Enumerable.Range(0, nRows).Select(_ => NormalDistributedRandom.NextDouble(random, 0, 1)).ToArray();

            // calc y = Lu
            var y = new double[u.Length];

            alglib.ablas.rmatrixmv(nRows, nRows, K, 0, 0, 0, u, 0, ref y, 0);

            return(y);
        }
        public static void UpdateVelocity(IRandom random, RealVector velocity, RealVector position, RealVector personalBest, RealVector neighborBest, double inertia = 0.721, double personalBestAttraction = 1.193, double neighborBestAttraction = 1.193, double maxVelocity = double.MaxValue)
        {
            var gravity   = new double[velocity.Length];
            var direction = new RealVector(velocity.Length);
            var radius    = 0.0;

            var nd = new NormalDistributedRandom(random, 0, 1);

            for (int i = 0; i < velocity.Length; i++)
            {
                var g_id = (personalBestAttraction * personalBest[i]
                            + neighborBestAttraction * neighborBest[i]
                            - position[i] * (neighborBestAttraction + personalBestAttraction)) / 3.0;
                // center of the hyper-sphere
                gravity[i] = g_id + position[i];
                // a random direction vector uniform over the surface of hyper-sphere, see http://mathworld.wolfram.com/HyperspherePointPicking.html
                direction[i] = nd.NextDouble();
                radius      += g_id * g_id;
            }

            // randomly choose a radius within the hyper-sphere
            radius = random.NextDouble() * Math.Sqrt(radius);

            // unitscale is used to rescale the random direction vector to unit length, resp. length of the radius
            var unitscale = Math.Sqrt(direction.DotProduct(direction));

            if (unitscale > 0)
            {
                for (var i = 0; i < velocity.Length; i++)
                {
                    var sampledPos = gravity[i] + direction[i] * radius / unitscale;
                    velocity[i] = velocity[i] * inertia + sampledPos - position[i];
                }
            }

            var speed = Math.Sqrt(velocity.DotProduct(velocity));

            if (speed > maxVelocity)
            {
                for (var i = 0; i < velocity.Length; i++)
                {
                    velocity[i] *= maxVelocity / speed;
                }
            }
        }
        protected override List <List <double> > GenerateValues()
        {
            List <List <double> > data   = new List <List <double> >();
            List <int>            values = new List <int>()
            {
                -1, 1
            };
            var rand = new MersenneTwister((uint)Seed);

            data.Add(GenerateUniformIntegerDistribution(rand, values, TestPartitionEnd));
            values.Add(0);
            for (int i = 0; i < AllowedInputVariables.Count() - 1; i++)
            {
                data.Add(GenerateUniformIntegerDistribution(rand, values, TestPartitionEnd));
            }
            double        x1, x2, x3, x4, x5, x6, x7;
            double        f;
            List <double> results = new List <double>();
            double        sigma   = Math.Sqrt(2);

            for (int i = 0; i < data[0].Count; i++)
            {
                x1 = data[0][i];
                x2 = data[1][i];
                x3 = data[2][i];
                x4 = data[3][i];
                x5 = data[4][i];
                x6 = data[5][i];
                x7 = data[6][i];

                if (x1.Equals(1))
                {
                    f = 3 + 3 * x2 + 2 * x3 + x4;
                }
                else
                {
                    f = -3 + 3 * x5 + 2 * x6 + x7;
                }

                results.Add(f + NormalDistributedRandom.NextDouble(rand, 0, sigma));
            }
            data.Add(results);

            return(data);
        }
Ejemplo n.º 10
0
        public override void ShakeLocalParameters(IRandom random, double shakingFactor)
        {
            base.ShakeLocalParameters(random, shakingFactor);
            // 50% additive & 50% multiplicative
            if (random.NextDouble() < 0)
            {
                double x = NormalDistributedRandom.NextDouble(random, Symbol.WeightManipulatorMu, Symbol.WeightManipulatorSigma);
                weight = weight + x * shakingFactor;
            }
            else
            {
                double x = NormalDistributedRandom.NextDouble(random, 1.0, Symbol.MultiplicativeWeightManipulatorSigma);
                weight = weight * x;
            }
#pragma warning disable 612, 618
            variableName = Symbol.VariableNames.SelectRandom(random);
#pragma warning restore 612, 618
        }
        private static IEnumerable <double> EvaluateModelWithReplacedVariable(IRegressionModel model, string variable, ModifiableDataset dataset, IEnumerable <int> rows, ReplacementMethodEnum replacement = ReplacementMethodEnum.Median)
        {
            var           originalValues = dataset.GetReadOnlyDoubleValues(variable).ToList();
            double        replacementValue;
            List <double> replacementValues;
            IRandom       rand;

            switch (replacement)
            {
            case ReplacementMethodEnum.Median:
                replacementValue  = rows.Select(r => originalValues[r]).Median();
                replacementValues = Enumerable.Repeat(replacementValue, dataset.Rows).ToList();
                break;

            case ReplacementMethodEnum.Average:
                replacementValue  = rows.Select(r => originalValues[r]).Average();
                replacementValues = Enumerable.Repeat(replacementValue, dataset.Rows).ToList();
                break;

            case ReplacementMethodEnum.Shuffle:
                // new var has same empirical distribution but the relation to y is broken
                rand = new FastRandom(31415);
                replacementValues = rows.Select(r => originalValues[r]).Shuffle(rand).ToList();
                break;

            case ReplacementMethodEnum.Noise:
                var avg    = rows.Select(r => originalValues[r]).Average();
                var stdDev = rows.Select(r => originalValues[r]).StandardDeviation();
                rand = new FastRandom(31415);
                replacementValues = rows.Select(_ => NormalDistributedRandom.NextDouble(rand, avg, stdDev)).ToList();
                break;

            default:
                throw new ArgumentException(string.Format("ReplacementMethod {0} cannot be handled.", replacement));
            }

            dataset.ReplaceVariable(variable, replacementValues);
            //mkommend: ToList is used on purpose to avoid lazy evaluation that could result in wrong estimates due to variable replacements
            var estimates = model.GetEstimatedValues(dataset, rows).ToList();

            dataset.ReplaceVariable(variable, originalValues);

            return(estimates);
        }
Ejemplo n.º 12
0
        private IEnumerable <double> SampleLinearFunction(IRandom rand, List <double>[] xs, out double[] relevance)
        {
            int nl    = xs.Length;
            int nRows = xs.First().Count;

            // sample standardized coefficients iid ~ N(0, 1)
            var c = Enumerable.Range(0, nRows).Select(_ => NormalDistributedRandom.NextDouble(rand, 0, 1)).ToArray();

            // calculate scaled coefficients (variables with large variance should have smaller coefficients)
            var scaledC = Enumerable.Range(0, nl)
                          .Select(i => c[i] / xs[i].StandardDeviationPop())
                          .ToArray();

            var y = EvaluteLinearModel(xs, scaledC);

            relevance = CalculateRelevance(y, xs, scaledC);

            return(y);
        }
        protected override List <List <double> > GenerateValues()
        {
            List <List <double> > data = new List <List <double> >();

            var nrand = new NormalDistributedRandom(random, 0, 1);

            for (int c = 0; c < numberOfFeatures; c++)
            {
                var datai = Enumerable.Range(0, TestPartitionEnd).Select(_ => nrand.NextDouble()).ToList();
                data.Add(datai);
            }
            var y = GenerateRandomFunction(random, data);

            var targetSigma = y.StandardDeviation();
            var noisePrng   = new NormalDistributedRandom(random, 0, targetSigma * Math.Sqrt(noiseRatio / (1.0 - noiseRatio)));

            data.Add(y.Select(t => t + noisePrng.NextDouble()).ToList());

            return(data);
        }
Ejemplo n.º 14
0
        protected override List <List <double> > GenerateValues()
        {
            var rand = new MersenneTwister((uint)Seed);

            List <List <double> > data = new List <List <double> >();
            var C_La   = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.4, 0.8).ToList();
            var a      = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 5.0, 10.0).ToList();
            var C_Ld_e = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.4, 0.8).ToList();
            var d_e    = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 5.0, 10.0).ToList();
            var S_HT   = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 1.5).ToList();
            var S_ref  = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 5.0, 7.0).ToList();

            var C_L       = new List <double>();
            var C_L_noise = new List <double>();

            data.Add(C_La);
            data.Add(a);
            data.Add(C_Ld_e);
            data.Add(d_e);
            data.Add(S_HT);
            data.Add(S_ref);
            data.Add(C_L);
            data.Add(C_L_noise);

            double a0 = -2.0;

            for (int i = 0; i < C_La.Count; i++)
            {
                double C_Li = C_La[i] * (a[i] - a0) + C_Ld_e[i] * d_e[i] * S_HT[i] / S_ref[i];
                C_L.Add(C_Li);
            }


            var sigma_noise = 0.05 * C_L.StandardDeviationPop();

            C_L_noise.AddRange(C_L.Select(md => md + NormalDistributedRandom.NextDouble(rand, 0, sigma_noise)));

            return(data);
        }
        /// <summary>
        /// Performs an adaptive normally distributed all position manipulation on the given
        /// <paramref name="vector"/>.
        /// </summary>
        /// <exception cref="InvalidOperationException">Thrown when the strategy vector is not
        /// as long as the vector to get manipulated.</exception>
        /// <param name="strategyParameters">The strategy vector determining the strength of the mutation.</param>
        /// <param name="random">A random number generator.</param>
        /// <param name="vector">The real vector to manipulate.</param>
        /// <returns>The manipulated real vector.</returns>
        public static void Apply(IRandom random, RealVector vector, RealVector strategyParameters)
        {
            NormalDistributedRandom N = new NormalDistributedRandom(random, 0.0, 1.0);

            if (strategyParameters != null)
            {
                for (int i = 0; i < vector.Length; i++)
                {
                    vector[i] = vector[i] + (N.NextDouble() * strategyParameters[i % strategyParameters.Length]);
                }
            }
            else
            {
                // BackwardsCompatibility3.3
                #region Backwards compatible region (remove with 3.4)
                // when upgrading to 3.4 remove the whole condition and just put the if-branch in place (you should then also throw an ArgumentException when strategyParameters is null or has length 0)
                for (int i = 0; i < vector.Length; i++)
                {
                    vector[i] = vector[i] + N.NextDouble();
                }
                #endregion
            }
        }
Ejemplo n.º 16
0
        protected override List <List <double> > GenerateValues()
        {
            List <List <double> > data = new List <List <double> >();

            for (int i = 0; i < AllowedInputVariables.Count(); i++)
            {
                data.Add(Enumerable.Range(0, TestPartitionEnd)
                         .Select(_ => xRandom.NextDouble())
                         .ToList());
            }

            var random           = new MersenneTwister();
            var selectedFeatures =
                Enumerable.Range(0, AllowedInputVariables.Count())
                .Where(_ => random.NextDouble() < selectionProbability)
                .ToArray();

            w = selectedFeatures.Select(_ => weightRandom.NextDouble()).ToArray();
            var target = new List <double>();

            for (int i = 0; i < data[0].Count; i++)
            {
                var s = selectedFeatures
                        .Select(index => data[index][i])
                        .ToArray();
                target.Add(ScalarProd(s, w));
            }
            var targetSigma = target.StandardDeviation();
            var noisePrng   = new NormalDistributedRandom(random, 0, targetSigma * Math.Sqrt(noiseRatio / (1.0 - noiseRatio)));

            data.Add(target.Select(t => t + noisePrng.NextDouble()).ToList());

            // set property listing the selected features as string[]
            this.selectedFeatures = selectedFeatures.Select(i => AllowedInputVariables[i]).ToArray();
            optimalRSquared       = 1 - noiseRatio;
            return(data);
        }
Ejemplo n.º 17
0
        protected override List <List <double> > GenerateValues()
        {
            var rand = new MersenneTwister((uint)Seed);

            List <List <double> > data = new List <List <double> >();
            var V_inf = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 60.0, 65.0).ToList();
            var th    = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 30.0, 40.0).ToList();
            var r     = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.5, 0.8).ToList();
            var R     = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.2, 0.5).ToList();
            var G     = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 5, 10).ToList();

            var Psi       = new List <double>();
            var Psi_noise = new List <double>();

            data.Add(V_inf);
            data.Add(th);
            data.Add(r);
            data.Add(R);
            data.Add(G);
            data.Add(Psi);
            data.Add(Psi_noise);

            for (int i = 0; i < V_inf.Count; i++)
            {
                var    th_rad = Math.PI * th[i] / 180.0;
                double Psi_i  = V_inf[i] * r[i] * Math.Sin(th_rad) * (1 - (R[i] * R[i]) / (r[i] * r[i])) +
                                (G[i] / (2 * Math.PI)) * Math.Log(r[i] / R[i]);
                Psi.Add(Psi_i);
            }

            var sigma_noise = 0.05 * Psi.StandardDeviationPop();

            Psi_noise.AddRange(Psi.Select(md => md + NormalDistributedRandom.NextDouble(rand, 0, sigma_noise)));

            return(data);
        }
Ejemplo n.º 18
0
        public override void ShakeLocalParameters(IRandom random, double shakingFactor)
        {
            base.ShakeLocalParameters(random, shakingFactor);

            // 50% additive & 50% multiplicative (TODO: BUG in if statement below -> fix in HL 4.0!)
            if (random.NextDouble() < 0)
            {
                double x = NormalDistributedRandom.NextDouble(random, Symbol.WeightManipulatorMu, Symbol.WeightManipulatorSigma);
                weight = weight + x * shakingFactor;
            }
            else
            {
                double x = NormalDistributedRandom.NextDouble(random, 1.0, Symbol.MultiplicativeWeightManipulatorSigma);
                weight = weight * x;
            }

            if (Symbol.VariableChangeProbability >= 1.0)
            {
                // old behaviour for backwards compatibility
                #region Backwards compatible code, remove with 3.4
#pragma warning disable 612, 618
                variableName = Symbol.VariableNames.SelectRandom(random);
#pragma warning restore 612, 618
                #endregion
            }
            else if (random.NextDouble() < Symbol.VariableChangeProbability)
            {
                var oldName = variableName;
                variableName = Symbol.VariableNames.SampleRandom(random);
                if (oldName != variableName)
                {
                    // re-initialize weight if the variable is changed
                    weight = NormalDistributedRandom.NextDouble(random, Symbol.WeightMu, Symbol.WeightSigma);
                }
            }
        }
Ejemplo n.º 19
0
        public override IOperation Apply()
        {
            var maxTries         = MaxTriesParameter.Value.Value;
            var truncateAtBounds = TruncateAtBoundsParameter.Value.Value;
            var random           = RandomParameter.ActualValue;
            var lambda           = PopulationSizeParameter.ActualValue.Value;
            var xmean            = MeanParameter.ActualValue;
            var arx               = RealVectorParameter.ActualValue;
            var sp                = StrategyParametersParameter.ActualValue;
            var iterations        = IterationsParameter.ActualValue.Value;
            var initialIterations = sp.InitialIterations;
            var bounds            = BoundsParameter.ActualValue;

            if (arx == null || arx.Length == 0)
            {
                arx = new ItemArray <RealVector>(lambda);
                for (int i = 0; i < lambda; i++)
                {
                    arx[i] = new RealVector(xmean.Length);
                }
                RealVectorParameter.ActualValue = arx;
            }
            var nd = new NormalDistributedRandom(random, 0, 1);

            var length = arx[0].Length;

            for (int i = 0; i < lambda; i++)
            {
                int  tries = 0;
                bool inRange;
                if (initialIterations > iterations)
                {
                    for (int k = 0; k < length; k++)
                    {
                        do
                        {
                            arx[i][k] = xmean[k] + sp.Sigma * sp.D[k] * nd.NextDouble();
                            inRange   = bounds[k % bounds.Rows, 0] <= arx[i][k] && arx[i][k] <= bounds[k % bounds.Rows, 1];
                            if (!inRange)
                            {
                                tries++;
                            }
                        } while (!inRange && tries < maxTries);
                        if (!inRange && truncateAtBounds)
                        {
                            if (bounds[k % bounds.Rows, 0] > arx[i][k])
                            {
                                arx[i][k] = bounds[k % bounds.Rows, 0];
                            }
                            else if (bounds[k % bounds.Rows, 1] < arx[i][k])
                            {
                                arx[i][k] = bounds[k % bounds.Rows, 1];
                            }
                        }
                    }
                }
                else
                {
                    var B = sp.B;
                    do
                    {
                        tries++;
                        inRange = true;
                        var artmp = new double[length];
                        for (int k = 0; k < length; ++k)
                        {
                            artmp[k] = sp.D[k] * nd.NextDouble();
                        }

                        for (int k = 0; k < length; k++)
                        {
                            var sum = 0.0;
                            for (int j = 0; j < length; j++)
                            {
                                sum += B[k, j] * artmp[j];
                            }
                            arx[i][k] = xmean[k] + sp.Sigma * sum; // m + sig * Normal(0,C)
                            if (bounds[k % bounds.Rows, 0] > arx[i][k] || arx[i][k] > bounds[k % bounds.Rows, 1])
                            {
                                inRange = false;
                            }
                        }
                    } while (!inRange && tries < maxTries);
                    if (!inRange && truncateAtBounds)
                    {
                        for (int k = 0; k < length; k++)
                        {
                            if (bounds[k % bounds.Rows, 0] > arx[i][k])
                            {
                                arx[i][k] = bounds[k % bounds.Rows, 0];
                            }
                            else if (bounds[k % bounds.Rows, 1] < arx[i][k])
                            {
                                arx[i][k] = bounds[k % bounds.Rows, 1];
                            }
                        }
                    }
                }
            }
            return(base.Apply());
        }
Ejemplo n.º 20
0
        /// <summary>
        /// Fits a model to the data by optimizing the numeric constants.
        /// Model is specified as infix expression containing variable names and numbers.
        /// The starting point for the numeric constants is initialized randomly if a random number generator is specified (~N(0,1)). Otherwise the user specified constants are
        /// used as a starting point.
        /// </summary>-
        /// <param name="problemData">Training and test data</param>
        /// <param name="modelStructure">The function as infix expression</param>
        /// <param name="maxIterations">Number of constant optimization iterations (using Levenberg-Marquardt algorithm)</param>
        /// <param name="random">Optional random number generator for random initialization of numeric constants.</param>
        /// <returns></returns>
        public static ISymbolicRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData, string modelStructure, int maxIterations, bool applyLinearScaling, IRandom rand = null)
        {
            var parser = new InfixExpressionParser();
            var tree   = parser.Parse(modelStructure);
            // parser handles double and string variables equally by creating a VariableTreeNode
            // post-process to replace VariableTreeNodes by FactorVariableTreeNodes for all string variables
            var factorSymbol = new FactorVariable();

            factorSymbol.VariableNames =
                problemData.AllowedInputVariables.Where(name => problemData.Dataset.VariableHasType <string>(name));
            factorSymbol.AllVariableNames = factorSymbol.VariableNames;
            factorSymbol.VariableValues   =
                factorSymbol.VariableNames.Select(name =>
                                                  new KeyValuePair <string, Dictionary <string, int> >(name,
                                                                                                       problemData.Dataset.GetReadOnlyStringValues(name).Distinct()
                                                                                                       .Select((n, i) => Tuple.Create(n, i))
                                                                                                       .ToDictionary(tup => tup.Item1, tup => tup.Item2)));

            foreach (var parent in tree.IterateNodesPrefix().ToArray())
            {
                for (int i = 0; i < parent.SubtreeCount; i++)
                {
                    var varChild       = parent.GetSubtree(i) as VariableTreeNode;
                    var factorVarChild = parent.GetSubtree(i) as FactorVariableTreeNode;
                    if (varChild != null && factorSymbol.VariableNames.Contains(varChild.VariableName))
                    {
                        parent.RemoveSubtree(i);
                        var factorTreeNode = (FactorVariableTreeNode)factorSymbol.CreateTreeNode();
                        factorTreeNode.VariableName = varChild.VariableName;
                        factorTreeNode.Weights      =
                            factorTreeNode.Symbol.GetVariableValues(factorTreeNode.VariableName).Select(_ => 1.0).ToArray();
                        // weight = 1.0 for each value
                        parent.InsertSubtree(i, factorTreeNode);
                    }
                    else if (factorVarChild != null && factorSymbol.VariableNames.Contains(factorVarChild.VariableName))
                    {
                        if (factorSymbol.GetVariableValues(factorVarChild.VariableName).Count() != factorVarChild.Weights.Length)
                        {
                            throw new ArgumentException(
                                      string.Format("Factor variable {0} needs exactly {1} weights",
                                                    factorVarChild.VariableName,
                                                    factorSymbol.GetVariableValues(factorVarChild.VariableName).Count()));
                        }
                        parent.RemoveSubtree(i);
                        var factorTreeNode = (FactorVariableTreeNode)factorSymbol.CreateTreeNode();
                        factorTreeNode.VariableName = factorVarChild.VariableName;
                        factorTreeNode.Weights      = factorVarChild.Weights;
                        parent.InsertSubtree(i, factorTreeNode);
                    }
                }
            }

            if (!SymbolicRegressionConstantOptimizationEvaluator.CanOptimizeConstants(tree))
            {
                throw new ArgumentException("The optimizer does not support the specified model structure.");
            }

            // initialize constants randomly
            if (rand != null)
            {
                foreach (var node in tree.IterateNodesPrefix().OfType <ConstantTreeNode>())
                {
                    double f = Math.Exp(NormalDistributedRandom.NextDouble(rand, 0, 1));
                    double s = rand.NextDouble() < 0.5 ? -1 : 1;
                    node.Value = s * node.Value * f;
                }
            }
            var interpreter = new SymbolicDataAnalysisExpressionTreeLinearInterpreter();

            SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(interpreter, tree, problemData, problemData.TrainingIndices,
                                                                              applyLinearScaling: applyLinearScaling, maxIterations: maxIterations,
                                                                              updateVariableWeights: false, updateConstantsInTree: true);

            var model = new SymbolicRegressionModel(problemData.TargetVariable, tree, (ISymbolicDataAnalysisExpressionTreeInterpreter)interpreter.Clone());

            if (applyLinearScaling)
            {
                model.Scale(problemData);
            }

            SymbolicRegressionSolution solution = new SymbolicRegressionSolution(model, (IRegressionProblemData)problemData.Clone());

            solution.Model.Name = "Regression Model";
            solution.Name       = "Regression Solution";
            return(solution);
        }
Ejemplo n.º 21
0
        protected override List <List <double> > GenerateValues()
        {
            // variable names are shuffled in the beginning (and sorted at the end)
            variableNames = variableNames.Shuffle(random).ToArray();

            // a third of all variables are independent vars
            List <List <double> > lvl0 = new List <List <double> >();
            int numLvl0 = (int)Math.Ceiling(numberOfFeatures * 0.33);

            List <string>   description   = new List <string>();   // store information how the variable is actually produced
            List <string[]> inputVarNames = new List <string[]>(); // store information to produce graphviz file
            List <double[]> relevances    = new List <double[]>(); // stores variable relevance information (same order as given in inputVarNames)

            var nrand = new NormalDistributedRandom(random, 0, 1);

            for (int c = 0; c < numLvl0; c++)
            {
                inputVarNames.Add(new string[] { });
                relevances.Add(new double[] { });
                description.Add(" ~ N(0, 1 + noiseLvl)");
                // use same generation procedure for all variables
                var x     = Enumerable.Range(0, TestPartitionEnd).Select(_ => nrand.NextDouble()).ToList();
                var sigma = x.StandardDeviationPop();
                var mean  = x.Average();
                for (int i = 0; i < x.Count; i++)
                {
                    x[i] = (x[i] - mean) / sigma;
                }
                var noisePrng = new NormalDistributedRandom(random, 0, Math.Sqrt(noiseRatio / (1.0 - noiseRatio)));
                lvl0.Add(x.Select(t => t + noisePrng.NextDouble()).ToList());
            }

            // lvl1 contains variables which are functions of vars in lvl0 (+ noise)
            int numLvl1 = (int)Math.Ceiling(numberOfFeatures * 0.33);
            List <List <double> > lvl1 = CreateVariables(lvl0, numLvl1, inputVarNames, description, relevances);

            // lvl2 contains variables which are functions of vars in lvl0 and lvl1 (+ noise)
            int numLvl2 = (int)Math.Ceiling(numberOfFeatures * 0.2);
            List <List <double> > lvl2 = CreateVariables(lvl0.Concat(lvl1).ToList(), numLvl2, inputVarNames, description, relevances);

            // lvl3 contains variables which are functions of vars in lvl0, lvl1 and lvl2 (+ noise)
            int numLvl3 = numberOfFeatures - numLvl0 - numLvl1 - numLvl2;
            List <List <double> > lvl3 = CreateVariables(lvl0.Concat(lvl1).Concat(lvl2).ToList(), numLvl3, inputVarNames, description, relevances);

            this.variableRelevances.Clear();
            for (int i = 0; i < variableNames.Length; i++)
            {
                var targetVarName        = variableNames[i];
                var targetRelevantInputs =
                    inputVarNames[i].Zip(relevances[i], (inputVar, rel) => new KeyValuePair <string, double>(inputVar, rel))
                    .ToArray();
                variableRelevances.Add(targetVarName, targetRelevantInputs);
            }

            networkDefinition = string.Join(Environment.NewLine, variableNames.Zip(description, (n, d) => n + d).OrderBy(x => x));
            // for graphviz
            networkDefinition += Environment.NewLine + "digraph G {";
            for (int i = 0; i < variableNames.Length; i++)
            {
                var name               = variableNames[i];
                var selectedVarNames   = inputVarNames[i];
                var selectedRelevances = relevances[i];
                for (int j = 0; j < selectedVarNames.Length; j++)
                {
                    var selectedVarName   = selectedVarNames[j];
                    var selectedRelevance = selectedRelevances[j];
                    networkDefinition += Environment.NewLine + selectedVarName + " -> " + name +
                                         string.Format(CultureInfo.InvariantCulture, " [label={0:N3}]", selectedRelevance);
                }
            }
            networkDefinition += Environment.NewLine + "}";

            // return a random permutation of all variables (to mix lvl0, lvl1, ... variables)
            var allVars     = lvl0.Concat(lvl1).Concat(lvl2).Concat(lvl3).ToList();
            var orderedVars = allVars.Zip(variableNames, Tuple.Create).OrderBy(t => t.Item2).Select(t => t.Item1).ToList();

            variableNames = variableNames.OrderBy(n => n).ToArray();
            return(orderedVars);
        }
Ejemplo n.º 22
0
        protected override List <List <double> > GenerateValues()
        {
            var rand = new MersenneTwister((uint)Seed);

            List <List <double> > data = new List <List <double> >();
            var x1 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.4, 0.8).ToList();

            var x2 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 3.0, 4.0).ToList();

            var x3 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 20.0, 30.0).ToList();

            var x4  = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 2.0, 5.0).ToList();
            var x13 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 2.0, 5.0).ToList();
            var x16 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 2.0, 5.0).ToList();


            // in the reference paper \Delta alpha_w/c is replaced by two variables x5*x6.
            var x5 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0, 20).ToList(); // range for X5 is not specified in the paper, we use [0°..20°] for ∆αW/c
            var x6 = Enumerable.Repeat(1.0, x5.Count).ToList();                                                      // range for X6 is not specified in the paper. In the maximum lift formular there is only a single variable ∆αW/c in place of x5*x6.

            var x7  = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.5, 1.5).ToList();
            var x10 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 0.5, 1.5).ToList();

            var x8  = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 1.5).ToList();
            var x11 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 1.5).ToList();

            var x9  = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 2.0).ToList();
            var x12 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 2.0).ToList();

            var x14 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 1.5).ToList();
            var x17 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 1.0, 1.5).ToList();

            var x15 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 5.0, 7.0).ToList();

            var x18 = ValueGenerator.GenerateUniformDistributedValues(rand.Next(), TestPartitionEnd, 10.0, 20.0).ToList();


            List <double> fx       = new List <double>();
            List <double> fx_noise = new List <double>();

            data.Add(x1);
            data.Add(x2);
            data.Add(x3);
            data.Add(x4);
            data.Add(x5);
            data.Add(x6);
            data.Add(x7);
            data.Add(x8);
            data.Add(x9);
            data.Add(x10);
            data.Add(x11);
            data.Add(x12);
            data.Add(x13);
            data.Add(x14);
            data.Add(x15);
            data.Add(x16);
            data.Add(x17);
            data.Add(x18);
            data.Add(fx);
            data.Add(fx_noise);

            for (int i = 0; i < x1.Count; i++)
            {
                double fxi = x1[i];
                fxi = fxi - 0.25 * x4[i] * x5[i] * x6[i] * (4 + 0.1 * (x2[i] / x3[i]) - (x2[i] / x3[i]) * (x2[i] / x3[i]));
                fxi = fxi + x13[i] * (x14[i] / x15[i]) * x18[i] * x7[i];
                fxi = fxi - x13[i] * (x14[i] / x15[i]) * x8[i];
                fxi = fxi + x13[i] * (x14[i] / x15[i]) * x9[i];
                fxi = fxi + x16[i] * (x17[i] / x15[i]) * x18[i] * x10[i];
                fxi = fxi - x16[i] * (x17[i] / x15[i]) * x11[i];
                fxi = fxi + x16[i] * (x17[i] / x15[i]) * x12[i];

                fx.Add(fxi);
            }

            var sigma_noise = 0.05 * fx.StandardDeviationPop();

            fx_noise.AddRange(fx.Select(fxi => fxi + NormalDistributedRandom.NextDouble(rand, 0, sigma_noise)));

            return(data);
        }
Ejemplo n.º 23
0
        protected override List <List <double> > GenerateValues()
        {
            // variable names are shuffled in the beginning (and sorted at the end)
            variableNames = variableNames.Shuffle(random).ToArray();

            // a third of all variables are independent vars
            List <List <double> > lvl0 = new List <List <double> >();
            int numLvl0 = (int)Math.Ceiling(numberOfFeatures * 0.33);

            List <string>   description   = new List <string>();   // store information how the variable is actually produced
            List <string[]> inputVarNames = new List <string[]>(); // store information to produce graphviz file

            var nrand = new NormalDistributedRandom(random, 0, 1);

            for (int c = 0; c < numLvl0; c++)
            {
                var datai = Enumerable.Range(0, TestPartitionEnd).Select(_ => nrand.NextDouble()).ToList();
                inputVarNames.Add(new string[] { });
                description.Add("~ N(0, 1)");
                lvl0.Add(datai);
            }

            // lvl1 contains variables which are functions of vars in lvl0 (+ noise)
            List <List <double> > lvl1 = new List <List <double> >();
            int numLvl1 = (int)Math.Ceiling(numberOfFeatures * 0.33);

            for (int c = 0; c < numLvl1; c++)
            {
                string[] selectedVarNames;
                var      x         = GenerateRandomFunction(random, lvl0, out selectedVarNames);
                var      sigma     = x.StandardDeviation();
                var      noisePrng = new NormalDistributedRandom(random, 0, sigma * Math.Sqrt(noiseRatio / (1.0 - noiseRatio)));
                lvl1.Add(x.Select(t => t + noisePrng.NextDouble()).ToList());

                inputVarNames.Add(selectedVarNames);
                var desc = string.Format("f({0})", string.Join(",", selectedVarNames));
                description.Add(string.Format(" ~ N({0}, {1:N3})", desc, noisePrng.Sigma));
            }

            // lvl2 contains variables which are functions of vars in lvl0 and lvl1 (+ noise)
            List <List <double> > lvl2 = new List <List <double> >();
            int numLvl2 = (int)Math.Ceiling(numberOfFeatures * 0.2);

            for (int c = 0; c < numLvl2; c++)
            {
                string[] selectedVarNames;
                var      x         = GenerateRandomFunction(random, lvl0.Concat(lvl1).ToList(), out selectedVarNames);
                var      sigma     = x.StandardDeviation();
                var      noisePrng = new NormalDistributedRandom(random, 0, sigma * Math.Sqrt(noiseRatio / (1.0 - noiseRatio)));
                lvl2.Add(x.Select(t => t + noisePrng.NextDouble()).ToList());

                inputVarNames.Add(selectedVarNames);
                var desc = string.Format("f({0})", string.Join(",", selectedVarNames));
                description.Add(string.Format(" ~ N({0}, {1:N3})", desc, noisePrng.Sigma));
            }

            // lvl3 contains variables which are functions of vars in lvl0, lvl1 and lvl2 (+ noise)
            List <List <double> > lvl3 = new List <List <double> >();
            int numLvl3 = numberOfFeatures - numLvl0 - numLvl1 - numLvl2;

            for (int c = 0; c < numLvl3; c++)
            {
                string[] selectedVarNames;
                var      x         = GenerateRandomFunction(random, lvl0.Concat(lvl1).Concat(lvl2).ToList(), out selectedVarNames);
                var      sigma     = x.StandardDeviation();
                var      noisePrng = new NormalDistributedRandom(random, 0, sigma * Math.Sqrt(noiseRatio / (1.0 - noiseRatio)));
                lvl3.Add(x.Select(t => t + noisePrng.NextDouble()).ToList());

                inputVarNames.Add(selectedVarNames);
                var desc = string.Format("f({0})", string.Join(",", selectedVarNames));
                description.Add(string.Format(" ~ N({0}, {1:N3})", desc, noisePrng.Sigma));
            }

            networkDefinition = string.Join(Environment.NewLine, variableNames.Zip(description, (n, d) => n + d));
            // for graphviz
            networkDefinition += Environment.NewLine + "digraph G {";
            foreach (var t in variableNames.Zip(inputVarNames, Tuple.Create).OrderBy(t => t.Item1))
            {
                var name             = t.Item1;
                var selectedVarNames = t.Item2;
                foreach (var selectedVarName in selectedVarNames)
                {
                    networkDefinition += Environment.NewLine + selectedVarName + " -> " + name;
                }
            }
            networkDefinition += Environment.NewLine + "}";

            // return a random permutation of all variables
            var allVars     = lvl0.Concat(lvl1).Concat(lvl2).Concat(lvl3).ToList();
            var orderedVars = allVars.Zip(variableNames, Tuple.Create).OrderBy(t => t.Item2).Select(t => t.Item1).ToList();

            variableNames = variableNames.OrderBy(n => n).ToArray();
            return(orderedVars);
        }
Ejemplo n.º 24
0
            public TSNEState(IReadOnlyList <T> data, IDistance <T> distance, IRandom random, int newDimensions, double perplexity,
                             double theta, int stopLyingIter, int momSwitchIter, double momentum, double finalMomentum, double eta, bool randomInit)
            {
                this.distance      = distance;
                this.random        = random;
                this.newDimensions = newDimensions;
                this.perplexity    = perplexity;
                this.theta         = theta;
                this.stopLyingIter = stopLyingIter;
                this.momSwitchIter = momSwitchIter;
                currentMomentum    = momentum;
                this.finalMomentum = finalMomentum;
                this.eta           = eta;

                // initialize
                noDatapoints = data.Count;
                if (noDatapoints - 1 < 3 * perplexity)
                {
                    throw new ArgumentException("Perplexity too large for the number of data points!");
                }

                exact   = Math.Abs(theta) < double.Epsilon;
                newData = new double[noDatapoints, newDimensions];
                dY      = new double[noDatapoints, newDimensions];
                uY      = new double[noDatapoints, newDimensions];
                gains   = new double[noDatapoints, newDimensions];
                for (var i = 0; i < noDatapoints; i++)
                {
                    for (var j = 0; j < newDimensions; j++)
                    {
                        gains[i, j] = 1.0;
                    }
                }

                p    = null;
                rowP = null;
                colP = null;
                valP = null;

                //Calculate Similarities
                if (exact)
                {
                    p = CalculateExactSimilarites(data, distance, perplexity);
                }
                else
                {
                    CalculateApproximateSimilarities(data, distance, perplexity, out rowP, out colP, out valP);
                }

                // Lie about the P-values (factor is 4 in the MATLAB implementation)
                if (exact)
                {
                    for (var i = 0; i < noDatapoints; i++)
                    {
                        for (var j = 0; j < noDatapoints; j++)
                        {
                            p[i, j] *= 12.0;
                        }
                    }
                }
                else
                {
                    for (var i = 0; i < rowP[noDatapoints]; i++)
                    {
                        valP[i] *= 12.0;
                    }
                }

                // Initialize solution (randomly)
                var rand = new NormalDistributedRandom(random, 0, 1);

                for (var i = 0; i < noDatapoints; i++)
                {
                    for (var j = 0; j < newDimensions; j++)
                    {
                        newData[i, j] = rand.NextDouble() * .0001;
                    }
                }

                if (!(data[0] is IReadOnlyList <double>) || randomInit)
                {
                    return;
                }
                for (var i = 0; i < noDatapoints; i++)
                {
                    for (var j = 0; j < newDimensions; j++)
                    {
                        var row = (IReadOnlyList <double>)data[i];
                        newData[i, j] = row[j % row.Count];
                    }
                }
            }