8种距离度量 Python 实战:从欧式到马氏,3个维度对比代码实现
8种距离度量 Python 实战从欧式到马氏3个维度对比代码实现在数据科学和机器学习领域距离度量是许多算法的核心基础。无论是KNN分类、K-Means聚类还是推荐系统中的相似度计算选择合适的距离度量方法直接影响模型效果。本文将带你用Python实现8种经典距离度量并通过实际代码对比它们的特性。1. 距离度量基础与Python环境准备距离度量本质上是衡量两个对象相似程度的数学方法。在机器学习中我们通常将数据表示为向量然后通过计算向量之间的距离来判断它们的相似性。不同的距离度量方法适用于不同的场景和数据特性。首先确保你的Python环境已安装必要的科学计算库import numpy as np from scipy.spatial import distance from sklearn.preprocessing import StandardScaler from sklearn.datasets import make_blobs import time我们创建一个简单的二维数据集用于演示# 生成示例数据 np.random.seed(42) data np.random.rand(10, 2) * 10 # 10个二维点 point_a data[0] # [6.965, 1.635] point_b data[1] # [1.025, 1.857]2. 8种距离度量的Python实现2.1 欧式距离 (Euclidean Distance)欧式距离是最直观的距离度量表示n维空间中两点间的直线距离。其数学定义为$$ d(p,q) \sqrt{\sum_{i1}^n (p_i - q_i)^2} $$Python实现def euclidean_dist(a, b): return np.sqrt(np.sum((a - b)**2)) # 使用scipy验证 assert euclidean_dist(point_a, point_b) distance.euclidean(point_a, point_b)适用场景KNN、K-Means等算法中默认的距离度量适用于各维度相关性较小且尺度相似的数据。2.2 曼哈顿距离 (Manhattan Distance)曼哈顿距离又称城市街区距离得名于在规则街区网格中行走的实际距离。计算公式为$$ d(p,q) \sum_{i1}^n |p_i - q_i| $$Python代码def manhattan_dist(a, b): return np.sum(np.abs(a - b)) # 验证 assert manhattan_dist(point_a, point_b) distance.cityblock(point_a, point_b)典型应用在路径规划和高维数据中表现良好对异常值比欧式距离更鲁棒。2.3 余弦相似度 (Cosine Similarity)余弦相似度通过测量两个向量夹角的余弦值来判断相似性忽略向量长度$$ \text{cosine}(p,q) \frac{p \cdot q}{|p| |q|} $$实现代码def cosine_sim(a, b): return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) # 验证 assert np.allclose(cosine_sim(point_a, point_b), 1 - distance.cosine(point_a, point_b))优势场景文本相似度计算、推荐系统等方向敏感的应用。2.4 汉明距离 (Hamming Distance)汉明距离衡量两个等长字符串在相同位置上不同字符的个数def hamming_dist(a, b): return np.sum(a ! b) / len(a) # 示例 str_a np.array([1, 0, 1, 1, 0]) str_b np.array([1, 1, 0, 1, 1]) print(f汉明距离: {hamming_dist(str_a, str_b):.2f}) # 输出0.60主要用途错误检测与纠正、基因序列比对等离散数据场景。2.5 切比雪夫距离 (Chebyshev Distance)切比雪夫距离定义为各坐标数值差的最大值源于国际象棋中国王的移动方式$$ d(p,q) \max_i |p_i - q_i| $$Python实现def chebyshev_dist(a, b): return np.max(np.abs(a - b)) # 验证 assert chebyshev_dist(point_a, point_b) distance.chebyshev(point_a, point_b)适用情况仓储物流路径规划、棋盘类游戏AI等场景。2.6 闵可夫斯基距离 (Minkowski Distance)闵可夫斯基距离是欧式距离和曼哈顿距离的推广形式$$ d(p,q) \left( \sum_{i1}^n |p_i - q_i|^p \right)^{1/p} $$参数p控制距离类型p1曼哈顿距离p2欧式距离p→∞切比雪夫距离代码实现def minkowski_dist(a, b, p): return np.sum(np.abs(a - b)**p)**(1/p) # 验证与欧式距离等价 assert np.isclose(minkowski_dist(point_a, point_b, 2), euclidean_dist(point_a, point_b))2.7 标准化欧式距离 (Standardized Euclidean)针对各维度尺度差异大的数据先标准化再计算欧式距离def standardized_euclidean(a, b, data): scaler StandardScaler() scaled_data scaler.fit_transform(data) a_scaled scaler.transform([a])[0] b_scaled scaler.transform([b])[0] return euclidean_dist(a_scaled, b_scaled)解决痛点当特征量纲不一致时避免某些维度主导距离计算。2.8 马氏距离 (Mahalanobis Distance)马氏距离考虑特征间的相关性适用于非球形分布数据$$ d(p,q) \sqrt{(p-q)^T S^{-1} (p-q)} $$其中S是协方差矩阵。Python实现def mahalanobis_dist(a, b, data): cov np.cov(data.T) inv_cov np.linalg.inv(cov) diff a - b return np.sqrt(diff.T inv_cov diff) # 生成相关数据验证 correlated_data make_blobs(n_samples100, centers1, n_features2, random_state42)[0] point_c correlated_data[0] point_d correlated_data[1] print(f马氏距离: {mahalanobis_dist(point_c, point_d, correlated_data):.2f})核心优势自动处理特征间的线性相关性对尺度变化不敏感。3. 三维度对比分析我们从计算效率、适用场景和异常值敏感性三个维度系统对比这8种距离度量距离度量计算速度典型应用场景异常值敏感性欧式距离⚡⚡⚡空间距离、KNN、K-Means高曼哈顿距离⚡⚡⚡高维数据、路径规划中余弦相似度⚡⚡文本相似度、推荐系统低汉明距离⚡⚡⚡⚡错误检测、基因序列不适用切比雪夫距离⚡⚡⚡棋盘游戏、仓储物流高闵可夫斯基距离⚡⚡可调参数适应不同场景取决于p值标准化欧式⚡⚡多尺度特征数据中马氏距离⚡非球形分布、相关特征低性能提示在大型数据集上欧式距离和曼哈顿距离计算效率最高而马氏距离由于涉及矩阵求逆计算成本较高。4. 实战应用KNN中的距离度量选择我们通过一个完整的KNN分类示例展示不同距离度量的实际影响from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 准备数据 X, y make_blobs(n_samples1000, centers3, n_features5, random_state42) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3) # 测试不同距离度量 metrics [euclidean, manhattan, cosine, mahalanobis] results {} for metric in metrics: start time.time() if metric mahalanobis: knn KNeighborsClassifier(n_neighbors5, metricmetric, metric_params{V: np.cov(X_train.T)}) else: knn KNeighborsClassifier(n_neighbors5, metricmetric) knn.fit(X_train, y_train) preds knn.predict(X_test) acc accuracy_score(y_test, preds) time_cost time.time() - start results[metric] {accuracy: acc, time: time_cost} # 打印结果 print(KNN性能对比:) for metric, res in results.items(): print(f{metric:10} | 准确率: {res[accuracy]:.3f} | 耗时: {res[time]:.3f}s)典型输出结果可能显示欧式距离和曼哈顿距离准确率相近且计算最快马氏距离可能在某些数据集上表现更好但耗时明显增加余弦相似度在文本类数据上表现突出5. 距离度量选择指南根据数据特性选择距离度量数据尺度各维度尺度相似欧式距离尺度差异大标准化欧式或马氏距离特征相关性特征独立欧式距离存在相关性马氏距离数据类型连续数值欧式/曼哈顿二进制/分类汉明距离文本数据余弦相似度算法效率要求大规模数据欧式或曼哈顿距离小规模高维数据可考虑马氏距离# 完整距离计算模块 class DistanceMetrics: staticmethod def euclidean(a, b): return np.sqrt(np.sum((a - b)**2)) staticmethod def manhattan(a, b): return np.sum(np.abs(a - b)) staticmethod def cosine(a, b): return 1 - np.dot(a, b)/(np.linalg.norm(a)*np.linalg.norm(b)) # 其他方法实现...在实际项目中建议先通过数据探索分析特征分布和相关性再选择2-3种候选距离度量进行实验比较最终根据模型表现确定最优方案。

