
1. 距离度量的数学基础距离度量是机器学习中衡量样本相似性的核心工具。想象一下你要在超市里找到和手中苹果最相似的水果大脑会不自觉比较颜色、形状、大小等特征——这本质上就是在计算距离。数学上一个合格的距离函数需要满足四个基本公理非负性距离最小为零就像两个完全相同的苹果同一性距离为零当且仅当两个对象完全一致对称性从A到B的距离等于从B到A的距离三角不等式绕路总比直走远就像在超市里绕开货架取水果这些看似简单的规则却构建了机器学习中各种距离度量的理论基础。我在处理电商推荐系统时就遇到过违反对称性的案例——用户A喜欢B的商品列表但B却对A的喜好无感这时就需要调整距离计算方式。2. 欧氏空间的距离家族2.1 经典欧几里得距离最熟悉的直线距离公式源自初中几何import numpy as np def euclidean(a, b): return np.sqrt(np.sum((a - b)**2))这个距离对异常值非常敏感。记得有次分析用户行为数据一个极端值就让整个聚类结果失真。这时可以考虑先做标准化处理from sklearn.preprocessing import StandardScaler scaler StandardScaler() scaled_data scaler.fit_transform(raw_data)2.2 曼哈顿距离的现实意义在纽约曼哈顿街区你不能穿楼而过只能沿着街道直角行走。这种网格路径的距离就是def manhattan(a, b): return np.sum(np.abs(a - b))实测在分析稀疏的高维文本数据时曼哈顿距离比欧氏距离更稳定。我曾用它改进过新闻分类算法准确率提升了7%。2.3 闵可夫斯基距离的统一视角这其实是个距离家族通过参数p调节def minkowski(a, b, p): return np.power(np.sum(np.power(np.abs(a - b), p)), 1/p)当p1时退化为曼哈顿距离p2就是欧氏距离p趋近无穷大则变成切比雪夫距离。选择适合的p值很关键——在图像匹配项目中我们通过交叉验证发现p1.5时效果最佳。3. 特殊场景的距离度量3.1 文本处理的余弦相似度比较两篇文章的相似度更关注方向而非长度from sklearn.metrics.pairwise import cosine_similarity cos_sim cosine_similarity([text_vec1], [text_vec2])[0][0]处理知乎问答匹配时余弦相似度比欧氏距离更适合衡量文本语义相似性。但要注意停用词处理——有次因为的了等词干扰导致结果异常。3.2 概率分布的KL散度当需要比较两个概率分布的差异时from scipy.stats import entropy kl_div entropy(p_dist, q_dist)在构建推荐系统的多样性模块时我们用KL散度平衡推荐结果的集中度和覆盖率。但要注意它不是真正的距离——不满足对称性。3.3 时间序列的DTW距离语音识别中处理不同长度的序列from dtaidistance import dtw distance dtw.distance(series1, series2)这个算法能弹性对齐时间轴在分析股票走势相似性时特别有用。但计算复杂度较高需要适当设置窗口约束。4. 实践中的选择策略4.1 数据特性决定距离选择低维稠密数据欧氏距离高维稀疏数据余弦相似度分类特征汉明距离概率分布KL散度或JS散度时间序列DTW距离曾有个医疗数据集同时包含数值型检查指标和分类型症状描述我们最终采用了马氏距离结合杰卡德系数的混合度量方式。4.2 距离矩阵的优化计算当数据量很大时直接计算所有样本对的距离会非常耗时。可以使用以下优化from scipy.spatial.distance import pdist, squareform dist_matrix squareform(pdist(data, euclidean))或者更高效的BallTreefrom sklearn.neighbors import BallTree tree BallTree(data, metrichaversine)4.3 常见陷阱与解决方案维度灾难高维时所有样本距离趋同可用降维或子空间学习量纲差异记得做标准化或归一化计算效率近似算法或采样计算语义匹配单纯数值距离可能不符合业务逻辑在金融风控项目中我们就因为没考虑特征间的业务相关性导致距离度量失效。后来引入领域知识重新设计距离函数才解决问题。