【ShuQiHere】距离度量在 KNN 算法中的应用:欧几里得距离与曼哈顿距离

news2024/10/22 13:50:51

【ShuQiHere】

在机器学习和数据挖掘领域,K 最近邻算法(K-Nearest Neighbors,简称 KNN)是一种简单 yet 强大的非参数监督学习方法。KNN 的核心在于度量样本之间的距离,从而确定样本的相似性。距离度量的选择直接影响 KNN 的性能和准确性。在本文中,我们将深入探讨两种常用的距离度量方法:欧几里得距离(Euclidean Distance)和曼哈顿距离(Manhattan Distance),并探讨它们在 KNN 算法中的应用与区别。💡


一、K 最近邻算法概述 📚

1.1 什么是 KNN?

KNN 是一种基于实例的学习算法,主要用于分类和回归任务。其核心思想是:给定一个待预测样本,寻找训练集中与其最接近的 K 个邻居,根据这些邻居的信息来进行预测

  • 分类任务:通过投票方式,选择出现频率最高的类别作为预测结果。
  • 回归任务:取 K 个邻居目标值的平均值作为预测结果。

1.2 距离度量在 KNN 中的重要性

在 KNN 中,距离度量是关键因素。它决定了哪些邻居是“最近”的,从而影响预测结果的准确性。不同的距离度量方法会导致不同的邻居选择,因此选择合适的距离度量对于 KNN 的性能至关重要。


二、欧几里得距离(Euclidean Distance)📏

2.1 定义

欧几里得距离是最常用的距离度量方法,表示两个点之间的直线距离。在二维空间中,它就是平面上两点之间的最短路径。

2.2 公式

对于两个 n 维向量或点 p p p q q q,欧几里得距离定义为:

d Euclidean ( p , q ) = ∑ i = 1 n ( p i − q i ) 2 d_{\text{Euclidean}}(p, q) = \sqrt{\sum_{i=1}^{n} (p_i - q_i)^2} dEuclidean(p,q)=i=1n(piqi)2

  • p i p_i pi q i q_i qi:点 p p p q q q 在第 i i i 个维度的坐标。

2.3 特点

  • 直观性:反映实际空间中的距离,易于理解。
  • 敏感性:对离群值和尺度变化敏感,需要进行数据标准化。
  • 应用广泛:适用于连续型变量,常用于低维空间。

2.4 在 KNN 中的应用

在 KNN 中,欧几里得距离用于计算待预测样本与训练集中每个样本的距离。举例来说,假设有一个待分类样本 x x x,我们需要计算 x x x 与训练集中所有样本的欧几里得距离,选取距离最小的 K 个样本作为邻居。

实际例子

假设有以下数据点:

  • 训练集样本: A ( 1 , 2 ) A(1, 2) A(1,2) B ( 4 , 6 ) B(4, 6) B(4,6) C ( 5 , 2 ) C(5, 2) C(5,2)
  • 待分类样本: X ( 3 , 4 ) X(3, 4) X(3,4)

计算 X X X 与每个训练样本的欧几里得距离:

  • d ( X , A ) = ( 3 − 1 ) 2 + ( 4 − 2 ) 2 = 4 + 4 = 8 ≈ 2.83 d(X, A) = \sqrt{(3 - 1)^2 + (4 - 2)^2} = \sqrt{4 + 4} = \sqrt{8} \approx 2.83 d(X,A)=(31)2+(42)2 =4+4 =8 2.83
  • d ( X , B ) = ( 3 − 4 ) 2 + ( 4 − 6 ) 2 = 1 + 4 = 5 ≈ 2.24 d(X, B) = \sqrt{(3 - 4)^2 + (4 - 6)^2} = \sqrt{1 + 4} = \sqrt{5} \approx 2.24 d(X,B)=(34)2+(46)2 =1+4 =5 2.24
  • d ( X , C ) = ( 3 − 5 ) 2 + ( 4 − 2 ) 2 = 4 + 4 = 8 ≈ 2.83 d(X, C) = \sqrt{(3 - 5)^2 + (4 - 2)^2} = \sqrt{4 + 4} = \sqrt{8} \approx 2.83 d(X,C)=(35)2+(42)2 =4+4 =8 2.83

根据距离, B B B 是距离 X X X 最近的邻居。

2.5 代码实现

import numpy as np
from collections import Counter

def euclidean_distance(a, b):
    return np.sqrt(np.sum((a - b) ** 2))

