当前位置: 首页 > article >正文

用Python实现切比雪夫距离:从国际象棋到KNN算法的实战指南

用Python实现切比雪夫距离从国际象棋到KNN算法的实战指南想象一下国际象棋棋盘上的国王它每一步可以朝任意方向移动一格——横着走、竖着走甚至斜着走。这种看似简单的移动规则背后隐藏着一个强大的数学概念切比雪夫距离。当我们将这个棋盘上的智慧迁移到数据科学领域会发现它在处理某些机器学习问题时展现出惊人的实用性。本文将带您从棋盘格到代码亲手实现这个优雅的距离度量方法并探索它在K近邻算法中的独特价值。1. 棋盘启程理解切比雪夫距离的本质在国际象棋中国王从棋盘的一个位置移动到另一个位置所需的最少步数就是这两个位置之间的切比雪夫距离。比如从a1到b2国王只需一步斜向移动而从a1到c3则需要两步。这种距离计算方式与我们熟悉的直线距离欧氏距离或城市街区距离曼哈顿距离有着本质区别。切比雪夫距离的数学定义简洁而有力对于n维空间中的两个点x和y它们的切比雪夫距离是各坐标数值差绝对值的最大值。用公式表示为D(x, y) max(|x₁ - y₁|, |x₂ - y₂|, ..., |xₙ - yₙ|)这种距离度量特别适合那些最短板决定整体的场景。比如在物流中当我们需要确保所有货物同时到达时最后到达的货物决定了整体时间——这正是切比雪夫距离的用武之地。切比雪夫距离的三大特性各向同性在所有方向上同等对待最大值导向只关注最大差异维度尺度不变不受单位或量纲影响2. Python实现从基础函数到向量化计算让我们先用纯Python实现一个基础的切比雪夫距离计算函数def chebyshev_distance(x, y): 计算两个点之间的切比雪夫距离 return max(abs(a - b) for a, b in zip(x, y))这个简单版本虽然直观但在处理大数据集时效率不高。借助NumPy的向量化运算我们可以大幅提升计算性能import numpy as np def chebyshev_distance_vectorized(x, y): 向量化实现的切比雪夫距离 return np.max(np.abs(np.array(x) - np.array(y)))对于需要在数据集中批量计算距离矩阵的场景scipy提供了现成的解决方案from scipy.spatial.distance import cdist points np.random.rand(100, 2) # 100个二维点 distance_matrix cdist(points, points, chebyshev)3. 可视化对比三种距离度量的差异为了直观理解切比雪夫距离的特性我们将其与欧氏距离和曼哈顿距离进行可视化对比。假设以原点(0,0)为中心绘制距离为1的单位圆import matplotlib.pyplot as plt theta np.linspace(0, 2*np.pi, 100) x np.cos(theta) y np.sin(theta) plt.figure(figsize(12, 4)) plt.subplot(131) plt.plot(x, y) plt.title(欧氏距离) plt.subplot(132) plt.plot(np.sign(x)*np.minimum(np.abs(x)np.abs(y), 1), np.sign(y)*np.minimum(np.abs(x)np.abs(y), 1)) plt.title(曼哈顿距离) plt.subplot(133) square_x np.concatenate([np.linspace(-1,1,50), np.ones(50), np.linspace(1,-1,50), -np.ones(50)]) square_y np.concatenate([-np.ones(50), np.linspace(-1,1,50), np.ones(50), np.linspace(1,-1,50)]) plt.plot(square_x, square_y) plt.title(切比雪夫距离) plt.tight_layout() plt.show()这三种距离度量形成的单位圆形状截然不同欧氏距离完美的圆形曼哈顿距离旋转45度的正方形切比雪夫距离正放的正方形4. KNN实战切比雪夫距离的分类效果在scikit-learn中使用切比雪夫距离实现KNN分类器非常简单from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据 iris load_iris() X_train, X_test, y_train, y_test train_test_split( iris.data, iris.target, test_size0.3, random_state42) # 创建使用不同距离度量的KNN分类器 knn_euclidean KNeighborsClassifier(metriceuclidean) knn_manhattan KNeighborsClassifier(metricmanhattan) knn_chebyshev KNeighborsClassifier(metricchebyshev) # 训练并评估模型 for name, model in [(欧氏距离, knn_euclidean), (曼哈顿距离, knn_manhattan), (切比雪夫距离, knn_chebyshev)]: model.fit(X_train, y_train) score model.score(X_test, y_test) print(f{name}准确率: {score:.3f})在实际项目中切比雪夫距离特别适合以下场景特征之间尺度差异大分类边界呈现方形特征需要抑制异常值的影响5. 进阶应用距离度量的选择艺术选择距离度量不是简单的非此即彼而是需要根据数据特性和问题需求进行权衡。下面是一个距离度量选择指南场景特征推荐距离度量原因各维度尺度一致欧氏距离保持几何直觉高维稀疏数据曼哈顿距离对维度诅咒更鲁棒棋盘式移动切比雪夫距离反映实际移动成本文本数据余弦相似度关注方向而非大小分类变量汉明距离计算位差异距离度量调优技巧先进行特征标准化消除量纲影响使用交叉验证比较不同度量的效果考虑实现自定义距离函数对于图像数据可以尝试结合多种距离# 自定义距离函数示例 def hybrid_distance(x, y, alpha0.5): 混合欧氏距离和切比雪夫距离 euclidean np.sqrt(np.sum((x - y)**2)) chebyshev np.max(np.abs(x - y)) return alpha * euclidean (1 - alpha) * chebyshev # 在KNN中使用自定义距离 knn_custom KNeighborsClassifier(metrichybrid_distance, metric_params{alpha: 0.7})6. 性能优化加速距离计算当处理大规模数据时距离计算可能成为性能瓶颈。以下是几种优化策略使用KD树或Ball树# 使用Ball树加速切比雪夫距离计算 knn_chebyshev_balltree KNeighborsClassifier( metricchebyshev, algorithmball_tree)距离计算的GPU加速import cupy as cp def gpu_chebyshev(x, y): 使用GPU计算切比雪夫距离 x_gpu cp.array(x) y_gpu cp.array(y) return cp.max(cp.abs(x_gpu - y_gpu)).get()近似最近邻搜索对于超大规模数据集可以考虑近似算法如LSH局部敏感哈希或HNSW分层可导航小世界图它们可以显著降低计算复杂度同时保持较高的准确率。7. 多维空间中的切比雪夫距离随着维度的增加切比雪夫距离展现出一些有趣的性质。在高维空间中几乎所有点都位于空间的边缘区域点与点之间的距离趋于相似维度诅咒切比雪夫距离相对更稳定我们可以通过实验观察这个现象dimensions range(1, 100) ratios [] for dim in dimensions: points np.random.rand(100, dim) dist_euclidean np.mean(cdist(points, points, euclidean)) dist_chebyshev np.mean(cdist(points, points, chebyshev)) ratios.append(dist_chebyshev / dist_euclidean) plt.plot(dimensions, ratios) plt.xlabel(维度) plt.ylabel(切比雪夫距离/欧氏距离) plt.title(高维空间中距离度量的行为变化) plt.show()这个实验表明随着维度增加切比雪夫距离与欧氏距离的比值会趋向一个稳定值而欧氏距离本身会变得不那么具有区分度。

