马哈拉诺比斯距离是由印度统计学家马哈拉诺比斯 (英语)提出的,表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。 对于一个均值为 μ = ( μ 1 , μ 2 , μ 3 , … , μ p ) T {\displaystyle \mu =(\mu _{1},\mu _{2},\mu _{3},\dots ,\mu _{p})^{T}} μ=(μ1,μ2,μ3,…,μp)T,协方差矩阵为 Σ {\displaystyle \Sigma } Σ 的多变量向量 x = ( x 1 , x 2 , x 3 , … , x p ) T {\displaystyle x=(x_{1},x_{2},x_{3},\dots ,x_{p})^{T}} x=(x1,x2,x3,…,xp)T,其马氏距离为
D M ( x ) = ( x − μ ) T Σ − 1 ( x − μ ) {\displaystyle D_{M}(x)={\sqrt {(x-\mu )^{T}\Sigma ^{-1}(x-\mu )}}} DM(x)=(x−μ)TΣ−1(x−μ)
马哈拉诺比斯距离也可以定义为两个服从同一分布并且其协方差矩阵为 Σ {\displaystyle \Sigma } Σ的随机变量 x ⃗ {\displaystyle {\vec {x}}} x与 y ⃗ {\displaystyle {\vec {y}}} y的差异程度:
d ( x ⃗ , y ⃗ ) = ( x ⃗ − y ⃗ ) T Σ − 1 ( x ⃗ − y ⃗ ) {\displaystyle d({\vec {x}},{\vec {y}})={\sqrt {({\vec {x}}-{\vec {y}})^{T}\Sigma ^{-1}({\vec {x}}-{\vec {y}})}}} d(x,y)=(x−y)TΣ−1(x−y)
如果协方差矩阵为单位矩阵,马哈拉诺比斯距离就简化为欧氏距离;如果协方差矩阵为对角阵,其也可称为正规化的欧氏距离。
d ( x ⃗ , y ⃗ ) = ∑ i = 1 p ( x i − y i ) 2 σ i 2 {\displaystyle d({\vec {x}},{\vec {y}})={\sqrt {\sum _{i=1}^{p}{(x_{i}-y_{i})^{2} \over \sigma _{i}^{2}}}}} d(x,y)=i=1∑pσi2(xi−yi)2
其中 σ i 是 x i {\displaystyle \sigma _{i}}是{\displaystyle x_{i}} σi是xi的标准差。
以上引自维基百科
现在有一组向量:
( 3 , 4 ) T , ( 5 , 6 ) T , ( 2 , 2 ) T , ( 8 , 4 ) T (3,4)^{T},(5,6)^{T},(2,2)^{T},(8,4)^{T} (3,4)T,(5,6)T,(2,2)T,(8,4)T
请求出 ( 3 , 4 ) T , ( 5 , 6 ) T (3,4)^{T},(5,6)^{T} (3,4)T,(5,6)T之间的马氏距离。
现在将 ( 3 , 4 ) T , ( 5 , 6 ) T , ( 2 , 2 ) T , ( 8 , 4 ) T (3,4)^{T},(5,6)^{T},(2,2)^{T},(8,4)^{T} (3,4)T,(5,6)T,(2,2)T,(8,4)T四个向量排列:
[ 3 5 2 8 4 6 2 4 ] \left[\begin{array}{cc} 3 & 5 & 2 & 8 \\ 4 & 6 & 2 & 4 \end{array}\right] [34562284]
我们假设 [ 3 5 2 8 ] \left[\begin{array}{cc} 3 & 5 & 2 & 8 \end{array}\right] [3528]对应的是X,而 [ 4 6 2 4 ] \left[\begin{array}{cc} 4 & 6 & 2 & 4 \end{array}\right] [4624]对应的是Y。
∵ X ‾ = ( 3 + 5 + 2 + 8 ) / 4 = 4.5 , Y ‾ = ( 4 + 6 + 2 + 4 ) / 4 = 4 \overline{\mathrm{X}}=(3+5+2+8)/4=4.5,\overline{\mathrm{Y}}=(4+6+2+4)/4=4 X=(3+5+2+8)/4=4.5,Y=(4+6+2+4)/4=4
∴均值 μ ⃗ = ( 4.5 , 4 ) T \vec{\mu}=(4.5,4)^{T} μ=(4.5,4)T
然后将 [ 3 5 2 8 4 6 2 4 ] \left[\begin{array}{cc} 3 & 5 & 2 & 8 \\ 4 & 6 & 2 & 4 \end{array}\right] [34562284]中心化,即X中的每个元素减去 X ‾ \overline{\mathrm{X}} X,Y中的每个元素减去 Y ‾ \overline{\mathrm{Y}} Y,得:
[ − 1.5 0.5 − 2.5 3.5 0 2 − 2 0 ] \left[\begin{array}{cc} -1.5 & 0.5 & -2.5 & 3.5 \\ 0 & 2 & -2 & 0 \end{array}\right] [−1.500.52−2.5−23.50]
cov ( X , X ) = ∑ i = 1 4 ( X i − X ‾ ) ( X i − X ‾ ) 4 − 1 = ( − 1.5 ) × ( − 1.5 ) + 0.5 × 0.5 + ( − 2.5 ) × ( − 2.5 ) + 3.5 × 3.5 3 = 7 \operatorname{cov}(\mathrm{X}, \mathrm{X})=\frac{\sum_{\mathrm{i}=1}^{\mathrm{4}}\left(\mathrm{X}_{\mathrm{i}}-\overline{\mathrm{X}}\right)\left(\mathrm{X}_{\mathrm{i}}-\overline{\mathrm{X}}\right)}{\mathrm{4}-1}=\frac{(-1.5)\times(-1.5)+0.5\times0.5+(-2.5)\times(-2.5)+3.5\times3.5}{3}=7 cov(X,X)=4−1∑i=14(Xi−X)(Xi−X)=3(−1.5)×(−1.5)+0.5×0.5+(−2.5)×(−2.5)+3.5×3.5=7
cov ( X , Y ) = cov ( Y , X ) = ∑ i = 1 4 ( X i − X ‾ ) ( Y i − Y ‾ ) 4 − 1 = ( − 1.5 ) × ( 0 ) + 0.5 × 2 + ( − 2.5 ) × ( − 2 ) + 3.5 × 0 3 = 2 \operatorname{cov}(\mathrm{X}, \mathrm{Y})=\operatorname{cov}(\mathrm{Y}, \mathrm{X})=\frac{\sum_{\mathrm{i}=1}^{\mathrm{4}}\left(\mathrm{X}_{\mathrm{i}}-\overline{\mathrm{X}}\right)\left(\mathrm{Y}_{\mathrm{i}}-\overline{\mathrm{Y}}\right)}{\mathrm{4}-1}=\frac{(-1.5)\times(0)+0.5\times2+(-2.5)\times(-2)+3.5\times0}{3}=2 cov(X,Y)=cov(Y,X)=4−1∑i=14(Xi−X)(Yi−Y)=3(−1.5)×(0)+0.5×2+(−2.5)×(−2)+3.5×0=2
cov ( Y , Y ) = ∑ i = 1 4 ( Y i − Y ‾ ) ( Y i − Y ‾ ) 4 − 1 = 0 × 0 + 2 × 2 + ( − 2 ) × ( − 2 ) + 0 × 0 3 = 2.667 \operatorname{cov}(\mathrm{Y}, \mathrm{Y})=\frac{\sum_{\mathrm{i}=1}^{\mathrm{4}}\left(\mathrm{Y}_{\mathrm{i}}-\overline{\mathrm{Y}}\right)\left(\mathrm{Y}_{\mathrm{i}}-\overline{\mathrm{Y}}\right)}{\mathrm{4}-1}=\frac{0\times0+2\times2+(-2)\times(-2)+0\times0}{3}=2.667 cov(Y,Y)=4−1∑i=14(Yi−Y)(Yi−Y)=30×0+2×2+(−2)×(−2)+0×0=2.667
∴ 协 方 差 矩 阵 Σ = [ 7 2 2 2.667 ] ∴ 协方差矩阵{\displaystyle \Sigma }=\left[\begin{array}{cc} 7 & 2 \\ 2 & 2.667 \end{array}\right] ∴协方差矩阵Σ=[7222.667]
∴ 协 方 差 矩 阵 的 逆 Σ − 1 = [ 0.18 − 0.13 − 0.13 0.48 ] ∴ 协方差矩阵的逆{\displaystyle \Sigma^{-1} }=\left[\begin{array}{cc} 0.18 & -0.13 \\ -0.13 & 0.48 \end{array}\right] ∴协方差矩阵的逆Σ−1=[0.18−0.13−0.130.48]
∴ 可 以 计 算 ( 3 , 4 ) T , ( 5 , 6 ) T 之 间 的 距 离 为 : D M = [ ( 3 − 5 , 4 − 6 ) T ] T Σ − 1 ( 3 − 5 , 4 − 6 ) T ∴ 可以计算(3,4)^{T},(5,6)^{T}之间的距离为:{\displaystyle D_{M}={\sqrt {[(3-5,4-6 )^{T}]^{T}\Sigma ^{-1}(3-5,4-6 )^{T}}}} ∴可以计算(3,4)T,(5,6)T之间的距离为:DM=[(3−5,4−6)T]TΣ−1(3−5,4−6)T
即 D M = ( 3 − 5 , 4 − 6 ) Σ − 1 ( 3 − 5 , 4 − 6 ) T = 1.2 即D_{M}={\sqrt {(3-5,4-6 )\Sigma ^{-1}(3-5,4-6 )^{T}}}=1.2 即DM=(3−5,4−6)Σ−1(3−5,4−6)T=1.2
因此 ( 3 , 4 ) T , ( 5 , 6 ) T (3,4)^{T},(5,6)^{T} (3,4)T,(5,6)T之间的马氏距离为1.2!
#coding=utf-8
import numpy
x = numpy.array([[3,4],[5,6],[2,2],[8,4]])
print("x矩阵的维度:",x.ndim) # 二维向量组成的矩阵
xT = x.T
D = numpy.cov(xT)
invD = numpy.linalg.inv(D)
tp = x[0] - x[1]
print(numpy.sqrt(numpy.dot(numpy.dot(tp, invD), tp.T)))
大功告成!最后感谢小伙伴们的学习噢~