馬氏距離與歐式距離

一、歐式距離app

d(x,y) = \sqrt{(x - y).(x - y)T},其中x,y爲空間的兩個點,表示的空間兩個點的絕對距離,不考慮特徵之間的相關性如何,而實際上特徵之間是常常有相關性的。若是咱們要衡量一個點到一個集合的距離,咱們極可能就直接計算這個點x到這個集合的質心y的距離,那這樣咱們就忽略了這個集合的分佈了dom

二、標準歐式距離測試

其中s爲各個特徵的方差,標準歐式距離沒有考慮特徵之間的相關性編碼

三、馬氏距離code

d(x,y) = \sqrt{(x - y) \Sigma ^{-1}(x -y)T},其中\Sigma ^{-1}是協方差的逆矩陣,因此馬氏距離能夠理解爲標準歐式距離的增強版blog

四、測試class

構造數據,構建一個長軸爲2短軸爲1的橢圓變量

def make_ovals(a=2,b=1):
    points = []
    for i in range(400):
        t = np.random.choice(range(360))
        rr = np.random.random()
        x = rr * a * np.cos(t * np.pi / 180)
        y = rr * b * np.sin(t * np.pi / 180)
        points.append([x,y])
    return np.array(points)im

測試兩個點到質心的距離綠色的點x1(1,0)和黃色的點x2(0,0.8),經過計算歐式距離發現x2距離質心更近一些,可是計算馬氏距離和標準歐式距離卻又是x1距離的更近些數據

很直接的緣由就是長軸的方差比較大,還有就是這個例子中x和y還有一點微弱相關性

五、變量之間的相關性對馬氏距離的影響

按照相關係數的大小調整特徵之間的協方差,而後在計算這兩個點到質心之間的馬氏距離獲得下圖

x軸爲相關係數,y軸爲馬氏距離的大小,結果能夠看到相關性係數的絕對值越大也就是特徵之間的共線性越強,馬氏距離越大,而特徵之間共線性太強通常不是咱們想要看到的,咱們但願特徵之間的最好是正交的,因此在進行馬氏距離的計算以前咱們最好先進行特徵提取降維,能夠用pca或者自編碼,當特徵之間的相關性都爲0的時候,馬氏距離則變成標準歐式距離