/// <summary> /// Estimate appropriate values for sigma given a data set. /// </summary> /// /// <remarks> /// This method uses a simple heuristic to obtain appropriate values /// for sigma in a radial basis function kernel. The heuristic is shown /// by Caputo, Sim, Furesjo and Smola, "Appearance-based object /// recognition using SVMs: which kernel should I use?", 2002. /// </remarks> /// /// <param name="inputs">The data set.</param> /// <param name="samples">The number of random samples to analyze.</param> /// <param name="range">The range of suitable values for sigma.</param> /// /// <returns>A Laplacian kernel initialized with an appropriate sigma value.</returns> /// public static SparseLaplacian Estimate(double[][] inputs, int samples, out DoubleRange range) { if (samples > inputs.Length) { throw new ArgumentOutOfRangeException("samples"); } double[] distances = Gaussian.Distances(inputs, samples); double q1 = distances[(int)Math.Ceiling(0.15 * distances.Length)]; double q9 = distances[(int)Math.Ceiling(0.85 * distances.Length)]; double qm = distances.Median(alreadySorted: true); range = new DoubleRange(q1, q9); return(new SparseLaplacian(sigma: qm)); }
public void estimate_gaussian_distances() { Accord.Math.Random.Generator.Seed = 0; double[][] data = { new double[] { 5.1, 3.5, 1.4, 0.2 }, new double[] { 5.0, 3.6, 1.4, 0.2 }, new double[] { 4.9, 3.0, 1.4, 0.2 }, new double[] { 5.8, 4.0, 1.2, 0.2 }, new double[] { 4.7, 3.2, 1.3, 0.2 }, }; var actual = Gaussian.Distances(data, 2); Assert.IsTrue(actual.IsSorted()); Assert.AreEqual(0.95, actual.Mean(), 1e-5); actual = Gaussian.Distances(data, data.Length); Assert.IsTrue(actual.IsSorted()); Assert.AreEqual(0.5296, actual.Mean(), 1e-5); Assert.Throws <ArgumentOutOfRangeException>(() => Gaussian.Distances(data, 10)); }