예제 #1
0
        public void doc_mahalanobis()
        {
            #region doc_mahalanobis_3
            // Let's say we would like to compute the Mahalanobis
            // distance between the two vectors x and y below:
            double[] x = { 2, 5, 1 };
            double[] y = { 4, 2, 2 };

            // Using the covariance
            double[,] covariance =
            {
                { 4, 3, 0 },
                { 3, 5, 2 },
                { 0, 2, 6 }
            };

            // There are multiple ways to create a Mahalanobis
            // distance. The easiest method by far is by using:
            var mahalanobis = Mahalanobis.FromCovarianceMatrix(covariance);

            // Then, you can compute the distance using:
            double distance = mahalanobis.Distance(x, y);

            // However, if you need more control over how the covariance matrix
            // should be inverted, or if you have the precision matrix instead of
            // the covariance, you can use any of the alternative methods:

            var fromCholesky   = new Mahalanobis(new CholeskyDecomposition(covariance));
            var fromSVD        = new Mahalanobis(new SingularValueDecomposition(covariance));
            var fromPrecision1 = new Mahalanobis(covariance.Inverse());
            var fromPrecision2 = Mahalanobis.FromPrecisionMatrix(covariance.Inverse());

            // They all should produce equivalent results:
            double a = fromCholesky.Distance(x, y);
            double b = fromSVD.Distance(x, y);
            double c = fromPrecision1.Distance(x, y);
            double d = fromPrecision2.Distance(x, y);
            #endregion

            double expected = Distance.Mahalanobis(x, y, new CholeskyDecomposition(covariance));
            Assert.AreEqual(3.5185224171518357, expected, 1e-10);
            Assert.AreEqual(expected, distance, 1e-10);
            Assert.AreEqual(distance, a, 1e-10);
            Assert.AreEqual(distance, b, 1e-10);
            Assert.AreEqual(distance, c, 1e-10);
            Assert.AreEqual(distance, d, 1e-10);
        }
예제 #2
0
파일: Operator.cs 프로젝트: kucharz96/SWD
        public static double MahalanobisMetrics(int row, int rowToCount)
        {
            var columns = GetColumnsWithoutLast();

            if (InverseCovarianceMatrix == null)
            {
                var matrix = new double[Dt.Rows.Count, columns.Count];

                for (int rowC = 0; rowC < Dt.Rows.Count; rowC++)
                {
                    for (int colC = 0; colC < columns.Count; colC++)
                    {
                        matrix[rowC, colC] = Convert.ToDouble(Dt.Rows[rowC][colC]);
                    }
                }
                var covarianceMatrix = matrix.Covariance();

                try
                {
                    InverseCovarianceMatrix = covarianceMatrix.Inverse();
                }
                catch
                {
                    InverseCovarianceMatrix = covarianceMatrix.PseudoInverse();
                }
            }



            double[] xValues = new double[columns.Count];
            double[] yValues = new double[columns.Count];
            for (int a = 0; a < columns.Count; a++)
            {
                double x = Convert.ToDouble(Dt.Rows[row][a]);
                double y = Convert.ToDouble(Dt.Rows[rowToCount][a]);
                xValues[a] = x;
                yValues[a] = y;
            }



            return(Mahalanobis.FromPrecisionMatrix(InverseCovarianceMatrix).Distance(xValues, yValues));
        }
