利用IDL计算马氏距离

来源:互联网 发布:淘宝旺旺账号查询 编辑:程序博客网 时间:2024/05/29 06:31

利用IDL计算马氏距离

目录

[TOC]来生成目录:

  • 利用IDL计算马氏距离
      • 目录
      • 马氏距离
      • 协方差矩阵
      • 协方差矩阵的逆
      • 马氏距离的计算

马氏距离

马氏距离(Mahalanobis distance)是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。对于一个均值为μ,协方差矩阵为的多变量向量,其马氏距离为(xμ)T1(xμ)。摘自百度百科

x为一维或多维向量,假定为n维向量,并有m个样本(x1,x2,x3,,xm),那么向量μ即为样本集合的均值。向量x1与向量μ之间的马氏距离可采用公式(x1μ)T1(x1μ)计算,将μ替换为xi即为x1xi之间的马氏距离。关于欧氏距离与马氏距离的区别,Simon’s Blog写过一篇文章可参考。

假定向量x为2维向量,共有4个样本数据,数据源用矩阵a表示如下:

a=[34561089256]

下面利用IDL求解x1=[34]x2=[56]的马氏距离。

  • 协方差矩阵的计算
  • 矩阵逆的计算
  • 马氏距离的计算

协方差矩阵

协方差矩阵的计算

;IDL代码;输入:a矩阵(n行m列),n代表数据的维度,m代表数据的样本数。;输出:a的协方差矩阵cov,为n行n列的方阵。a  = float([[3,4],[5,6],[10,89],[25,6]])n  = n_elements(a[0,*])m  = n_elements(a[*,0])cov= fltarr(n,n)for i = 0, n-1 do begin  for j = i, n-1 do begin    x = total((a[*,i] - mean(a[*,i]))*(a[*,j] - mean(a[*,j])))/(m - 1)    cov[i,j] = x    cov[j,i] = x  endforendfor

输入:a矩阵如下

a=[34561089256]

输出:协方差矩阵cov如下
cov=[98.916715.583315.58331750.92]


协方差矩阵的逆

计算协方差矩阵的逆1,可采用MATRIX_POWER函数进行计算。关于逆矩阵的计算方法可以参考百度文库文章“逆矩阵的几种求法与解析(很全很经典)”。

;IDL代码vcov = MATRIX_POWER(cov,-1,status=sta)

矩阵cov1如下

cov1=[0.01012379.01021e0059.01021e0050.000571931]

马氏距离的计算

令向量z=x1x2=[22], zT=[22]x1x2之间的马氏距离位Dm。

;IDL代码z = [[3],[4]] - [[5],[6]]print,z      -2      -2zt = transpose(z)dm = 0.0for k = 0, 1L do begin  dm += total(zt*reform(vcov[k,*]))*z[0,k]endforprint,"dm=",dm^0.5dm=     0.208575

数据源矩阵a中xixj之间的马氏距离如下:
(0,1)=0.208575
(0,2)=2.17612
(0,3)=2.21587
(1,2)=2.06589
(1,3)=2.01233
(2,3)=2.44817

结果与MATLAB计算结果相同。见cau228charm在CSDN论坛的发文

>> x=[3,4;5,6;10,89;25,6]x =     3     4     5     6    10    89    25     6>> d=pdist(x,'mahalanobis')d =    0.2086    2.1761    2.2159    2.0659    2.0123    2.4482
0 0
原创粉丝点击