예제 #1
0
        /// <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));
        }
예제 #2
0
        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));
        }