相关文章:

用Python实现切比雪夫距离:从国际象棋到KNN算法的实战指南

用Python实现切比雪夫距离:从国际象棋到KNN算法的实战指南 想象一下国际象棋棋盘上的国王,它每一步可以朝任意方向移动一格——横着走、竖着走,甚至斜着走。这种看似简单的移动规则,背后隐藏着一个强大的数学概念:切比…...

用STM32CubeMX和HAL库驱动RC522 NFC模块,从零实现一个简易门禁(附完整代码)

基于STM32CubeMX与HAL库的RC522门禁系统开发实战 在智能硬件开发领域,NFC技术因其非接触式交互特性,已成为门禁系统的首选方案。本文将完整呈现如何利用STM32CubeMX图形化工具和HAL库,从零构建一个稳定可靠的RC522门禁系统。不同于传统寄存器…...

Vitis 2020.1编译MicroBlaze程序报错?别急着找CPU,先看看你的BRAM够不够用

Vitis 2020.1编译MicroBlaze程序报错?别急着找CPU,先看看你的BRAM够不够用 最近在Xilinx Vitis 2020.1环境下为MicroBlaze软核开发C程序时,遇到了一个看似简单却让人抓狂的问题——点击运行按钮后,系统弹窗提示"找不到microb…...

Java 25虚拟线程性能断崖式下跌事件复盘(附JFR火焰图+Arthas实时诊断脚本+可审计的线程生命周期规范)

第一章:Java 25虚拟线程性能断崖式下跌事件复盘(附JFR火焰图Arthas实时诊断脚本可审计的线程生命周期规范)某金融核心交易系统在升级至 JDK 25 EA build 2024-07-15 后,突发 P99 响应延迟从 8ms 暴增至 1.2s,TPS 下跌 …...

Linux RT 调度器的入队与出队:rt_enqueue_task/rt_dequeue_task

前言在工业自动化、自动驾驶、机器人控制、5G 基站等强实时性业务场景中,Linux 的SCHED_FIFO/SCHED_RR实时调度策略是保障任务确定性执行的核心。RT 调度器区别于 CFS 完全公平调度器,严格按照任务优先级抢占执行,高优先级任务一旦就绪&#…...

Linux RT 调度器的优先级数组:struct rt_prio_array 的实现

