马氏距离(Mahalanobis Distance)
是度量学习中一种常用的距离指标,同欧氏距离、曼哈顿距离、汉明距离等一样被用作评定数据之间的相似度指标。但却可以应对高维线性分布的数据中各维度间非独立同分布的问题。与欧几里得距离不同,马哈拉诺比斯距离不仅仅根据坐标位置来衡量点与点之间的距离,而是根据它们在多维空间中的相对位置来衡量,这考虑了各维度之间的相关性。
马哈拉诺比斯距离的定义如下:
设 X 是一个包含多个观测值的随机向量, 对于一个均值为,协方差矩阵为Σ的多变量矢量,其马氏距离(单个数据点的马氏距离)为:
马氏距离也可以定义为两个服从同一分布并其中:
- x - μ是观测向量与均值向量的差值。
- S^-1是协方差矩阵的逆矩阵。
- T 表示转置。
- 开方运算确保了距离的非负性。
且其协方差矩阵为Σ的随机变量X与Y的差异程度,数据点x, y之间的马氏距离:
其中σi是xi的标准差。
马哈拉诺比斯距离有几个重要特性:
1. 它考虑了各维度之间的相关性,因此更适合用于那些维度间相关性强的情况。
2. 它不受量纲的影响,因为协方差矩阵包含了数据的标准差。
3. 当协方差矩阵是对角矩阵时,马哈拉诺比斯距离退化为欧几里得距离。
在应用马哈拉诺比斯距离时,需要注意的是:
- 协方差矩阵必须是满秩的,即所有维度都是统计独立的,否则逆矩阵不存在。
- 当样本数量少于维度数时,协方差矩阵可能不可逆。
以下是一个使用Python计算马哈拉诺比斯距离的简单例子。在这个例子中,我们将使用numpy库来处理矩阵运算。
pip install numpy
下面是计算马哈拉诺比斯距离的代码示例:
import numpy as np
# 假设我们有两个观测向量
x = np.array([1, 2, 3])
y = np.array([2, 3, 4])
# 计算均值向量
mean_vector = np.mean(np.vstack((x, y)), axis=0)
# 计算协方差矩阵
cov_matrix = np.cov(np.vstack((x, y)).T)
# 计算协方差矩阵的逆
cov_matrix_inv = np.linalg.inv(cov_matrix)
# 计算马哈拉诺比斯距离
def mahalanobis_distance(x, mean_vector, cov_matrix_inv):
delta = x - mean_vector
m_distance = np.dot(np.dot(delta, cov_matrix_inv), delta.T)
return np.sqrt(m_distance)
# 计算x到均值向量的马哈拉诺比斯距离
distance = mahalanobis_distance(x, mean_vector, cov_matrix_inv)
print(f"马哈拉诺比斯距离: {distance}")
在这个例子中,我们有两个观测向量x和y,首先计算了这两个向量的均值向量,然后计算了协方差矩阵及其逆矩阵。最后,我们定义了一个函数mahalanobis_distance来计算并返回马哈拉诺比斯距离。
注意,这里我们假设有足够的数据点来计算协方差矩阵。事实上,现实中如果数据点数量较少,可能需要采用其他方法来估计协方差矩阵的逆,以避免数值不稳定性。
曼哈顿距离(Manhattan Distance)
是一种在数学中用来度量两点在标准坐标系上的绝对轴距总和的度量方式。在二维空间中,曼哈顿距离可以表示为两点在x轴方向上的距离加上y轴方向上的距离。
给定两个点 P1(x1, y1) 和 P2(x2, y2) ,曼哈顿距离 D 可以用以下公式计算:
D = |x1 - x2| + |y1 - y2|
在更高维度的空间中,比如三维空间,曼哈顿距离的计算方式是类似的,需要考虑额外的维度。给定两个点 P1(x1, y1, z1) 和 P2(x2, y2, z2) ,曼哈顿距离 D 可以表示为:
\D = |x1 - x2| + |y1 - y2| + |z1 - z2|
对于n维空间中的两个点 P1(p1_1, p1_2, ..., p1_n) 和 P2(p2_1, p2_2, ..., p2_n) ,曼哈顿距离 D 可以推广为:
D = |P1i-P2i|
曼哈顿距离又称城市街道距离(CityBlock distance)或出租车几何(Taxicab geometry),因为它模拟了在矩形城市街道上从一个点到另一个点的最短路径(不能走对角线),就像出租车在纽约曼哈顿地区行驶的距离计算方式。下面是使用Python计算两个二维空间点曼哈顿距离的简单例子:
def manhattan_distance(p1, p2):
return abs(p1[0] - p2[0]) + abs(p1[1] - p2[1])
# 示例
point1 = (1, 2)
point2 = (3, 5)
distance = manhattan_distance(point1, point2)
print("曼哈顿距离是:", distance)
在这个例子中,manhattan_distance函数计算了两个点point1和point2之间的曼哈顿距离。