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()); }
} //обучение public double getRegressionError(DenseVector Y, double error) { double averageError = Y.Subtract(Y.Average()).PointwisePower(2).Sum(); return(1 - (error / averageError)); }
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)); }