讀懂這篇文章需要有一定的統計學知識, 至少知道總體與樣本, 協方差的計算方法
馬氏距離定義
設, 某個總體有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