首页 > 编程语言 >K-Nearest Neighbors (K-NN) 算法

K-Nearest Neighbors (K-NN) 算法

时间:2024-07-06 09:00:50浏览次数:17  
标签:Neighbors Nearest 样本 预测 NN 分类 算法 最近

前言

K-NN 算法最早出现在 1951 年,由 Thomas Cover 和 Peter Hart 在他们的论文"Nearest Neighbor Pattern Classification"中首次提出。

K-NN 算法的产生背景主要源于以下几个方面:

分类问题的需求

在现实生活中,许多问题都可以归结为分类问题,比如医疗诊断、图像识别、文本分类等。 K-NN 算法作为一种简单有效的分类算法,很好地满足了这种需求。

统计学习理论的发展

20世纪50年代,统计学习理论取得了较大进展,为机器学习算法的产生奠定了基础。K-NN 算法基于统计学习的思想,利用训练样本的分布来预测新样本的类别。

计算能力的提升

随着计算机硬件性能的不断提升,复杂的机器学习算法变得可以在实际应用中高效运行,这为 K-NN 算法的应用提供了可能。

邻域概念的广泛应用

在许多领域,"邻域"这个概念都有广泛的应用,比如空间分析、时间序列分析等。 K-NN 算法很好地利用了这个概念,将其应用到机器学习中。

总的来说,K-NN 算法的产生是机器学习理论与实践相结合的产物。它满足了现实应用中的分类需求,体现了统计学习理论的发展成果,并得益于计算技术的进步。

简介

K-NN 算法是一种非常常见的机器学习分类算法,它的基本原理如下:

  • 输入一个待分类的样本
  • 在训练样本中,找到与该样本最接近的 K 个样本
  • 根据这 K 个最近邻居的类别,来预测待分类样本的类别
    具体过程如下:

数据准备

  • 将训练数据集表示为 (X, y),其中 X 是特征矩阵, y 是对应的标签向量。
  • 将待预测的样本表示为 x。

距离计算

  • 选择合适的距离度量方法,常见的有欧氏距离、曼哈顿距离、余弦距离等。
  • 计算待预测样本 x 与训练样本集 X 中每个样本之间的距离。

找到 K 个最近邻

  • 对计算出的距离进行排序,找出距离 x 最近的 K 个训练样本。

类别预测

  • 根据这 K 个最近邻的类别标签,采用多数表决或加权投票的方式,预测 x 的类别。

K-NN 算法的优缺点

K-NN 算法的优点

  • 实现简单,易于理解和实现
  • 对异常值和噪声相对鲁棒
  • 可用于分类和回归问题
  • 可以处理多种类型的数据,如数值型、类别型等

K-NN 算法的缺点

  • 计算复杂度高,需要计算所有训练样本与待预测样本之间的距离
  • 需要手动选择合适的 K 值,不同的 K 值会导致不同的预测结果
  • 在高维特征空间中,性能会显著下降(维度灾难)
  • 对于大规模数据集,预测过程会非常慢

常见的优化方法

K-NN 算法的主要优化方法包括:

  • 使用高效的数据结构加速最近邻搜索
  • 采用近似最近邻搜索技术
  • 结合其他算法进行混合建模
    接下来我们逐一详细介绍这些优化方法,并给出 Python 代码示例:

使用高效的数据结构加速最近邻搜索

  • 常用的数据结构有 KD 树和 Ball 树

以 KD 树为例,实现如下:


from sklearn.neighbors import KDTree

# 训练 KD 树
kd_tree = KDTree(X_train, leaf_size=30)

# 查找最近邻
distances, indices = kd_tree.query(x_test, k=5)

KD 树通过递归地将数据空间划分为多个子空间,可以大大提高最近邻搜索的效率。

采用近似最近邻搜索技术

  • 局部敏感哈希 (Locality-Sensitive Hashing, LSH) 是一种常用的近似最近邻搜索技术

以 LSH 为例,实现如下:


from annoy import AnnoyIndex

# 训练 LSH 索引
lsh = AnnoyIndex(X_train.shape[1], metric='euclidean')
for i, x in enumerate(X_train):
    lsh.add_item(i, x)
lsh.build(10)

# 查找最近邻
nearest_neighbors = lsh.get_nns_by_vector(x_test, 5)

LSH 通过将相似的数据映射到同一个桶中,大大降低了最近邻搜索的时间复杂度。

结合其他算法进行混合建模

  • 将 K-NN 与其他算法如 SVM、神经网络等结合,形成混合模型

以 K-NN 与 SVM 的混合模型为例,实现如下:


from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline

# 构建混合模型
model = Pipeline([
    ('knn', KNeighborsClassifier(n_neighbors=5)),
    ('svm', SVC(kernel='rbf', C=1.0))
])

# 训练模型
model.fit(X_train, y_train)

# 预测新样本
y_pred = model.predict(x_test)

混合模型可以结合不同算法的优势,提高预测性能。

通过以上三种优化方法,我们可以显著提高 K-NN 算法的效率和性能。需要注意的是,不同的优化方法适用于不同的场景,需要根据实际问题的特点进行选择和调整。

应用场景

K-Nearest Neighbors (K-NN) 算法有着广泛的应用场景,主要包括以下几个方面:

