2012-06-14 2 views
1

Я пытаюсь вычислить расстояние mahalanobis с C#. Я не могу найти реальных примеров онлайн, и я новичок в C#. У меня особенно возникают проблемы с тем, чтобы матрица ковариации работала правильно. Любая помощь будет оценена по достоинству. Благодаря!Расчет расстояния Махаланобиса с помощью C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using MathNet.Numerics.LinearAlgebra.Double; 

namespace MahalanobisDistance 
{ 
    class Program 
{ 

    static void Main(string[] args) 
    { 
     Program p = new Program(); 
     DenseVector vector1 = new DenseVector(4); 
     DenseVector vector2 = new DenseVector(4); 
     DenseMatrix matrix1 = new DenseMatrix(vector1.Count/2); 

     vector1[0] = 1; 
     vector1[1] = 2; 
     vector1[2] = 3; 
     vector1[3] = 4; 

     vector2[0] = 2; 
     vector2[1] = 12; 
     vector2[2] = 14; 
     vector2[3] = 18; 

     matrix1 = p.twoPassCovariance(vector1, vector2); 
     for(int i = 0; i < matrix1.RowCount; i++) 
     { 
      for(int k = 0; k < matrix1.ColumnCount; k++) 
      { 

       Console.Write(matrix1[k, i] + " "); 
      } 
      //Mahalanobis2(v1, v2, covariance); 
      Console.Write("\n"); 
     } 
    } 

    public DenseMatrix twoPassCovariance(DenseVector data1, DenseVector data2) 
    { 
     int n = data1.Count; 

     double mean1 = data1.Average(); 
     double mean2 = data2.Average(); 

     DenseMatrix covariance = new DenseMatrix(data1.Count); 
     double x; 

     for(int i = 0; i < 2; i++) 
     { 
      for (int k = 0; k < n; k++) 
      { 
       double a = data1[i] - mean1; 
       double b = data2[k] - mean2; 
       x = a*b; 
       covariance[i, k] = x; 
      } 
     } 

     covariance.Multiply(1/n); 
     return covariance; 
    } 

}} 
+1

У вас есть конкретный вопрос или вы ищете обзор кода? – bluevector

+1

Ваши векторы действительно очень маленькие. Действительно ли вы перешли через код, который создает матрицу ковариации по строкам в отладчике, чтобы увидеть, где проблема? – mathematician1975

ответ

2

В i цикле в методе twoPassCovariance, я полагаю, вы должны петля для i < n, а не i < 2.

Смежные вопросы