Exemplo n.º 1
0
        /// <summary>
        /// Generates the coordinates of a point within an ellipsoid.
        /// https://blogs.sas.com/content/iml/2016/04/06/generate-points-uniformly-in-ball.html
        /// </summary>
        /// <param name="gauss"> Std Normal Dist for generating samples; </param>
        /// <param name="conditionalR"> Maximum ellipsoid radius across certain axis; </param>
        private static float[] SampleWithinEllipsoid(
            NormalDistribution gauss,
            double[] conditionalR,
            int featureDim,
            float[,] clustersCentroids,
            int clusterIndex)
        {
            var y   = gauss.GenerateSample(featureDim);
            var yl2 = y.L2Norm();
            var u   = Random.NextDouble();
            var udr = new double[conditionalR.Length];

            for (var i = 0; i < udr.Length; i++)
            {
                udr[i] = Math.Pow(u, 1.0 / y.Length) * conditionalR[i];
            }

            for (var i = 0; i < y.Length; i++)
            {
                var c = clustersCentroids[clusterIndex, i];
                y[i] = c + (float)(udr[i] * (y[i] / yl2));
            }

            return(y);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Generates the coordinates of a point within a sphere.
        /// https://blogs.sas.com/content/iml/2016/04/06/generate-points-uniformly-in-ball.html
        /// </summary>
        /// <param name="gauss"> Std Normal Dist for generating samples; </param>
        /// <param name="r"> Sphere Radius; </param>
        private static float[] SampleWithinSphere(
            NormalDistribution gauss,
            double r,
            int featureDim,
            float[,] clustersCentroids,
            int clusterIndex)
        {
            var y   = gauss.GenerateSample(featureDim);
            var yl2 = y.L2Norm();
            var u   = Random.NextDouble();
            var udr = Math.Pow(u, 1.0 / y.Length) * r;

            for (var i = 0; i < y.Length; i++)
            {
                var c = clustersCentroids[clusterIndex, i];
                y[i] = (float)(udr * (y[i] / yl2));
            }

            return(y);
        }