1、欧式距离
,其中x,y为空间的两个点,表示的空间两个点的绝对距离,不考虑特征之间的相关性如何,而实际上特征之间是经常有相关性的。如果我们要衡量一个点到一个集合的距离,我们很可能就直接计算这个点x到这个集合的质心y的距离,那这样我们就忽略了这个集合的分布了
2、标准欧式距离
其中s为各个特征的方差,标准欧式距离没有考虑特征之间的相关性
3、马氏距离
,其中是协方差的逆矩阵,所以马氏距离可以理解为标准欧式距离的加强版
4、测试
构造数据,构建一个长轴为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)
测试两个点到质心的距离绿色的点x1(1,0)和黄色的点x2(0,0.8),通过计算欧式距离发现x2距离质心更近一些,但是计算马氏距离和标准欧式距离却又是x1距离的更近些
很直接的原因就是长轴的方差比较大,还有就是这个例子中x和y还有一点微弱相关性
5、变量之间的相关性对马氏距离的影响
按照相关系数的大小调整特征之间的协方差,然后在计算这两个点到质心之间的马氏距离得到下图
x轴为相关系数,y轴为马氏距离的大小,结果可以看到相关性系数的绝对值越大也就是特征之间的共线性越强,马氏距离越大,而特征之间共线性太强一般不是我们想要看到的,我们希望特征之间的最好是正交的,所以在进行马氏距离的计算之前我们最好先进行特征提取降维,可以用pca或者自编码,当特征之间的相关性都为0的时候,马氏距离则变成标准欧式距离