相关新闻

iOS 4.3到10.6全兼容!Slash低版本系统适配方案与最佳实践

iOS 4.3到10.6全兼容!Slash低版本系统适配方案与最佳实践

iOS 4.3到10.6全兼容!Slash低版本系统适配方案与最佳实践 【免费下载链接】Slash A better way to create attributed strings 项目地址: https://gitcode.com/gh_mirrors/slash/Slash Slash是一个强大的富文本字符串处理库,专为iOS平台设计&…

2026/7/4 21:35:48阅读更多 →
Websocket-Rails性能优化:构建高并发实时应用的终极指南

Websocket-Rails性能优化:构建高并发实时应用的终极指南

Websocket-Rails性能优化:构建高并发实时应用的终极指南 【免费下载链接】websocket-rails Plug and play websocket support for ruby on rails. 项目地址: https://gitcode.com/gh_mirrors/we/websocket-rails Websocket-Rails作为Ruby on Rails的即插即用…

2026/7/4 21:35:48阅读更多 →
nwpu-cram之信息检索:算法与实现 - 西北工业大学软件学院复习资料宝库解析 [特殊字符]

nwpu-cram之信息检索:算法与实现 - 西北工业大学软件学院复习资料宝库解析 [特殊字符]

nwpu-cram之信息检索:算法与实现 - 西北工业大学软件学院复习资料宝库解析 🚀 【免费下载链接】nwpu-cram 西北工业大学/西工大/nwpu/npu软件学院复习(突击)资料!! 项目地址: https://gitcode.com/GitHub_Trending/nw/nwpu-cram…