def knn_predict(X_train, y_train, X_test, k):
    distances = [euclidean_distance(X_test, x) for x in X_train]
    k_indices = np.argsort(distances)[:k]
    k_nearest_labels = [y_train[i] for i in k_indices]
    return Counter(k_nearest_labels).most_common(1)[0][0]

# 示例数据
X_train = np.array([[1, 2], [4, 6], [5, 2]])
y_train = ['A', 'B', 'A']
X_test = np.array([3, 4])

prediction = knn_predict(X_train, y_train, X_test, k=1)
print(f'预测结果: {prediction}')  # 输出:预测结果: B

三、曼哈顿距离(Manhattan Distance)🗺️

3.1 定义

曼哈顿距离表示在坐标轴方向上的绝对距离之和,类似于在城市的网格状街道中,从一个点到另一个点所需经过的街区数。

3.2 公式

对于两个 n 维向量或点 p p p q q q,曼哈顿距离定义为:

d Manhattan ( p , q ) = ∑ i = 1 n ∣ p i − q i ∣ d_{\text{Manhattan}}(p, q) = \sum_{i=1}^{n} |p_i - q_i| dManhattan(p,q)=i=1npiqi

3.3 特点

  • 鲁棒性:对离群值不敏感,计算结果更稳健。
  • 计算简便:不涉及平方和开方,计算速度较快。
  • 适合高维数据:在高维空间中表现良好。

3.4 在 KNN 中的应用

曼哈顿距离同样可以用于 KNN 算法,尤其在某些数据特征更适合使用绝对差值的场景下。

实际例子

使用上述相同的数据点,计算 X X X 与每个训练样本的曼哈顿距离:

  • d ( X , A ) = ∣ 3 − 1 ∣ + ∣ 4 − 2 ∣ = 2 + 2 = 4 d(X, A) = |3 - 1| + |4 - 2| = 2 + 2 = 4 d(X,A)=∣31∣+∣42∣=2+2=4
  • d ( X , B ) = ∣ 3 − 4 ∣ + ∣ 4 − 6 ∣ = 1 + 2 = 3 d(X, B) = |3 - 4| + |4 - 6| = 1 + 2 = 3 d(X,B)=∣34∣+∣46∣=1+2=3
  • d ( X , C ) = ∣ 3 − 5 ∣ + ∣ 4 − 2 ∣ = 2 + 2 = 4 d(X, C) = |3 - 5| + |4 - 2| = 2 + 2 = 4 d(X,C)=∣35∣+∣42∣=2+2=4

根据曼哈顿距离, B B B 仍然是距离 X X X 最近的邻居。

3.5 代码实现

def manhattan_distance(a, b):
    return np.sum(np.abs(a - b))

def knn_predict_manhattan(X_train, y_train, X_test, k):
    distances = [manhattan_distance(X_test, x) for x in X_train]
    k_indices = np.argsort(distances)[:k]
    k_nearest_labels = [y_train[i] for i in k_indices]
    return Counter(k_nearest_labels).most_common(1)[0][0]

prediction = knn_predict_manhattan(X_train, y_train, X_test, k=1)
print(f'预测结果: {prediction}')  # 输出:预测结果: B

四、距离度量的选择对 KNN 的影响 🎯

4.1 影响因素

  • 数据特征类型:如果特征之间存在较大的尺度差异,欧几里得距离可能会受到影响,曼哈顿距离可能更适合。
  • 异常值:曼哈顿距离对异常值更鲁棒。
  • 计算复杂度:曼哈顿距离计算速度更快。

4.2 实际案例分析

假设我们的数据存在一些异常值,例如某个特征的取值远大于其他特征。在这种情况下,欧几里得距离的平方项会放大这种差异,可能导致距离计算失真。而曼哈顿距离由于只计算绝对差值,受异常值影响较小。

4.3 数据标准化的重要性

无论使用哪种距离度量方法,数据标准化都是必要的。标准化可以消除特征之间的尺度差异,使得每个特征对距离计算的影响均等。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform([X_test])

五、总结与建议 📝

5.1 欧几里得距离 vs 曼哈顿距离

  • 欧几里得距离

    • 优点:直观,反映实际距离。
    • 缺点:对离群值敏感,计算复杂度较高。
  • 曼哈顿距离

    • 优点:计算简单,对离群值不敏感。
    • 缺点:在低维空间中可能不如欧几里得距离直观。

