老码农眼中的“距离”

📅 发布时间:2026/10/14 15:32:05
老码农眼中的“距离”
【引】回忆与一个AI 产品经理的对话否则就可能真的忘记了......我们经常需要判断两个数据点之间的“相似程度”——比如给用户推荐喜欢的商品要先找到和他兴趣相近的用户做异常检测要找出和正常数据差异大的异常值聚类分析时要把相似的数据归为一类。而衡量这种“相似”或“差异”的核心工具就是距离指标。简单来说距离指标就像我们生活中用尺子量长度一样只不过它量的不是物理空间的长度而是数据之间的“差异度”。距离越近说明两个数据越相似距离越远差异就越大。在这里 老码农就尝试用最朴素的语言讲清楚机器学习中最常用的9个距离指标包括它们的含义、公式、简单示例以及实际应用场景哪怕是刚接触机器学习的朋友也能轻松看懂。一、欧几里得距离最直观的“直线距离”欧几里得距离应该是我们最熟悉的距离指标它的本质就是我们在初中几何里学的“两点之间直线距离”也是生活中最直观的距离概念。比如从家到公司走直线的距离就是欧几里得距离只不过在机器学习里这个“点”不再局限于二维平面还可以是三维、四维甚至更高维度的特征数据。它的计算逻辑很简单把两个数据点在每个维度上的差值平方加起来之后再开平方得到的结果就是两者的欧几里得距离。公式√[x₁ − x₂² y₁ − y₂²]如果是更高维度就继续往后加比如三维就是再加z₁-z₂²示例假设我们有两个二维数据点分别是1,2和4,6按照公式计算先算每个维度的差值x维度差是4-13y维度差是6-24然后把差值平方得到9和16加起来是25再开平方就是5。所以这两个点的欧几里得距离就是5。适用场景欧几里得距离最适合用于特征是数字且所有特征处于同一尺度的场景。比如在KNNK近邻算法中判断一个数据点的类别时就会用欧几里得距离找它最近的K个邻居K均值聚类中也常用它来衡量数据点和聚类中心的距离。需要注意的是如果特征尺度不一样比如一个特征是身高单位是厘米另一个是体重单位是公斤直接用欧几里得距离会有偏差需要先做数据归一化。二、余弦距离不看“长短”只看“方向”和欧几里得距离不同余弦距离不关心两个数据点的“绝对长度”只关心它们的“方向差异”。举个生活中的例子两个人评价一部电影一个人打了8分、7分另一个人打了4分、3.5分虽然分数高低不一样但他们的评价方向是一致的余弦距离就会认为这两个人的喜好很相似。在机器学习里我们通常把数据转换成向量余弦距离就是通过计算两个向量之间的夹角来衡量差异夹角越小距离越近相似度越高。它的公式是用1减去两个向量的余弦相似度这样距离越近数值就越小和其他距离指标的逻辑保持一致。公式1 − A · B / ||A||||B||其中A·B是两个向量的点积||A||和||B||分别是两个向量的模长示例假设向量A是1,0向量B是0,1先算点积1×0 0×1 0再算模长两个向量的模长都是√1²0²1代入公式就是1 - 0/(1×1) 1说明这两个向量方向完全相反差异最大。如果两个向量是1,2和2,4点积是1×2 2×410模长分别是√5和√20计算后余弦相似度是1余弦距离就是0说明两个向量方向完全相同相似度极高。适用场景余弦距离最适合用于衡量“内容相似度”和数据的绝对数值无关。比如自然语言处理中判断两篇文章的主题是否相似会把文章转换成词向量再用余弦距离计算推荐系统中基于用户的行为偏好向量判断用户兴趣相似度还有图像识别中的特征嵌入也常用余弦距离来衡量特征的相似性。三、汉明距离数“不同”的个数就够了汉明距离是一种很简单的距离指标它的核心就是“数差异”——统计两个等长的字符串或向量中对应位置上数值不同的个数个数越多距离越远。它的应用场景主要集中在离散数据尤其是二进制数据的比较。公式统计两个数据对应位置上x≠y的数量数量就是汉明距离示例比如两个二进制字符串10101和10011我们逐位对比第一位都是1相同第二位都是0相同第三位一个是1一个是0不同第四位一个是0一个是1不同第五位都是1相同。总共2个位置不同所以汉明距离就是2。再比如两个字符串“abcde”和“abxde”对比后发现第四位不同汉明距离就是1。适用场景汉明距离主要用于二进制特征的比较比如图像处理中的哈希值比较判断两张图片是否相似数据传输中的错误检测统计传输前后数据的差异判断是否出现传输错误还有推荐系统中用户的二进制行为特征比如是否点击、是否购买的比较也会用到汉明距离。四、曼哈顿距离像走城市街区一样的距离曼哈顿距离也叫“城市街区距离”这个名字很形象——就像我们在城市里走路不能走直线只能沿着街道水平或垂直移动从一个路口到另一个路口的距离就是曼哈顿距离。它的计算方式是把两个数据点在每个维度上的差值绝对值相加。公式|x₁ − x₂| |y₁ − y₂|更高维度同理依次加每个维度差值的绝对值示例还是用之前的两个点1,2和4,6计算曼哈顿距离的话先算x维度差值的绝对值|4-1|3y维度差值的绝对值|6-2|4加起来就是7所以曼哈顿距离是7比欧几里得距离的5要大这也符合我们在城市里走路比走直线远的常识。适用场景曼哈顿距离适合用于“基于网格”的场景比如地图导航中计算车辆在城市道路上的行驶距离路径规划问题中机器人在网格状的环境中移动衡量其移动的距离还有一些离散数据的聚类问题尤其是特征维度的差异需要独立计算的场景也会用到曼哈顿距离。五、闵可夫斯基距离欧几里得和曼哈顿的“通用版”闵可夫斯基距离不是一种具体的距离而是一个“通用公式”它把欧几里得距离、曼哈顿距离都包含在内通过调整一个参数p就能切换成不同的距离计算方式灵活性很高。公式Σ|xi − yi|^p^(1/p)其中p是一个参数取值为正数Σ表示对所有维度的差值绝对值的p次方求和示例当p1时公式就变成了Σ|xi − yi|也就是曼哈顿距离当p2时公式变成√Σ|xi − yi|²也就是欧几里得距离当p取无穷大时闵可夫斯基距离就变成了切比雪夫距离后面我们会讲到。比如还是用1,2和4,6这两个点p1时距离是7p2时距离是5p3时计算就是3³4³^(1/3)2764^(1/3)91^(1/3)≈4.497。适用场景闵可夫斯基距离适合用于需要灵活控制距离计算方式的场景。比如在聚类分析中如果我们不确定用欧几里得还是曼哈顿距离更合适就可以通过调整p的值找到最适合当前数据的距离计算方式在一些需要自定义距离权重的场景中也可以通过调整p突出不同维度的差异影响。六、雅卡尔距离衡量两个集合的“重叠度”雅卡尔距离主要用于衡量两个集合之间的差异它的核心是看两个集合的重叠程度——重叠的元素越多距离越近相似度越高。和余弦距离类似它也是用1减去雅卡尔相似度得到的。公式1 − |A ∩ B| / |A ∪ B|其中|A ∩ B|是两个集合的交集元素个数|A ∪ B|是并集元素个数示例假设集合A{1,2,3}集合B{2,3,4}先算交集两个集合都有的元素是2和3交集个数是2再算并集把两个集合的元素合并去掉重复的得到{1,2,3,4}并集个数是4代入公式就是1 - 2/4 0.5所以雅卡尔距离是0.5。如果两个集合完全相同比如A{a,b,c}B{a,b,c}交集和并集个数都是3距离就是0如果两个集合没有交集距离就是1。适用场景雅卡尔距离适合用于集合数据的比较比如推荐系统中比较两个用户的兴趣标签集合判断用户兴趣的相似度社交网络中比较两个用户的好友列表衡量社交关系的重叠度还有文本分析中比较两篇文章的关键词集合判断主题相似度。七、切比雪夫距离只看“最大差异”切比雪夫距离的核心是“抓重点”它只关注两个数据点在所有维度中差异最大的那个维度用这个最大的差值作为距离。简单来说就是“就高不就低”只要有一个维度差异很大整体距离就很大。公式max|x₁ − x₂||y₁ − y₂|……即所有维度差值绝对值中的最大值示例用1,2和4,6这两个点x维度差值是3y维度差值是4最大值是4所以切比雪夫距离就是4。再比如有一个三维点2,5,7和5,3,10三个维度的差值分别是3、2、3最大值是3切比雪夫距离就是3。适用场景切比雪夫距离适合用于“只关注最大差异”的场景。比如在物流配送中衡量两个仓库的货物库存差异只需要关注库存差距最大的那种货物在质量检测中判断两个产品的性能差异只关注差异最大的性能指标还有棋盘游戏中计算棋子的移动距离比如国际象棋中王的移动一步可以走任意方向一格切比雪夫距离就是1。八、哈弗赛因距离地球表面的“最短距离”前面的距离指标都是针对平面数据的但我们生活在地球上地球是一个球体计算两个地点之间的实际距离就不能用欧几里得距离了这时候就需要用到哈弗赛因距离。它专门用于计算地球表面两个点用经纬度表示之间的最短距离也就是“大圆距离”。公式d 2r arcsin[√sin²lat₂ − lat₁/2 coslat₁coslat₂sin²lon₂ − lon₁/2]其中r是地球半径约为6371公里lat₁、lat₂是两个点的纬度lon₁、lon₂是两个点的经度计算时需要把角度转换成弧度示例比如我们要计算北京纬度39.9°经度116.4°和上海纬度31.2°经度121.4°之间的哈弗赛因距离把经纬度转换成弧度后代入公式计算最终得到的距离大约是1067公里这和实际的地理距离基本一致。如果用欧几里得距离计算得到的结果会有很大偏差因为它没有考虑地球的曲率。适用场景哈弗赛因距离主要用于基于位置的服务比如地图导航中计算两个地点之间的直线距离外卖配送中计算骑手和商家、用户之间的距离还有地理信息系统GIS中分析地理位置的分布和关联。九、索伦森骰子距离给“共同元素”更多权重索伦森骰子距离和雅卡尔距离类似都是用于衡量两个集合的相似度但它的特点是“更看重共同元素”给共同元素赋予了更高的权重计算出来的距离会更能体现两个集合的重叠程度。公式1 − 2|A ∩ B|/ (|A| |B|)其中|A ∩ B|是交集元素个数|A|和|B|分别是两个集合的元素个数示例假设集合A{abc}集合B{bcd}交集个数是2A的元素个数是3B的元素个数是3代入公式就是1 - 2×2/(33) 1 - 4/6 ≈0.33也就是索伦森骰子距离约为0.33。对比雅卡尔距离这个例子中的雅卡尔距离是0.5说明索伦森骰子距离更能体现两个集合的重叠度。适用场景索伦森骰子距离适合用于需要突出共同元素的场景比如自然语言处理中比较两篇文档的词汇重叠度判断文档相似度生物信息学中比较两个基因序列的相似性还有图像分割中衡量两个分割结果的重叠程度。写在最后选对距离指标事半功倍看完这9个距离指标可能有朋友会问到底该选哪一个其实没有绝对的“最好”只有“最适合”。关键是要结合数据的类型和实际的业务场景如果是连续的数值特征且尺度一致优先用欧几里得距离如果是文本、向量等关注方向的场景用余弦距离如果是二进制、字符串等离散数据用汉明距离如果是地理位置数据就用哈弗赛因距离。在实际的机器学习项目中选对距离指标往往能让模型效果提升一个档次。比如做推荐系统时用余弦距离比欧几里得距离更能准确捕捉用户的兴趣相似度做异常检测时用切比雪夫距离能更快发现极端异常值。希望这篇文章能帮大家搞懂这些距离指标在后续的学习和工作中灵活运用少走弯路。【关联阅读】大模型应用的10种架构模式7B13B175B解读大模型的参数机器学习与微分方程的浅析浅析多模态机器学习清单管理面向机器学习中的数据集机器学习模型性能的10个指标机器学习系统架构的10个要素大模型应用系列从Ranking到Reranking大模型应用系列Query 变换的示例浅析从零构建大模型之Transformer公式解读如何选择Embedding Model关于嵌入模型的10个思考解读文本嵌入语义表达的练习解读知识图谱的自动构建“提示工程”的技术分类大模型系列提示词管理提示工程中的10个设计模式解读基于图的大模型提示技术大模型微调RHLF与DPO浅析Chunking基于大模型RAG系统中的文档分块大模型应用框架LangChain与LlamaIndex的对比选择解读大模型应用的可观测性大模型系列之解读MoE在大模型RAG系统中应用知识图谱面向知识图谱的大模型应用让知识图谱成为大模型的伴侣如何构建基于大模型的AppQcon2023: 大模型时代的技术人成长简论文学习笔记增强学习应用于OS调度《深入浅出Embedding》随笔LLM的工程实践思考大模型应用设计的10个思考基于大模型LLM的Agent 应用开发解读大模型的微调解读向量数据库解读向量索引解读ChatGPT中的RLHF解读大模型LLM的token解读提示工程Prompt Engineering解读Toolformer解读TaskMatrix.AI解读LangChain解读LoRA大模型系列——解读RAG大模型应用框架之Semantic Kernel浅析多模态机器学习大模型应用于数字人深度学习架构的对比分析老码农眼中的大模型LLM