曼哈顿距离 余弦相似度 欧式距离的详细对比

用「城市导航」、「指南针」、「激光测距」的比喻,带你彻底理解三大距离度量的本质区别!


📊 核心对比表

指标 曼哈顿距离(L1) 余弦相似度 欧式距离(L2)
数学本质 绝对差之和 向量夹角余弦值 平方差平方根
计算公式 ( \sum |x_i - y_i| ) ( \frac{\mathbf{x} \cdot \mathbf{y}}{|\mathbf{x}| |\mathbf{y}|} ) ( \sqrt{\sum (x_i - y_i)^2} )
量纲敏感性 敏感 不敏感 敏感
计算复杂度 O(n) O(n) O(n)
适用维度 低维 高维 低维
空间类型 网格空间 方向空间 欧氏空间

🏙️ 曼哈顿距离(城市导航距离)

📍 核心特点

  • 路径计算:只能沿坐标轴方向移动的距离总和
  • 抗噪性:对异常值更鲁棒(绝对值抑制大偏差)
  • 稀疏性:更容易产生稀疏解

🚕 典型应用场景

  1. 物流路径规划

    • 计算仓库到商场的实际行驶距离(城市街道网格)
    • 例:从(2,3)到(5,7)的曼哈顿距离 = |5-2| + |7-3| = 3+4=7
  2. 特征选择

    • L1正则化(LASSO)产生稀疏权重矩阵
  3. 图像处理

    • 计算两幅二值图像的差异像素数

⚠️ 使用注意

  • 需先进行特征标准化(对量纲敏感)
  • 高维数据中效果下降(维度诅咒)

🧭 余弦相似度(方向指南针)

📍 核心特点

  • 方向敏感:只关注向量夹角,忽略模长差异
  • 高维友好:适合稀疏高维数据(如文本TF-IDF)
  • 归一化:结果范围[-1,1],1表示完全相同方向

📚 典型应用场景

  1. 文本相似度计算

    • 比较两篇文章的TF-IDF向量
    • 例:"猫"和"狗"的向量夹角小,"猫"和"汽车"夹角大
  2. 推荐系统

    • 用户兴趣向量与商品特征向量的方向匹配
    • 例:用户A的偏好向量[0.9,0.1,0.3] vs 商品B的特征向量[0.8,0.2,0.4]
  3. 人脸识别

    • 比较人脸嵌入向量的方向一致性

⚠️ 使用注意

  • 不适合需要关注向量模长的场景(如价格比较)
  • 对零值敏感(需处理稀疏数据)

📏 欧式距离(激光测距仪)

📍 核心特点

  • 几何直观:符合现实空间的直线距离认知
  • 平方放大:对异常值敏感(平方项放大差异)
  • 广泛适用:最基础的空间距离度量

🖼️ 典型应用场景

  1. 图像识别

    • 比较两张图片的像素级差异
    • 例:MNIST手写数字的28x28像素向量距离
  2. 聚类分析

    • K-Means算法默认使用欧式距离
    • 例:客户分群基于年龄、收入、消费频次的几何距离
  3. 物理仿真

    • 计算粒子间的真实空间距离
    • 例:分子动力学模拟中原子间距计算

⚠️ 使用注意

  • 必须进行特征标准化(量纲不统一会导致失真)
  • 高维数据中效果变差(需降维或改用余弦相似度)

🌰 对比案例:用户画像匹配

假设有三个用户的特征向量(已标准化):

用户A: [0.9, 0.2, 0.5]
用户B: [0.8, 0.3, 0.4]
用户C: [-0.5, 0.7, 0.1]
度量方式 A vs B A vs C 结论
曼哈顿距离 0.1+0.1+0.1=0.3 1.4+0.5+0.4=2.3 A与B更相似
余弦相似度 0.995 -0.254 A与B方向几乎一致
欧式距离 √(0.01+0.01+0.01)=0.173 √(1.96+0.25+0.16)=1.54 A与B更接近

🔧 使用场景决策树

是否关注方向而非大小? → 是 → 余弦相似度  
                ↓否  
是否需要抗异常值? → 是 → 曼哈顿距离  
                ↓否  
数据维度是否<50? → 是 → 欧式距离  
                ↓否  
使用余弦相似度或降维后欧式距离

🐍 Python代码实现

import numpy as np
from scipy.spatial import distance

# 样本数据
v1 = np.array([0.9, 0.2, 0.5])
v2 = np.array([0.8, 0.3, 0.4])

# 曼哈顿距离
manhattan = distance.cityblock(v1, v2)  # 输出0.3

# 余弦相似度
cosine_sim = 1 - distance.cosine(v1, v2)  # 输出0.995

# 欧式距离
euclidean = distance.euclidean(v1, v2)  # 输出0.173

终极总结

  • 想计算实际路径距离 → 曼哈顿距离 🏙️
  • 要比较方向相似性 → 余弦相似度 🧭
  • 需测量直线几何距离 → 欧式距离 📏
    选择正确的距离度量,就像为不同交通工具选择最佳导航模式! 🚕✈️🚀
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容