5.2 选择建议

  • 数据特征类型

    • 如果特征是连续型且没有明显的异常值,欧几里得距离是不错的选择。
    • 如果存在异常值或特征之间的尺度差异较大,考虑使用曼哈顿距离。
  • 维度

    • 在高维空间中,曼哈顿距离可能表现更好。
  • 计算资源

    • 曼哈顿距离计算速度更快,适合大规模数据集。

六、拓展阅读 📖

虽然本文主要讨论了欧几里得距离和曼哈顿距离,但在 KNN 算法中,还有其他距离度量方法可以使用,例如:

  • 闵可夫斯基距离(Minkowski Distance):是欧几里得距离和曼哈顿距离的广义形式。

    d Minkowski ( p , q ) = ( ∑ i = 1 n ∣ p i − q i ∣ p ) 1 / p d_{\text{Minkowski}}(p, q) = \left( \sum_{i=1}^{n} |p_i - q_i|^p \right)^{1/p} dMinkowski(p,q)=(i=1npiqip)1/p

    p = 1 p=1 p=1 时,等价于曼哈顿距离;当 p = 2 p=2 p=2 时,等价于欧几里得距离。

  • 马氏距离(Mahalanobis Distance):考虑了数据的相关性和尺度差异。

  • 切比雪夫距离(Chebyshev Distance):用于衡量在任一维度上的最大差值。


七、结语 🎉

在 KNN 算法中,距离度量的选择直接影响模型的性能和预测结果的准确性。欧几里得距离曼哈顿距离各有优缺点,选择哪种距离度量应根据具体的数据特点和应用场景。

希望通过本文的讲解,你能更深入地理解这两种距离度量方法,并在实际项目中做出明智的选择。😊


八、参考资料 📚

  • 《机器学习》 - 周志华
  • 《统计学习方法》 - 李航
  • Scikit-Learn 官方文档: https://scikit-learn.org/stable/modules/neighbors.html

作者:Your Name

如果你对本文有任何疑问或建议,欢迎留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2220840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.1_Linux发展与基础

Linux基础知识 Shell 命令执行环境: 命令提示符的组成:(用户名主机名)-[当前路径]权限提示符,例:(kali㉿kali)-[~]$ ~ 表示所在目录为家目录:其中root用户的家目录是/root,普通用户的家目录在/home下 # 表示用户的权…

Python酷库之旅-第三方库Pandas(148)

目录 一、用法精讲 671、pandas.Timestamp.day_name方法 671-1、语法 671-2、参数 671-3、功能 671-4、返回值 671-5、说明 671-6、用法 671-6-1、数据准备 671-6-2、代码示例 671-6-3、结果输出 672、pandas.Timestamp.dst方法 672-1、语法 672-2、参数 672-3、…

JAVA二手交易发布闲置好物回收系统小程序源码

🎉二手交易新风尚!发布闲置好物,回收系统助你环保又赚钱✨ 🏠闲置物品大变身,开启绿色生活新篇章🌿 嘿宝贝们!是不是家里总有一些东西,明明还很新却因为种种原因被束之高阁&#x…

PROFINET开发或EtherNet/IP开发嵌入式板有用于工业称重秤

这是一个真实案例,不过客户选择不透露其品牌名称。稳联技术的嵌入式解决方案助力工业称重设备制造商连接至任意工业网络。多网络连接使得称重设备能够轻松接入不同的控制系统,进而加快产品的上市时间。 我们找到了稳联技术的解决方案。他们成熟的技术与专…

使用Shell脚本对Java应用等服务进行启停控制(支持批量)

通过shell脚本对Java服务启停进行控制。支持单个服务和多个服务的 start、stop、status、restart。支持自定义启动命令。(不限于Java服务,适用于各类通过命令行启动的服务) 脚本名称为 runjar.sh , 底部提供源码。通过三部分进行说明&#xf…

【Dv2Admin】Django配置线上ws反向代理

在 Web 应用程序的部署过程中,安全性、稳定性和实时通信是开发者们普遍关注的重点。Django 是一个非常流行的 Web 框架,常与 Nginx 配合使用,以便实现反向代理、负载均衡以及 SSL 加密等功能。除此之外,实时功能(如 WebSocket)也是现代应用中经常使用的技术。 在项目中实…

用户一键注册登录(一)- 对接短信平台

