예제 #1
0
        private double AnswerTestSet()
        {
            foreach (Pattern p in testSet.EnumeratePatterns())
            {
                p.NetworkAnswer = network.ComputeOutput(p.Input);
            }

            double mseSum = 0.0;

            foreach (Pattern p in testSet.EnumeratePatterns())
            {
                double vectorMSE = 0.0;
                for (int i = 0; i < testSet.Extremums.OutputExtremums.Count; i++)
                {
                    DataExtremum extr        = testSet.Extremums.OutputExtremums[i];
                    double       denormAns   = extr.Normalizor.NormalizeBack(p.NetworkAnswer[i]);
                    double       denormIdeal = extr.Normalizor.NormalizeBack(p.IdealOutput[i]);
                    vectorMSE += (denormAns - denormIdeal) * (denormAns - denormIdeal);
                }

                mseSum += vectorMSE / testSet.Extremums.OutputExtremums.Count;
            }

//            double min;
//           double max;
//            Normalizor.GetMinMaxActivationWithMargin(network.Activation.MinValue, network.Activation.MaxValue, out min, out max);
            return(MSECalculator.CalculateEpochMSEDenormalized(mseSum, testSet.PatternCount));
        }
        public PlotModel Build1DRegressionModel(IDataSet trainingSet, IDataSet testSet, bool plotAgainstInput) // if plotAgainstInput is true, use input as X axis, not time
        {
            List <RegressionPoint> trainPoints     = new List <RegressionPoint>();
            List <RegressionPoint> testIdealPoints = new List <RegressionPoint>();
            List <RegressionPoint> networkAnswers  = new List <RegressionPoint>();
            Func <Pattern, double> patternToDouble;

            if (plotAgainstInput)
            {
                patternToDouble = p => p.Input[0];
            }
            else
            {
                patternToDouble = p => p.TimeIndex;
            }

            foreach (Pattern p in trainingSet.EnumeratePatterns())
            {
                trainPoints.Add(new RegressionPoint(patternToDouble(p), p.IdealOutput.At(0)));
            }

            foreach (Pattern p in testSet.EnumeratePatterns())
            {
                testIdealPoints.Add(new RegressionPoint(patternToDouble(p), p.IdealOutput.At(0)));
                networkAnswers.Add(new RegressionPoint(patternToDouble(p), p.NetworkAnswer.At(0)));
            }

            PlotModel regressionPlotModel = SetUpModel(trainPoints, testIdealPoints, networkAnswers);

            return(regressionPlotModel);
        }
예제 #3
0
        protected virtual double CalculateMSEError(INetwork network, IDataSet dataSet)
        {
            double mseSum = 0.0;

            foreach (Pattern p in dataSet.EnumeratePatterns())
            {
                mseSum += MSECalculator.CalculateRawMSE(p.IdealOutput - network.ComputeOutput(p.Input));
            }

            double min;
            double max;

            Normalizor.GetMinMaxActivationWithMargin(network.Activation.MinValue, network.Activation.MaxValue, out min, out max);
            return(MSECalculator.CalculateEpochMSE(mseSum, dataSet.PatternCount, min, max));
        }
예제 #4
0
        public static void Run(IDataSet set, int destinationInputLenght, double minTo, double maxTo)
        {
            // Preprocessing
            if (set == null ||
                set.EnumeratePatterns().First() == null ||
                set.EnumeratePatterns().First().Input == null)
            {
                throw new ArgumentException();
            }

            int inputLenght = set.EnumeratePatterns().First().Input.Count;

            if (destinationInputLenght >= inputLenght)
            {
                return;
            }

            // Calculating matrix R
            Matrix <double> R = new DenseMatrix(inputLenght, inputLenght);

            foreach (var pattern in set.EnumeratePatterns())
            {
                R += pattern.Input.OuterProduct(pattern.Input);
            }
            R /= set.PatternCount;

            // QR decomposition
            var qr = R.QR(QRMethod.Full);

            // Calculating eigenvectors and eigenvalues
            var eigens   = new List <Eigen>();
            var diagonal = qr.Q.Inverse() * R * qr.Q;

            for (int i = 0; i < inputLenght; i++)
            {
                eigens.Add(new Eigen
                {
                    Vector = qr.Q.Column(i),
                    Value  = diagonal[i, i],
                });
            }

            //TestEigenValues(eigens, R, inputLenght);

            // Selecting eigenvectors with the biggest eigenvalues
            var pcaColumns = eigens
                             .OrderByDescending(x => x.Value)
                             .Take(destinationInputLenght)
                             .Select(x => x.Vector)
                             .ToList();

            // Creating transform matrix
            Matrix <double> pcaTransform = new DenseMatrix(inputLenght, destinationInputLenght);

            for (int i = 0; i < destinationInputLenght; i++)
            {
                pcaTransform.SetColumn(i, pcaColumns[i]);
            }

            // Transforming input vectors
            double maxFrom = Double.MinValue;
            double minFrom = Double.MaxValue;

            foreach (var pattern in set.EnumeratePatterns())
            {
                pattern.Input = pattern.Input * pcaTransform;

                maxFrom = Math.Max(maxFrom, pattern.Input.Maximum());
                minFrom = Math.Min(minFrom, pattern.Input.Minimum());
            }

            // Normalization
            var norm = new Normalizor(minFrom, maxFrom, minTo, maxTo);

            foreach (var pattern in set.EnumeratePatterns())
            {
                pattern.Input.MapInplace(norm.Normalize);
            }
        }