예제 #3
0
        private double[,] mahalanobisMethod()
        {
            var mainWindow = (MainWindow)Application.Current.MainWindow;
            var format     = new NumberFormatInfo();

            format.NegativeSign = "-";
            int i = 0;

            double[,] distances = new double[mainWindow.gridData.Rows.Count, mainWindow.gridData.Rows.Count];

            double[,] table = new double[mainWindow.gridData.Rows.Count, mainWindow.gridData.Columns.Count - 1];
            //double[,] table = new double[5,3];
            //table[0, 0] = 64;
            //table[0, 1] = 580;
            //table[0, 2] = 29;
            //table[1, 0] = 66;
            //table[1, 1] = 570;
            //table[1, 2] = 33;
            //table[2, 0] = 68;
            //table[2, 1] = 590;
            //table[2, 2] = 37;
            //table[3, 0] = 69;
            //table[3, 1] = 660;
            //table[3, 2] = 46;
            //table[4, 0] = 73;
            //table[4, 1] = 600;
            //table[4, 2] = 55;

            foreach (DataRow row in mainWindow.gridData.Rows)
            {
                for (int j = 0; j < mainWindow.gridData.Columns.Count - 1; j++)
                {
                    var value = mainWindow.gridData.Rows[i][j].ToString();
                    if (value.StartsWith(",") || value.StartsWith("."))
                    {
                        value = "0" + value;
                    }
                    table[i, j] = Convert.ToDouble(value, format);
                }

                i++;
            }

            double[] d = new double[mainWindow.gridData.Columns.Count - 1];
            double[,] diff               = new double[1, mainWindow.gridData.Columns.Count - 1];
            double[,] diffT              = null;
            double[,] covarMatrix        = table.Covariance();
            double[,] inverseCovarMatrix = null;
            double[,] tmp         = null;
            double[,] squaredDist = null;

            try
            {
                inverseCovarMatrix = covarMatrix.Inverse();
            }
            catch (Exception exp)
            {
                inverseCovarMatrix = covarMatrix.PseudoInverse();
            }

            var mahalanobis = Mahalanobis.FromPrecisionMatrix(inverseCovarMatrix);

            List <double> X = new List <double>();
            List <double> Y = new List <double>();

            for (int k = 0; k < mainWindow.gridData.Rows.Count; k++)
            {
                for (int n = 0; n < mainWindow.gridData.Rows.Count; n++)
                {
                    if (k == n)
                    {
                        distances[k, n] = 0;
                    }
                    else
                    {
                        X.Clear();
                        Y.Clear();
                        for (int j = 0; j < mainWindow.gridData.Columns.Count - 1; j++)
                        {
                            var valueK = mainWindow.gridData.Rows[k][j].ToString();
                            if (valueK.StartsWith(",") || valueK.StartsWith("."))
                            {
                                valueK = "0" + valueK;
                            }

                            var valueN = mainWindow.gridData.Rows[n][j].ToString();
                            if (valueN.StartsWith(",") || valueN.StartsWith("."))
                            {
                                valueN = "0" + valueN;
                            }
                            //d[j] = Convert.ToDouble(valueK, format) - Convert.ToDouble(valueN, format);
                            // diff[0, j] = d[j];
                            X.Add(Convert.ToDouble(valueK, format));
                            Y.Add(Convert.ToDouble(valueN, format));
                        }

                        //diffT = Transpose(diff);
                        // covarMatrix = table.Covariance();
                        //try
                        //{
                        //    inverseCovarMatrix = covarMatrix.Inverse();
                        //}
                        //catch(Exception exp)
                        //{
                        //    inverseCovarMatrix = covarMatrix.PseudoInverse();
                        //}

                        //var mahalanobis = Mahalanobis.FromPrecisionMatrix(inverseCovarMatrix);
                        double result = mahalanobis.Distance(X.ToArray(), Y.ToArray());
                        //tmp = MultiplyMatrix(diff, inverseCovarMatrix);
                        //squaredDist = MultiplyMatrix(tmp, diffT);
                        //double result = Math.Sqrt(squaredDist[0, 0]);
                        if (Double.IsNaN(result))
                        {
                            distances[k, n] = 0;
                        }
                        else
                        {
                            distances[k, n] = result;
                        }
                    }
                }
            }

            return(distances);
        }
예제 #4
0
        public KAverageWindow()
        {
            InitializeComponent();
            mainWindow = (MainWindow)Application.Current.MainWindow;

            metrics = new List <string>()
            {
                "metryka euklidesowa",
                "metryka Manhattan",
                "metryka Czebyszewa",
                "metryka Mahalanobisa"
            };

            metricsComboBox.ItemsSource = metrics;
            distinctClasses             = (from row in mainWindow.gridData.AsEnumerable()
                                           select row.Field <string>(mainWindow.gridData.Columns[mainWindow.gridData.Columns.Count - 1].ColumnName)).Distinct().ToList();

            copiedTable = mainWindow.gridData.Copy();
            copiedTable.Columns.RemoveAt(copiedTable.Columns.Count - 1);

            for (int z = 0; z < copiedTable.Rows.Count; z++)
            {
                var newRow = tableWithNewColumns.NewRow();
                tableWithNewColumns.Rows.Add(newRow);
            }



            //var mainWindow = (MainWindow)Application.Current.MainWindow;
            var format = new NumberFormatInfo();

            format.NegativeSign = "-";
            int i = 0;

            double[,] table = new double[mainWindow.gridData.Rows.Count, mainWindow.gridData.Columns.Count - 1];


            foreach (DataRow row in mainWindow.gridData.Rows)
            {
                for (int j = 0; j < mainWindow.gridData.Columns.Count - 1; j++)
                {
                    var value = mainWindow.gridData.Rows[i][j].ToString();
                    if (value.StartsWith(",") || value.StartsWith("."))
                    {
                        value = "0" + value;
                    }
                    table[i, j] = Convert.ToDouble(value, format);
                }

                i++;
            }

            double[] d = new double[mainWindow.gridData.Columns.Count - 1];
            double[,] diff               = new double[1, mainWindow.gridData.Columns.Count - 1];
            double[,] covarMatrix        = table.Covariance();
            double[,] inverseCovarMatrix = null;

            try
            {
                inverseCovarMatrix = covarMatrix.Inverse();
            }
            catch (Exception exp)
            {
                inverseCovarMatrix = covarMatrix.PseudoInverse();
            }

            mahalanobis = Mahalanobis.FromPrecisionMatrix(inverseCovarMatrix);
        }