2026/7/4 21:35:48阅读更多 →
Windows智能体开发前瞻:从系统集成到实战应用

Windows智能体开发前瞻:从系统集成到实战应用

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度 在AI技术浪潮席卷全球的今天,开发者们正面临着一个核心挑战:如何让强大的AI智能体(AI Agent&…

2026/7/4 22:41:01阅读更多 →
基于ResNet50的皮肤病智能诊断系统开发实战

基于ResNet50的皮肤病智能诊断系统开发实战

1. 项目背景与核心价值皮肤病变的早期识别和分类一直是临床医学中的关键挑战。传统诊断方式高度依赖医生的经验判断,存在主观性强、效率低下等问题。我在三甲医院皮肤科的实际调研中发现,常见皮肤病的误诊率可达15%-20%,特别是黑色素瘤等恶性…

2026/7/4 22:41:01阅读更多 →
构建高效术语速查表:提升技术文档理解与团队协作

构建高效术语速查表:提升技术文档理解与团队协作

1. 为什么每个领域都需要术语速查表?刚入行时最头疼的就是满屏的专业术语——第一次看到"鲁棒性"、"幂等性"这类词时,我对着搜索引擎查了半小时才搞明白。后来养成了做术语表的习惯,发现这简直是新手期的作弊器。术语表不…

2026/7/4 22:41:01阅读更多 →
Claude Code Skills:AI助手自定义技能开发与自动化实战指南

Claude Code Skills:AI助手自定义技能开发与自动化实战指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度 Claude Code 的 Skills 功能,是开发者提升 AI 助手工作效率的“超级武器”。它让你能把那些重复粘贴的指令、复杂的多步…

2026/7/4 22:41:01阅读更多 →
基于深度学习的实时疲劳驾驶检测系统设计与实现

基于深度学习的实时疲劳驾驶检测系统设计与实现

1. 项目背景与核心价值疲劳驾驶是交通事故的重要诱因之一。根据相关研究,连续驾驶4小时后,驾驶员的反应速度会下降50%以上。这个毕业设计项目通过深度学习技术实现了实时疲劳检测和驾驶行为分析系统,具有以下核心价值:实时性&…

2026/7/4 22:41:01阅读更多 →
ESP32实战:Wi-Fi四次握手捕获与钓鱼热点搭建原理详解

ESP32实战:Wi-Fi四次握手捕获与钓鱼热点搭建原理详解

1. 项目概述:从ESP32到无线安全实战最近在折腾ESP32,发现这枚小小的芯片在无线安全领域能玩出不少花样。很多人用它来做智能家居、物联网传感器,但今天我想聊聊一个更“硬核”的玩法:如何利用ESP32进行Wi-Fi安全原理的实战演示&am…

2026/7/4 22:36:01阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/4 14:25:39阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/4 14:57:00阅读更多 →
端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

1. 项目概述:当算法工程师走进GTC26展厅,看到的不是芯片,而是“端到端”的呼吸节奏“端到端”这三个字,在GTC’26现场出现的频率,高得像NVLink带宽测试时的峰值曲线——它不再是一个论文里的技术路径选项,而…

2026/7/4 0:02:48阅读更多 →
缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考牙齿缺失是中老年人群中较为常见的口腔问题,不仅会造成咀嚼不便、进食受影响,长期还可能对营养摄入与日常社交带来困扰。义齿是改善缺牙问题的常用方式,目前市面上的义齿种类较多,…

2026/7/4 0:02:48阅读更多 →
STM32F091RC与LTC6904实现高精度方波信号生成

STM32F091RC与LTC6904实现高精度方波信号生成

1. 项目概述:LTC6904与STM32F091RC的精准方波生成方案在嵌入式系统开发中,精确的时钟信号和定时控制往往是项目成败的关键。LTC6904作为一款低功耗、高精度的可编程振荡器芯片,与STM32F091RC这款ARM Cortex-M0内核微控制器的组合,…

2026/7/4 0:02:48阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/4 1:16:56阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/4 2:33:55阅读更多 →