马氏距离与欧式距离

一、欧式距离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的时候,马氏距离则变成标准欧式距离