分类问题

  • 图像识别:将图像分类为不同的物体、场景等
  • 文本分类:将文本分类为不同的类别,如新闻、广告、情感等
  • 医疗诊断:根据症状将患者划分为不同的疾病类别

回归问题

  • 房价预测:根据房屋的面积、位置等特征预测房价
  • 销量预测:根据产品的历史销售数据预测未来销量
  • 股票价格预测:根据股票的历史走势预测未来价格

推荐系统

  • 基于内容的推荐:根据用户喜好推荐相似的商品或内容
  • 基于协作过滤的推荐:根据用户之间的相似度推荐感兴趣的商品

异常检测

  • 金融欺诈检测:识别异常的金融交易行为
  • 网络入侵检测:识别网络中的异常活动

聚类分析

  • 客户细分:根据客户特征将其划分为不同的群体
  • 市场细分:根据消费者特征将市场划分为不同的细分市场

其他应用

  • 语音识别:根据语音特征将语音识别为文字
  • 图像检索:根据图像特征查找相似的图像
  • 天气预报:根据历史气象数据预测未来天气情况

总的来说,K-NN 算法作为一种简单有效的机器学习算法,在各种应用场景中都有广泛的应用前景。其易实现、无参数调整等特点使其成为非常实用的工具。当然,在具体应用中还需要结合实际情况进行优化和改进。

标签:Neighbors,Nearest,样本,预测,NN,分类,算法,最近
From: https://blog.csdn.net/qq_42691309/article/details/140207826

相关文章

  • Python基于卷积神经网络分类模型(CNN分类算法)实现时装类别识别项目实战
    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。1.项目背景在深度学习领域,卷积神经网络(ConvolutionalNeuralNetworks,CNNs)因其在图像识别和分类任务上的卓越表现而备受关注。CNNs能够自动检测图像中的特......
  • Golang channel底层是如何实现的?(深度好文)
    Hi你好,我是k哥。大厂搬砖6年的后端程序员。我们知道,Go语言为了方便使用者,提供了简单、安全的协程数据同步和通信机制,channel。那我们知道channel底层是如何实现的吗?今天k哥就来聊聊channel的底层实现原理。同时,为了验证我们是否掌握了channel的实现原理,本文也收集了channel的高......
  • IDEA运行时报错:Application Server was not connected before run configuration stop
    求求了,有没有大佬能看到呀,马上就考试了,运行不出来真的好烦躁无力呀,我在CSDN上看到了好多解决方法,但是我用过之后依旧没能解决。这是我的tomcat和jdk版本,版本应该没有问题吧,这也是老师发给我们的版本这是我的环境变量的配置; 这是我的tomca,jdk,以及IDEA的地址;  求......
  • MultipartFile resource [file] cannot be resolved to URL
    java.io.FileNotFoundException:MultipartFileresource[file]cannotberesolvedtoURLatorg.springframework.core.io.AbstractResource.getURL(AbstractResource.java:114)atorg.springframework.core.io.AbstractResource.getURI(AbstractResource.java:1......
  • pyinstaller打包onnxruntime-gpu报错找不到CUDA的解决方案
    问题说明:使用onnxruntime-gpu完成了深度学习模型部署,但在打包时发生了报错:找不到CUDA具体问题描述:RuntimeError:D:\a\_work\1\s\onnxruntime\python\onnxruntime_pybind_state.cc:857onnxruntime::python::CreateExecutionProviderInstanceCUDA_PATHissetbutCUDAwas......
  • 解决nacos报错 Caused by: io.grpc.netty.shaded.io.netty.channel.unix.Errors$Nati
    报错信息:org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)atorg.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)atorg......
  • 注解Annotation
    基本概念注解(Annotation)也叫做元数据,用于修饰包、类、方法、属性、构造器、局部变量等数据信息。和注释一样,注解不影响程序逻辑,但是注解可以被编译或运行,等同于嵌套在代码中的补充信息。在javaSE中,注解用于标记过时的功能,忽略警告等,在JavaEE中注解用于配置应用程序的任何切面,......
  • FAILED: cpu_adam.so /usr/bin/ld: cannot find -lcurand collect2: error: ld retur
    FAILED:cpu_adam.so c++cpu_adam.ocpu_adam_impl.o-shared-lcurand-L/home/deeplp/anaconda3/envs/minicpm/lib/python3.10/site-packages/torch/lib-lc10-ltorch_cpu-ltorch-ltorch_python-ocpu_adam.so/usr/bin/ld:cannotfind-lcurandcollect2:error:ld......
  • 结合RNN与Transformer双重优点,深度解析大语言模型RWKV
    本文分享自华为云社区《【云驻共创】昇思MindSpore技术公开课RWKV模型架构深度解析》,作者:Freedom123。一、前言Transformer模型作为一种革命性的神经网络架构,于2017年由Vaswani等人提出,并在诸多任务中取得了显著的成功。Transformer的核心思想是自注意力机制,通过全局建模和并......
  • 脉冲神经网络(Spiking Neural Network,SNN)相关论文最新推荐(一)
    用稀疏代理梯度直接训练时态脉冲神经网络论文链接:www.sciencedirect.comBenchmarkingArtificialNeuralNetworkArchitecturesforHigh-PerformanceSpikingNeuralNetworks论文链接:www.mdpi.comHierarchicalspikingneuralnetworkauditoryfeaturebaseddry-typet......