机器学习中的数学——距离定义(六):马氏距离(Mahalanobis Distance)

马氏距离(Mahalanobis Distance)是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是它考虑到各种特性之间的联系并且是尺度无关的,即独立于测量尺度。对于一个均值为 μ μ μ,协方差矩阵为 Σ \Sigma Σ的多变量向量,其 n n n维空间中的马氏距离为:
d ( x , y ) = ( x − y ) T Σ − 1 ( x − y ) ) d(x, y)=\sqrt{(x-y)^T\Sigma^{-1}(x-y))} d(x,y)=(x−y)TΣ−1(x−y))

若协方差矩阵为单位矩阵,那么马氏距离就简化为欧几里得距离(Euclidean Distance)。若协方差矩阵为对角阵,则其转为标准化的欧几里得距离(Standardized Euclidean Distance)

马氏距离的计算是建立在总体样本的基础上的,这一点可以从上述协方差矩阵的解释中可以得出,也就是说,如果拿同样的两个样本,放入两个不同的总体中,最后计算得出的两个样本间的马氏距离通常是不相同的,除非这两个总体的协方差矩阵碰巧相同。除此之外,在计算马氏距离过程中,要求总体样本数大于样本的维数,否则得到的总体样本协方差矩阵逆矩阵不存在,这种情况下,用欧几里得距离计算即可。还有一种情况,满足了条件总体样本数大于样本的维数,但是协方差矩阵的逆矩阵仍然不存在,比如所有样本共线。这种情况下,也采用欧几里得距离进行计算。但是在实际应用中“总体样本数大于样本的维数”这个条件是很容易满足的,而且所有样本点共线的情况是很少出现的,所以在绝大多数情况下,马氏距离是可以顺利计算的,但是马氏距离的计算是不稳定的,不稳定的来源是协方差矩阵,这也是马氏距离与欧几里得距离的最大差异之处。

马氏距离还不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关。由标准化数据和中心化数据计算出的二点之间的马氏距离相同。马氏距离还可以排除变量之间的相关性的干扰,但它的缺点是夸大了变化微小的变量的作用。

下面我们来看一下马氏距离的Python实现:

def MahalanobisDistance(x, y):
    '''
    马氏居立中的(x,y)与欧几里得距离的(x,y)不同,欧几里得距离中的(x,y)指2个样本,每个样本的维数为x或y的维数;这里的(x,y)指向量是2维的,样本个数为x或y的维数,若要计算n维变量间的马氏距离则需要改变输入的参数如(x,y,z)为3维变量。
    '''
    import numpy as np
    x = np.array(x)
    y = np.array(y)
    
    X = np.vstack([x,y])
    X_T = X.T
    sigma = np.cov(X)
    sigma_inverse = np.linalg.inv(sigma)
    
    d1=[]
    for i in range(0, X_T.shape[0]):
        for j in range(i+1, X_T.shape[0]):
            delta = X_T[i] - X_T[j]
            d = np.sqrt(np.dot(np.dot(delta,sigma_inverse),delta.T))
            d1.append(d)
        
    return d1
上一篇:sqlite 数据库 boolean类型的小小测试


下一篇:二维图像Dice系数计算