1. 流程图 2. 详细设计 2.1 用户表结构设计 CREATE TABLE users (id varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,mobile varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 手机号,nickname varchar(16) CHARACT…

回忆Web编程的岁月变迁

目录 引子 记忆的片断 CGI / ISAPI 何为 CGI / ISAPI ? 一个小插曲 ASP与我的ASP Builder ASP编程技术 何为 Windows DNA ? 什么是 COM ? ASP.NET 什么是 ActiveX ? IntraBuilder与我的InterBuilder 结尾 引子 凌晨三点醒了,大多的时候是…

数据结构(JAVA)JDK17语法新增特性

目录 yield关键字var关键字空指针异常密封类接口中的私有方法instanceof其他 yield关键字 yield关键字用于case的代码块中返回值。 正常switch语句 public static void main(String[] args) {int result 0;String str "a";switch (str) {case "a" :resu…

根据发生异常的汇编指令以及函数调用堆栈,从内存的角度出发,估计出问题的可能原因,确定排查方向,快速定位C++软件问题

目录 1、前言 2、初步分析dump文件 3、加载更多模块的pdb文件,可能能看到更多行的函数调用堆栈 4、从内存的角度去看,估计是访问了野指针导致的,沿着这个怀疑的方向快速地定位了问题 5、最后 C软件异常排查从入门到精通系列教程&#xf…

【安当产品应用案例100集】024-BYOE及BYOK在IaaS场景中的应用

在云计算环境中,尤其是涉及到敏感数据时,企业用户可能会选择自带加密工具或密钥(即BYOE或BYOK),以确保数据在传输和存储过程中的安全性。这种方式可以防止云服务提供商访问或泄露加密数据,增强数据保护。 …

离散数学 第二讲 特殊集合和集合间关系 笔记 [电子科大]王丽杰

1.2 特殊集合与集合间关系 空集 不含任何元素的集合叫做空集(empty set),记作∅. 空集可以符号化为 ∅ { x ∣ x ≠ x } ∅ \{ x|x ≠ x\} ∅{x∣xx} . 空集是绝对唯一的。 全集 针对一个具体范围,我们考虑的所有对象的集合叫做全集(universal se…

基于springboot招聘信息管理系统设计与实现(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

视频美颜平台是如何搭建的?基于直播美颜SDK源码的开发技术详解

今天,笔者将详细讲解如何基于直播美颜SDK源码搭建视频美颜平台的技术路径。 一、理解视频美颜技术 视频美颜技术主要通过图像处理算法对视频流进行实时处理,包括肤色优化、瑕疵修复、面部特征增强等。实现这一目标需要高效的图像处理算法和稳定的实时渲…

5个最流行的图像嵌入模型对比

最近需要研究图像相似性搜索。我想知道基于架构训练方法的嵌入之间是否存在差异。但是,很少有博客比较几种模型之间的嵌入。因此,在这篇博客中,我将使用 Flickr 数据集 [6] 比较 EfficientNet [1]、ViT [2]、DINO-v2 [3]、CLIP [4] 和 BLIP-2…

Matlab软件进行金融时间序列数据的描述性统计代码

1、数据S&P500的收盘价格,return100*log(pt/pt-1) 方法1:用python代码 import numpy as np import pandas as pddef calculate_log_returns(prices):"""计算价格序列的对数收益率。参数:prices (numpy.array): 价格序列。返回:log_…

Mongodb基础用法【总结】

关系型数据库和非关系型数据库的区别 关系型数据库 1.在关系型数据库中,数据都是存储在表中的,对存储的内容有严格的要求 2.因为我们在创建表的时候久已经规定了表中的字段 存储的数据类型 是否为空 唯一标识等规则 3.由于操作的都是结构化的数据&#…

家政小程序搭建,数字化市场发展下的意义

家政服务行业作为当下社会生活中不可或缺的行业,需求量在逐渐增加,行业发展也趋向多样化。 随着数字化的浪潮,家政行业逐渐向数字化、智能化升级发展,推动行业高质量发展,迎合现代化发展趋势,这一转型为行…

83.【C语言】数据结构之顺序表的尾部插入和删除

目录 3.操作顺序表 2."伪"插入顺序表的元素 分析尾部插入函数SLPushBack 代码示例 SeqList.h main.c free(指针)出错的几种可能的原因 3."伪"删除顺序表元素 2.分析尾部删除函数SLPopBack 代码示例 错误检查 两种解决办法 1.判断size是否为负…

004-按照指定功能模块名称分组

按照指定功能模块名称分组 一、说明1.现在有一个需求:2.具体做法 二、代码案例三、效果展示 一、说明 1.现在有一个需求: 需要把一个功能模块的几个功能点放在同一个文档目录下,这几个功能点分布在不同的 Controller 2.具体做法 需要把他…