原创
OpenCV统计应用-Mahalanobis距离
2009-2-21 23:27
4336
6
6
分类:
软件与OS
OpenCV统计应用-Mahalanobis距离
Mahalanobis距离是一个可以准确找出资料分布上面极端值(Outliers)的统计方法,使用线性回归的概念,也就是说他使用的是共变量矩阵以及该数据分布的平均数来找寻极端值的产生,而可以让一群数据系统具有稳健性(Robust),去除不必要的噪声讯息,这边拿前面共变量矩阵的数据为例,并且新增了两个点坐标向量来做Mahalanobis距离的比较
加入两个坐标点找寻极端值
Mahalanobis距离实作
#include
#include
#include
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为这个线性回归的极端值
文章评论(0条评论)
登录后参与讨论