通俗解釋幫助你理解馬氏距離含代碼

通俗解釋幫助你理解馬氏距離含代碼


讀懂這篇文章需要有一定的統計學知識, 至少知道總體與樣本, 協方差的計算方法

馬氏距離定義

設, 某個總體有m維的指標(feature)
那我們要考慮某一個樣本X=(x1,x2,…,xm)與總體的距離. 也就是看這個樣本和我們手上的總體距離(看看這個樣本多少程度上屬於我們手上的數據).

舉個例子, 你手上有一堆人的身體數據:體重, 身高, 腿長, 視力. 一共4個維度, 對應上面的m. 這堆數據就是上面的總體.

現在, 又來了一組數據, 這組數據就是我們說的樣本, 這個樣本X也有4個維度, 具體數值是(500, 300, 100, 5.0), 那麼, 馬氏距離就是用來判斷, 你手頭這個新的樣本X, 到底和之前你手上的總體數據差多遠. 那我們明眼人一看, 就知道, 這個距離應該比較遠了. 因爲哪有人體重500kg, 身高300cm的.

就是這個意思.

計算公式

大家都可以查到的公式

公式含義(在)

x是一個樣本 m*1
μ是總體的均值向量, 裏面包含了每個特徵的均值(身高體重什麼的) m*1
Σ是總體m個特徵協方差矩陣 m*m

計算中的坑

使用np.cov()計算, 要注意,接受的參數形式是和本文一樣的的, 每一行代表一個特徵

代碼

import math

def m_dist(data,new_data):
    data = np.array(data)#  總體
    data_mean = np.array(data.mean(axis=0))#  求總體均值向量
    cov = np.cov(data.T) #  轉置一下, 滿足行標籤爲特徵
    cov_rev = np.linalg.inv(cov)#  ∑求逆矩陣
    diff = new_data-data_mean#  求差
    res = math.sqrt(np.dot(cov_rev, diff).dot(diff.T))#  最後根據公式組合在一起
    return res
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章