Mahalanobis距離是一個可以準確找出資料分布上面極端值(Outliers)的統計方法,使用線性迴歸的概念,也就是說他使用的是共變數矩陣以及該資料分布的平均數來找尋極端值的產生,而可以讓一群資料系統具有穩健性(Robust),去除不必要的雜訊訊息,這邊拿前面共變數矩陣的資料為例,並且新增了兩個點座標向量來做Mahalanobis距離的比較
加入兩個座標點找尋極端值
Mahalanobis距離實作
#include <cv.h>
#include <stdio.h>
#include <stdlib.h>
float Coordinates[20]={1.5,2.3,
3.0,1.7,
1.2,2.9,
2.1,2.2,
3.1,3.1,
1.3,2.7,
2.0,1.7,
1.0,2.0,
0.5,0.6,
1.0,0.9};
float Coordinates2[2]={1.3,1.5};
float Coordinates3[2]={200,100};
int main()
{
CvMat *Vector[1];
CvMat *Vector1;
CvMat *CovarMatrix;
CvMat *InvertCovarMatrix;
CvMat *AvgVector;
CvMat *Vector2;
CvMat *Vector3;
Vector1=cvCreateMat(10,2,CV_32FC1);
cvSetData(Vector1,Coordinates1,Vector1->step);
Vector[0]=Vector1;
CovarMatrix=cvCreateMat(2,2,CV_32FC1);
InvertCovarMatrix=cvCreateMat(2,2,CV_32FC1);
AvgVector=cvCreateMat(1,2,CV_32FC1);
Vector2=cvCreateMat(1,2,CV_32FC1);
Vector3=cvCreateMat(1,2,CV_32FC1);
cvSetData(Vector2,Coordinates2,Vector2->step);
cvSetData(Vector3,Coordinates3,Vector3->step);
cvCalcCovarMatrix((const CvArr **)Vector,10,CovarMatrix,AvgVector,CV_COVAR_SCALE+CV_COVAR_NORMAL+CV_COVAR_ROWS);
cvInvert(CovarMatrix,InvertCovarMatrix,CV_SVD_SYM);
printf("\nVector2 Mahalanobis Distance\n");
printf("%f\n",cvMahalanobis(Vector2,AvgVector,InvertCovarMatrix));
printf("\nVector3 Mahalanobis Distance\n");
printf("%f\n",cvMahalanobis(Vector3,AvgVector,InvertCovarMatrix));
system("pause");
}
由上面可以看得出來第一筆座標向量Vector2,他的座標位在(1.3,1.5)的位置,第二筆座標向量Vector2他的座標在(200,100),對於原始資料分布來說,第二筆座標向量它已經遠遠離開了這些座標分佈,因此可以從執行結果看的出來Vector3的Mahalanobis距離遠大於Vector2,而在做Mahalanobis距離的同時,也必須要將共變數矩陣做反矩陣運算,cvMahalanobis()第一個引數為目標要判斷是否是極端值的向量CvMat資料結構,第二個引數為該資料分佈的平均數向量或是該資料分佈的某筆資料的CvMat資料結構,第三個引數為該資料分佈共變數矩陣的反矩陣
而Mahalanobis距離的原理如下
當資料分佈使的共變數矩陣為單位向量I的話,就會退化成歐機理得距離(Euclidean Distance)
而他的計算方式如下
由上面可知,在一個簡單線性迴歸的資料模型下,第二筆資料Vector3為這個線性迴歸的極端值
2009年2月3日 星期二
訂閱:
張貼留言 (Atom)
3 意見:
你好,最近挺忙的吧,一直没有更新啊!你的帖子对我帮助很大,谢谢
期待昨日的最新教学。
您的帖子对我帮助非常的很大,谢谢。
張貼留言