Exemple #1
0
        public void TestRandomizeSeemsToHaveMean0()
        {
            int             count = 100000;
            Vector <double> vec   = new DenseVector(count);

            for (int i = 0; i < count; i++)
            {
                vec[i] = MathHelper.RandomExceptZero(1, 0.2);
            }

            Assert.AreEqual(0, vec.Average(), 0.004);
        }
        /// <summary>
        /// Tests the network over a given test dataset. Returns the error ( sum(|a - y(x)|^2)/n ). The out param will count the data that was correctly categorized using a given function.
        /// </summary>
        private static double TestNetwork(DeepNeuralNetwork nn, int testingDataSetSize, GetNextDataDelegate getNextData, out int correctCount, CheckIfCorrectDelegate checkCorrect)
        {
            correctCount = 0;
            Vector <double> error = new DenseVector(nn.OutputLayer.GetNeuronCount());

            for (int i = 0; i < testingDataSetSize; ++i)
            {
                LabeledData     labeledData = getNextData(i);
                Vector <double> result      = nn.ProcessInput(labeledData.InputValues);
                if (checkCorrect(result.AsArray(), labeledData.OutputValues.AsArray()))
                {
                    ++correctCount;
                }
                Vector <double> diff = labeledData.OutputValues - result;
                error += diff.PointwiseMultiply(diff);
            }
            error = error.Divide(testingDataSetSize);
            return(error.Average());
        }
Exemple #3
0
        } //обучение

        public double getRegressionError(DenseVector Y, double error)
        {
            double averageError = Y.Subtract(Y.Average()).PointwisePower(2).Sum();

            return(1 - (error / averageError));
        }
Exemple #4
0
        public static RBFNetSolution SolveOLS(List <Vec> xs, List <double> ys, double tolerance, double spread, Func <bool> cancelled = null)
        {
            Func <Vec, Vec, double> phi = (x, c) => Phi(x, c, spread);
            var maxCenters = (int)Math.Min(xs.Count, Math.Max(1, 4 * Math.Sqrt(xs.Count)));
            var centers    = new List <Vec>(xs);
            var n          = xs.Count;
            var m          = centers.Count;

            Mat P = new DenseMatrix(n, m);

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    P[i, j] = phi(xs[i], centers[j]);
                }
            }

            Vec dOrig = new DenseVector(ys.ToArray());
            Vec d     = dOrig.Subtract(dOrig.Average());
            Vec dNorm = d.Normalize(2);

            var    candidateBases = centers.Zip(P.Columns(), (ci, pi) => new { Center = ci, Basis = pi }).ToList();
            var    selectedBases  = candidateBases.Select(cb => new { Center = cb.Center, Basis = cb.Basis, OrthoBasis = cb.Basis }).Take(0).ToList();
            double qualityTotal   = 0;

            var context = QMCreateOrthoContext(n, m);
            var iters   = m;

            for (int k = 0; k < iters; k++)
            {
                int      stride = n;
                double[] selectedOrthonormalBases = new double[selectedBases.Count * stride];
                for (int ptr = 0, sb = 0; sb < selectedBases.Count; ptr += stride, sb++)
                {
                    Array.Copy(selectedBases[sb].OrthoBasis.ToArray(), 0, selectedOrthonormalBases, ptr, stride);
                }

                var best = candidateBases.Select(cb => {
                    var pi = cb.Basis;
                    Vec w;
                    if (!selectedBases.Any())
                    {
                        w = pi.Normalize(2);
                    }
                    else
                    {
                        double[] result = new double[pi.Count];
                        double[] pis    = pi.ToList().ToArray();
                        double[] sobs   = selectedOrthonormalBases.ToList().ToArray();
                        QMOrthogonalize(context, pis, selectedBases.Count, sobs);
                        w = new DenseVector(pis.ToList().ToArray());
                    }
                    //Vec wCheck = Orthogonalize(pi, selectedBases.Select(b => b.OrthoBasis).ToList()).Normalize(2);
                    //var w = wCheck;
                    //Debug.Assert(w.Subtract(wCheck).Norm(2) < 0.0001);
                    var err = Math.Pow(w.DotProduct(dNorm), 2);
                    return(new { Center = cb.Center, OrthoBasis = w, Quality = err, Candidate = cb });
                }).OrderByDescending(q => q.Quality).First();
                candidateBases.Remove(best.Candidate);
                selectedBases.Add(new { Center = best.Center, Basis = best.Candidate.Basis, OrthoBasis = best.OrthoBasis });
                qualityTotal += best.Quality;
                if (1 - qualityTotal < tolerance || (cancelled != null && cancelled()))
                {
                    break;
                }
            }
            QMDestroyOrthoContext(context);

            //Trace.WriteLine(string.Format("Centers: {0}, Spread: {1}, Tolerance: {2}", selectedBases.Count, spread, tolerance));

            var weights = SolveLS(
                new Vec[] { DenseVector.Create(n, _ => 1) }.Concat(selectedBases.Select(sb => sb.Basis)).ColumnsToMatrix(),
                new DenseVector(ys.ToArray()));
            bool isDegenerate = false;

            if (weights.Any(w => double.IsNaN(w)))
            {
                Trace.WriteLine("! Degenerate RBF network !");
                isDegenerate = true;
            }
            var allBases = selectedBases.ToList();

            allBases.Insert(0, null);
            var resultBases = allBases.Zip(weights, (b, w) => new RadialBasis(b != null ? b.Center : null, w)).ToList();

            return(new RBFNetSolution(resultBases, spread, isDegenerate));
        }