1.基本原理
闵可夫斯基距离由德国数学家赫尔曼·明可夫斯基提出,用于统一刻画n维空间中两个点(向量)A⃗=(a1,a2,...,an)\vec{A}=(a_1,a_2,...,a_n)A =(a1,a2,...,an) 和 B⃗=(b1,b2,...,bn)\vec{B}=(b_1,b_2,...,b_n)B =(b1,b2,...,bn) 的距离。其数学定义为:
Dp(A⃗,B⃗)=(∑i=1n∣ai−bi∣p)1p D_p(\vec{A},\vec{B}) = \left( \sum_{i=1}^n |a_i - b_i|^p \right)^{\frac{1}{p}} Dp(A ,B )=(i=1∑n∣ai−bi∣p)p1
其中核心参数 ppp 是阶数 (p≥1p \geq 1p≥1,p∈Rp \in \mathbb{R}p∈R),不同的 ppp 值对应不同的经典距离:
| ppp 值 | 对应距离类型 | 公式(简化) | 核心特点 |
|---|---|---|---|
| p=1p=1p=1 | 曼哈顿距离(L1) | D1=∑i=1n∣ai−bi∣D_1=\sum_{i=1}^n|a_i - b_i|D1=∑i=1n∣ai−bi∣ | 关注各维度绝对差值之和 |
| p=2p=2p=2 | 欧氏距离(L2) | D2=∑i=1n(ai−bi)2D_2 = \sqrt{\sum_{i=1}^n (a_i - b_i)^2}D2=∑i=1n(ai−bi)2 | 关注各维度差值的平方和开方 |
| p→∞p \to \inftyp→∞ | 切比雪夫距离(L∞) | D∞=maxi=1n∣ai−bi∣D_\infty = \max_{i=1}^n |a_i - b_i|D∞=maxi=1n∣ai−bi∣ | 关注最大维度差值 |
1.1 几何意义
- p=1(曼哈顿距离) :对应城市街区的"折线距离"(只能沿坐标轴方向移动),比如从点(0,0)到(2,3)的曼哈顿距离是∣2−0∣+∣3−0∣=5|2-0|+|3-0|=5∣2−0∣+∣3−0∣=5;
- p=2(欧氏距离):对应n维空间的"直线距离",是最符合人类直觉的几何距离;
- p→∞(切比雪夫距离):对应"棋盘距离",比如国际象棋中王从一个格子到另一个格子的最少步数;
- 1<p<2:介于曼哈顿和欧氏距离之间,对差值的惩罚程度弱于欧氏、强于曼哈顿;
- p>2:对大的维度差值惩罚更重(极端差值会主导距离结果),对小差值不敏感。
1.2 核心特性
明可夫斯基距离继承了Lp范数的核心性质(距离本质是两向量差值的Lp范数:Dp(A⃗,B⃗)=∥A⃗−B⃗∥pD_p(\vec{A},\vec{B}) = \|\vec{A}-\vec{B}\|_pDp(A ,B )=∥A −B ∥p):
- 非负性:距离恒≥0,仅当两向量完全相同时为0;
- 对称性 :Dp(A⃗,B⃗)=Dp(B⃗,A⃗)D_p(\vec{A},\vec{B}) = D_p(\vec{B},\vec{A})Dp(A ,B )=Dp(B ,A );
- 三角不等式 :Dp(A⃗,C⃗)≤Dp(A⃗,B⃗)+Dp(B⃗,C⃗)D_p(\vec{A},\vec{C}) \leq D_p(\vec{A},\vec{B}) + D_p(\vec{B},\vec{C})Dp(A ,C )≤Dp(A ,B )+Dp(B ,C )(仅当 p≥1p \geq 1p≥1 时成立);
- 量纲敏感性:与欧氏距离一致,受各维度量纲/方差影响,未消除特征相关性;
- 参数可控性 :通过调整 ppp 可平衡"对极端差值的容忍度"------p越小,对异常值越鲁棒;p越大,越聚焦于大的差值。|
2.优缺点
| 特点 | 说明 |
|---|---|
| ✅ 核心优点 | 通用性强,统一了经典距离度量 :明可夫斯基距离是曼哈顿、欧氏、切比雪夫距离的 "超集",通过调整 p 值可适配不同的距离度量需求,避免为不同场景重复实现不同距离公式。 参数可控,灵活适配异常值敏感度 : 当数据存在异常值时,选择小p值(如p=1,曼哈顿距离),对极端差值不敏感,结果更鲁棒; 当需要聚焦于大的维度差值时,选择大p值(如p=3、p=4),放大核心差异的影响; 当需要平衡鲁棒性和几何直觉时,选择1<p<2(如p=1.5)。 计算高效,工程实现简单 :核心逻辑仅包含"差值绝对值的p次方求和→开p次方",底层向量化实现(如NumPy)可达到纳秒级计算速度,无需复杂的矩阵运算(如马氏距离的协方差逆矩阵)。 几何意义明确,易解释 :不同p值对应的距离有直观的几何/业务意义(如曼哈顿距离对应路径规划、切比雪夫对应棋盘距离),便于业务侧理解和解释。 |
| ❌ 主要缺点 | 未解决量纲敏感问题 :与欧氏距离一致,明可夫斯基距离对量纲/方差敏感,比如"身高(cm)"和"体重(kg)"的维度差异会主导距离结果,需先做标准化(Z-Score/Min-Max) 未消除特征相关性 :明可夫斯基距离默认各维度独立,忽略特征间的相关性(如身高和体重的相关性),会导致距离结果重复计算相关特征的信息,不如马氏距离精准。 高维空间表现差(维度灾难) :当向量维度>1000时,无论p取何值,明可夫斯基距离的区分度都会急剧下降(所有向量的距离趋于相等),不如余弦相似度适合高维数据。 p为非整数时,开方运算开销增加 :当p为非整数(如p=1.5、p=2.7)时,开p次方的计算需要调用对数/指数函数(x1/p=elnxpx^{1/p} = e^{\frac{\ln x}{p}}x1/p=eplnx),相比整数p值(如p=2的开平方),计算开销略有增加。 |
3.与其他距离的对比
| 度量方法 | 核心优势 | 核心劣势 | 对比明可夫斯基距离 |
|---|---|---|---|
| 马氏距离 | 消除量纲和特征相关性 | 计算复杂,对逆矩阵敏感 | 明可夫斯基更简单,马氏更精准(低维) |
| 余弦相似度 | 高维友好,关注方向相似性 | 忽略绝对数值差异 | 明可夫斯基关注绝对差值,余弦关注方向 |
| Jaccard相似度 | 适合稀疏二值向量 | 不适合稠密向量 | 明可夫斯基适合稠密数值向量 |
4.框架选型
| 框架 | 核心函数/方法 | 实现特点 |
|---|---|---|
| NumPy | 手动计算:np.sum(np.abs(a - b)**p)**(1/p)、np.linalg.norm(a - b, ord=p) |
基础向量化运算,支持任意p值(包括∞),灵活但需手动封装 |
| SciPy | scipy.spatial.distance.minkowski(a, b, p)、scipy.spatial.distance.cdist(批量) |
封装了明可夫斯基距离,支持批量计算,p=∞时自动切换为切比雪夫距离 |
| Scikit-learn | sklearn.metrics.pairwise.minkowski_distances(X, Y, p)(矩阵间批量计算) |
专为机器学习场景设计,支持稀疏矩阵,与KNN、聚类等算法无缝集成 |
| 框架 | 最佳适用场景 |
|---|---|
| NumPy | 小数据量、自定义p值(如1.5、3.2)的基础计算,教学/原型开发 |
| SciPy | 科研场景的多类距离对比计算(如同时测试p=1/2/∞的距离) |
| Scikit-learn | 机器学习场景(如KNN分类/回归、聚类)的批量稀疏/稠密向量距离计算 |
分场景选择最优框架:
- 通用机器学习场景(CPU、批量计算、稀疏/稠密向量) :Scikit-learn 是首选
- 理由:批量计算优化好、支持稀疏矩阵、与KNN/聚类等算法无缝集成,性能和易用性平衡最佳。
- 自定义p值/科研场景(需测试不同p值的效果) :NumPy 是首选
- 理由:支持任意p值(包括非整数、∞),计算灵活,能精准控制距离的"惩罚方式"。
- 快速验证经典p值(p=1/2/∞) :SciPy 是首选
- 理由:封装了明可夫斯基/曼哈顿/欧氏/切比雪夫距离的直接调用,无需手动推导公式。
5.使用
5.1. NumPy(自定义p值,理解原理)
python
import numpy as np
def minkowski_distance(a, b, p):
"""
计算明可夫斯基距离
:param a: 向量a(numpy数组)
:param b: 向量b(numpy数组)
:param p: 阶数(p≥1,p=∞时用np.inf)
:return: 明可夫斯基距离
"""
if p == np.inf:
# 切比雪夫距离(p→∞)
return np.max(np.abs(a - b))
else:
return np.sum(np.abs(a - b) ** p) ** (1 / p)
# 测试数据
a = np.array([1, 3, 5])
b = np.array([4, 7, 9])
# 计算不同p值的距离
print(f"p=1(曼哈顿):{minkowski_distance(a, b, 1):.2f}") # 输出:10.00
print(f"p=2(欧氏):{minkowski_distance(a, b, 2):.2f}") # 输出:6.63
print(f"p=3:{minkowski_distance(a, b, 3):.2f}") # 输出:5.85
print(f"p=∞(切比雪夫):{minkowski_distance(a, b, np.inf):.2f}") # 输出:4.00
print(f"p=1.5:{minkowski_distance(a, b, 1.5):.2f}") # 输出:7.47
5.2. Scikit-learn(批量计算,支持稀疏矩阵)
python
import numpy as np
from sklearn.metrics.pairwise import minkowski_distances
# 稠密矩阵(样本数×特征数:3×3)
X = np.array([[1, 3, 5], [4, 7, 9], [2, 4, 6]])
Y = np.array([[3, 5, 7], [5, 8, 10]])
# 计算p=2的明可夫斯基距离(欧氏)
dist_matrix_p2 = minkowski_distances(X, Y, p=2)
print("p=2的距离矩阵:")
print(dist_matrix_p2.round(2))
# 输出:[[3.46 6.0 ]
# [3.46 1.73]
# [1.73 4.36]]
# 计算p=1的明可夫斯基距离(曼哈顿)
dist_matrix_p1 = minkowski_distances(X, Y, p=1)
print("p=1的距离矩阵:")
print(dist_matrix_p1.round(2))
# 输出:[[6. 9.]
# [6. 3.]
# [3. 6.]]
# 稀疏矩阵示例
from scipy.sparse import csr_matrix
X_sparse = csr_matrix(X)
dist_sparse = minkowski_distances(X_sparse, p=2)
print("稀疏矩阵的距离矩阵:")
print(dist_sparse.round(2))
5.3. SciPy(单对/批量计算,快速验证经典p值)
python
import numpy as np
from scipy.spatial.distance import minkowski, cdist
# 单对向量计算
a = [1, 3, 5]
b = [4, 7, 9]
# p=1(曼哈顿)
dist_p1 = minkowski(a, b, p=1)
# p=2(欧氏)
dist_p2 = minkowski(a, b, p=2)
# p=∞(切比雪夫,scipy中用p=np.inf)
dist_pinf = minkowski(a, b, p=np.inf)
print(f"SciPy p=1:{dist_p1:.2f}") # 输出:10.00
print(f"SciPy p=2:{dist_p2:.2f}") # 输出:6.63
print(f"SciPy p=∞:{dist_pinf:.2f}") # 输出:4.00
# 批量计算
X = [[1, 3], [4, 7]]
Y = [[2, 4], [5, 8]]
dist_matrix = cdist(X, Y, metric="minkowski", p=1.5)
print("批量p=1.5的距离矩阵:")
print(dist_matrix.round(2))
5.4. 标准化后计算明可夫斯基距离(解决量纲问题)
python
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.metrics.pairwise import minkowski_distances
# 原始数据(含不同量纲:身高cm、体重kg、月收入元)
data = np.array([[170, 60, 5000], [180, 70, 6000], [160, 50, 4000]])
# 标准化(Z-Score)
scaler = StandardScaler()
data_standardized = scaler.fit_transform(data)
# 计算标准化后的p=2距离
dist_standardized = minkowski_distances(data_standardized, p=2)
print("标准化后的距离矩阵:")
print(dist_standardized.round(2))
6.闵可夫斯基距离在表示 / 嵌入(Embedding)差异度量中的核心逻辑
嵌入向量(如文本、图像、用户行为的 Embedding)本质是高维数值向量
闵可夫斯基距离通过调整参数p,能灵活适配不同嵌入场景对 "差异敏感度" 的需求:
- 比如低 p 值(p=1)对嵌入中的噪声鲁棒,如果任务希望平等看待每个维度的变化,且对噪声稳健(p=1,曼哈顿)
- 高 p 值(p=2/3)聚焦嵌入的核心差异,如果任务关心整体的、各维度的综合差异(p=2,欧氏距离)。
- 极端 p 值(p=∞)关注嵌入的最大维度差异,如果任务更关注局部的、少数几个维度的极端差异(p 值较大,趋向于切比雪夫)。