前言在工业控制、自动驾驶、航空航天、5G 基站等强实时性场景中,Linux 的 PREEMPT_RT 补丁与原生实时调度类(SCHED_FIFO/SCHED_RR)是保障系统确定性的核心基石。与 CFS 完全公平调度器基于红黑树的时间片分配不同,实时调度器的核心…...

告别玄学调试:用Wireshark抓包实战解析PCIe链路训练与有序集(TS1/TS2/EIOS全解)

从信号到问题:Wireshark抓包实战解码PCIe链路训练全流程 当一块全新的PCIe显卡无法被系统识别,或是企业级NVMe存储阵列频繁出现链路降速时,硬件工程师的调试台上总少不了一台运行Wireshark的笔记本和几个神秘的TS序列。这些看似简单的有序集&…...

告别迷茫!手把手教你用CANoe 15.0从零搭建第一个仿真工程(附DBC文件创建)

告别迷茫!手把手教你用CANoe 15.0从零搭建第一个仿真工程(附DBC文件创建) 第一次打开CANoe软件时,面对密密麻麻的菜单栏和复杂的配置选项,很多初学者都会感到无从下手。本文将带你一步步完成从工程创建到DBC文件配置的…...

告别sc.exe!用NSSM把任意exe变成Windows服务(附Frpc实战配置)

告别sc.exe!用NSSM把任意exe变成Windows服务(附Frpc实战配置) 在Windows服务器管理中,将应用程序转化为系统服务一直是运维人员的刚需。传统sc.exe命令虽然功能完整,但其晦涩的语法和有限的配置选项常让人望而生畏。当…...

DIY智能家居控制面板:用ESP8266和TM1629A打造低成本数码管时钟/温湿度显示器

DIY智能家居控制面板:用ESP8266和TM1629A打造低成本数码管时钟/温湿度显示器 周末在家捣鼓电子元件时,突然想到能不能用闲置的数码管做个既实用又酷炫的桌面小工具。于是就有了这个项目——一个不到百元成本的智能显示面板,既能精准报时又能监…...

LVGL Spinner控件调参避坑指南:从卡顿到丝滑,我只改了这两个参数

LVGL Spinner控件性能调优实战:从参数解析到流畅动画的终极方案 在嵌入式GUI开发中,加载动画的流畅度往往直接关系到用户体验的第一印象。最近在开发智能家居控制面板时,我发现一个有趣的现象:同样的LVGL Spinner控件,…...

异步电路后端实现:从CDC约束到SignOff的实战解析

1. 异步电路后端实现的核心挑战 在复杂SoC设计中,异步时钟域交叉(CDC)问题就像城市间的交通管制——不同节奏的时钟域如同不同时区的城市,数据在这些区域间传输时,稍有不慎就会引发"交通事故"。作为后端工程…...

如何快速解决苹果设备Windows连接问题:一键驱动安装终极指南

如何快速解决苹果设备Windows连接问题:一键驱动安装终极指南 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/…...

ESP32 + micro-ROS实战:手把手教你用Action Server做个智能小车遥控器

ESP32 micro-ROS实战:手把手教你用Action Server做个智能小车遥控器 在机器人开发领域,实时控制与反馈一直是个技术难点。想象一下,当你需要远程控制一台智能小车完成复杂动作时,简单的指令发送往往不够——你需要知道小车是否成…...

STM32+FreeModbus实战:用AHT20传感器搭建低成本温湿度监测从机(附完整代码)

STM32FreeModbus实战:用AHT20传感器搭建低成本温湿度监测从机(附完整代码) 在工业物联网和智能家居领域,温湿度监测是最基础也最普遍的需求之一。如何用最低的成本构建一个稳定可靠的监测节点?本文将带你从零开始&…...

强化学习基础(RL)笔记

pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…...

Linux DTS配置避坑指南:以GC8034/OV系列Camera的I2C地址和引脚复用为例

Linux设备树配置实战:从GC8034/OV系列Camera的I2C地址陷阱到引脚复用优化 当你在凌晨三点的实验室里盯着示波器上那条毫无波动的I2C信号线时,是否曾怀疑过人生?作为嵌入式Linux开发者,我们或多或少都经历过这种绝望——特别是当面…...

从“国王-男人+女人=女王”到推荐系统:Word2Vec的Skip-gram与CBOW模型,到底该怎么选?

从词向量到业务落地:Skip-gram与CBOW模型工程选型指南 当我们在电商平台搜索"机械键盘"时,推荐系统会自动提示"游戏鼠标";当我们在音乐APP收听周杰伦的歌曲时,系统会推荐类似风格的歌手——这些智能推荐背后&…...

NRF52840 USB CDC例程里那个1Hz定时器,到底该怎么用才不踩坑?

