读懂这篇文章需要有一定的统计学知识, 至少知道总体与样本, 协方差的计算方法
马氏距离定义
设, 某个总体有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(diff,cov_rev).dot(diff.T))# 最后根据公式组合在一起
return res