NRF52840 USB CDC例程中1Hz定时器的深度优化指南 从32768到精准定时:理解低频时钟的奥秘 第一次接触NRF52840的开发者往往会对例程中那个神秘的32768数值感到困惑。这个数字并非随意选取,而是与芯片内部的低频时钟源(LFCLK)直接相关。NRF52840默认使用32…...

从GCC切换到Clang:在Qt 5.12.9项目中体验更快的代码分析与静态检查

从GCC切换到Clang:在Qt 5.12.9项目中体验更快的代码分析与静态检查 当你的Qt项目逐渐膨胀到数万行代码时,是否经历过这样的场景:修改一个头文件后,IDE的代码补全需要等待5秒才能响应;或者明明存在潜在的类型转换风险&a…...

Qwen2.5-0.5B-Instruct环保监测:野外设备数据解析AI部署

Qwen2.5-0.5B-Instruct环保监测:野外设备数据解析AI部署 想象一下这个场景:你是一名环保工程师,负责监测一片偏远湿地的水质。你的设备每隔一小时就会通过卫星链路传回一串数据,里面包含了水温、pH值、溶解氧、浊度等十几个参数。…...

从‘小白人转圈’到丝滑移动:详解UE角色蓝图里4种方向向量的正确用法

从‘小白人转圈’到丝滑移动:详解UE角色蓝图里4种方向向量的正确用法 在虚幻引擎的角色开发中,方向向量的选择往往决定了角色行为的精准度与自然度。许多开发者都遇到过这样的场景:明明按照教程连接了移动输入节点,角色却开始原地…...

Xamarin跨平台开发实战:为仓储盘点APP集成东大PDA扫码模块

Xamarin跨平台开发实战:为仓储盘点APP集成东大PDA扫码模块 在仓储管理和物流盘点场景中,快速准确的条码扫描是提升工作效率的关键。传统手机摄像头扫码方案在工业级场景下往往力不从心——扫描速度慢、对焦困难、弱光环境表现差等问题频出。而专为工业环…...

支付宝沙箱验签踩坑记:Hutool JSONObject格式化参数设置不当引发的invalid-signature

支付宝沙箱验签失败深度解析:Hutool JSON格式化参数引发的隐形陷阱 当你在Java项目中集成支付宝支付功能时,是否遇到过这样的场景:本地测试一切正常,但一旦接入沙箱环境就频繁报错"invalid-signature"?这个问…...

从调频信号(Chirp)到故障诊断:手把手教你用MATLAB玩转瞬时频率分析

从调频信号到故障诊断:MATLAB瞬时频率分析实战指南 轴承发出异常声响的第三天,王工在车间控制室里盯着屏幕上一段看似普通的振动波形皱起了眉头。传统频谱分析显示没有明显异常,但设备运行时那种微妙的"咔嗒"声始终挥之不去。这时&…...

Windows/Mac/Linux三平台通用!EISeg图像标注工具保姆级安装教程(附模型下载)

Windows/Mac/Linux三平台通用!EISeg图像标注工具保姆级安装教程(附模型下载) 在计算机视觉项目的开发流程中,高质量的数据标注往往是决定模型性能上限的关键因素。EISeg作为PaddlePaddle生态中的交互式图像分割标注工具&#xff0…...

JDK26 G1ZGC 双引擎升级:高并发应用吞吐量暴涨 真相

很多开发者对GC的认知还停留在"调参玄学"阶段,认为GC优化就是反复调整几个参数碰运气。但JDK26的GC改进完全打破了这个认知,它不是简单的参数微调,而是从算法设计、内存布局、并发执行到JIT协同的全方位重构。一、JDK26 GC演进的核…...

Python和LabVIEW搞TCP通信,这3个坑我帮你踩过了(附完整调试流程)

Python与LabVIEW的TCP通信实战:避坑指南与完整调试流程 当Python遇上LabVIEW,TCP通信的跨平台协作看似简单,实则暗藏玄机。作为一位在工业自动化领域摸爬滚打多年的开发者,我曾无数次见证看似完美的代码在实际运行中崩溃的场景。本…...

Spring Boot 4.0:云原生 Java 开发的范式革命

上周帮一个客户升级他们的微服务,从Spring Boot 3.2直接跳到了4.0,整个过程比我预想的顺利太多。原本预估需要两周的工作量,最后只用了三天就完成了核心业务的迁移,而且性能提升了37%,内存占用降低了29%。这让我不得不…...

如果外星人用‘微信’:从射电信号到中微子通信,地外文明可能用什么技术?

星际通信技术图谱:从射电望远镜到量子信标的文明探测革命 深夜的射电望远镜阵列像一群虔诚的朝圣者,将金属抛物面天线对准银河系中心方向。工程师小李调整着贵州FAST望远镜的接收频率,突然在1420MHz附近捕捉到一组规律脉冲——这个被称为&quo…...