首页 > 编程语言 >K近邻算法(KNN)的概述与实现

K近邻算法(KNN)的概述与实现

时间:2024-10-20 14:21:56浏览次数:8  
标签:KNN 样本 近邻 分类 距离 算法 邻居

K近邻算法(K-Nearest Neighbors,简称KNN)是一种简单而有效的机器学习算法,广泛应用于分类和回归问题中。KNN的主要特点是不需要对数据进行显式的模型训练,它是一种基于实例的学习方法。当给定一个未标记的数据点时,KNN算法会寻找其在训练集中最接近的K个邻居,并根据这些邻居的标签来决定新数据点的类别或预测其值。

一、KNN的基本思想

KNN的核心思想非常直观:对于一个新的数据点,算法根据距离度量选择与其距离最近的K个样本点,然后通过统计这K个样本点的类别来进行分类,或者通过它们的值进行回归预测。常用的距离度量方法是欧氏距离(Euclidean distance),但根据不同的任务,其他距离度量如曼哈顿距离(Manhattan distance)也可以使用。

假设我们有一个二维空间的样本集,其中每个点表示一个样本,点的坐标为样本的特征值。对于一个新的点(测试点),KNN会根据距离度量选择K个最邻近的点。如果是分类问题,KNN会统计这些邻居中多数的类别,将新点分到该类别中;如果是回归问题,KNN会通过计算邻居点的平均值来进行预测。

二、KNN算法的步骤

  1. 选择参数K:K是一个用户定义的超参数,表示需要选取的邻居个数。K的选择非常关键,K值太小可能导致模型对噪声敏感,K值太大会导致模型的决策边界过于平滑,无法很好地捕捉数据的复杂性。
  2. 计算距离

    对于给定的测试样本,计算它与训练集中每一个样本的距离。最常用的距离度量是欧氏距离,其公式如下:

        

        其中, xi 和 xj 分别是两个样本的特征向量,N是特征的维度。

    3.选择最近的K个邻居

        通过计算的距离对训练样本排序,选择距离最小的K个样本。

    4.投票或平均

        对于分类问题,KNN根据这K个邻居的类别进行投票,得票最多的类别作为预测类别。

        对于回归问题,KNN通过这些邻居的值计算平均值,作为预测值。

    5.输出预测结果:分类任务下,输出预测的类别;回归任务下,输出预测的值。

三、KNN的优缺点

优点

  1. 简单易懂:KNN算法直观,易于理解和实现。
  2. 无需训练:KNN是一种懒惰学习(Lazy Learning)算法,不需要训练阶段,只在预测时才计算。
  3. 适用于多分类问题:KNN适用于多分类问题,支持对多个类别的分类。

缺点

  1. 计算代价高:由于需要计算测试样本与每个训练样本的距离,因此当训练集非常大时,计算成本较高。
  2. 高维数据表现差:KNN在高维空间中容易受到“维度灾难”的影响,导致距离度量失效,影响分类或回归效果。
  3. 对K值敏感:K值的选择直接影响模型的性能,选择不当可能导致过拟合或欠拟合。

四、KNN的改进与优化

为了提高KNN的性能,研究人员提出了一些改进方法:

1.权重KNN

在标准KNN算法中,所有邻居的权重都是相等的。权重KNN则根据距离的远近为邻居赋予不同的权重,通常距离越近的邻居权重越大。这种方式可以在一定程度上提高模型的分类和预测精度。

2.快速KNN算法(KD树、Ball树)

当训练数据集非常庞大时,计算距离的代价会变得很高。KD树和Ball树等数据结构能够加速邻居的查找过程,从而显著降低KNN的时间复杂度。

3.降维处理

针对高维数据的“维度灾难”,可以先使用PCA(主成分分析)等降维技术,将高维数据映射到低维空间,再进行KNN操作,以提高算法的效果和效率。

五、KNN的应用场景

KNN广泛应用于多个领域,以下是一些常见的应用场景:

  1. 图像分类:在图像处理和计算机视觉领域,KNN可以用来根据图像特征对图像进行分类。比如,通过提取图像的颜色、纹理等特征,对图片进行场景分类或物体识别。

  2. 文本分类:在自然语言处理(NLP)中,KNN可以用于文本分类任务。通过将文本转换为向量空间模型,并使用KNN算法进行分类,如垃圾邮件过滤、新闻分类等。

  3. 推荐系统:KNN还可以用于推荐系统,通过计算用户之间或物品之间的相似度,推荐与用户兴趣相符的内容,如电商平台的商品推荐或电影推荐。

  4. 医疗诊断:KNN可以帮助医生通过病人症状和历史数据预测疾病,尤其是在小规模数据集或个性化诊断中应用广泛。

六、KNN的实现示例

为了更直观地展示KNN的工作原理,下面是一个简单的Python代码示例,使用KNN算法进行分类任务。我们将使用scikit-learn库中的KNN实现。

# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化KNN分类器,设置K=3
knn = KNeighborsClassifier(n_neighbors=3)

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

# 进行预测
y_pred = knn.predict(X_test)

# 输出准确率
print(f"分类准确率:{accuracy_score(y_test, y_pred):.2f}")

在这个示例中,我们使用了鸢尾花数据集进行分类任务。通过scikit-learn的KNeighborsClassifier,我们可以轻松实现KNN算法,并评估其在测试集上的表现。

七、总结与思考

KNN是一种简单但功能强大的算法,适用于分类和回归任务。然而,其计算成本和对K值的敏感性使其在处理大规模数据集或高维数据时存在一定的局限性。随着数据规模的增加,优化KNN的计算速度和性能成为一个值得探索的方向。

你是否有使用KNN算法进行项目的经验?在实践中你会选择什么样的距离度量方法?欢迎分享你的看法和经验!

标签:KNN,样本,近邻,分类,距离,算法,邻居
From: https://blog.csdn.net/m0_62710548/article/details/143091896

相关文章

  • 多任务学习算法在推荐系统中的应用
    粗略来看,推荐算法可以简单地分为召回和排序两个阶段。召回模块负责从海量的物品库里挑选出用户可能感兴趣的物品子集,过滤之后通常返回几百个物品。排序模块负责对召回阶段返回的物品集个性化排序,通常返回几十个物品组成的有序列表。总结起来,召回和排序有如下特点:召回层:候选集规......
  • 【大数据分析与挖掘算法】matlab实现——DBSCAN聚类方法
    实验六:DBSCAN聚类方法一、实验目的掌握DBSCAN聚类方法的基本理论,通过编程对实例进行聚类。二、实验任务对DBSCAN聚类方法进行编码计算,实例如下:三、实验过程1.DBSCAN聚类模型介绍:2.具体步骤介绍:四、实验结果实现平台:Matlab2022A实验代码:%示例数据data=......
  • C++编程-贪心算法2
    目录先言例题三:删数问题(NOI1994)题目描述算法分析标准程序-字符串String例题四:拦截导弹问题题目描述算法分析主要框架(标准程序)例题五:活动选择题目描述算法分析标准程序先言今天讲贪心算法的第3~5例题例题三:删数问题(NOI1994)题目描述【题目描述】输......
  • 209号资源-源程序:(SIC)黑翼风筝算法:一种受自然启发的元启发式算法,用于解决基准函数和工
    ......
  • 【优选算法篇】踏入算法的深邃乐章:滑动窗口的极致探秘
    文章目录C++滑动窗口详解:进阶题解与思维分析前言第二章:进阶挑战2.1水果成篮解法一:滑动窗口解法二:滑动窗口+数组模拟哈希表复杂度分析:图解分析:示例:滑动窗口执行过程图解:详细说明:2.2找到字符串中所有字母异位词解法:滑动窗口+哈希表复杂度分析:图解分析:滑动窗口执......
  • 基于双路神经网络的滚动轴承故障诊断融合了原始振动信号 和 二维信号时频图像 的多输
    基于双路神经网络的滚动轴承故障诊断融合了原始振动信号和二维信号时频图像的多输入(多通道)故障诊断方法单路和双路都可时频图像算法可选小波变换,短时傅里叶变换,马尔可夫变迁场,格拉姆角场,S变换,递归图,灰度图等基于双路神经网络的滚动轴承故障诊断融合了原始振动信号和......
  • 毕业设计:python股票推荐系统 数据分析可视化 协同过滤推荐算法 Django框架(源码+论文)✅
    python股票推荐系统数据分析可视化协同过滤推荐算法Django框架(源码)✅1、项目介绍技术栈:python、django框架、requests、BeautifulSoup、协同过滤算法、Echarts可视化、HTML登录注册界面:用户可以注册新账号并登录系统。个人信息修改:用户可以修改个人信息,如用户名、......
  • 【算法】将单向链表按某值分成左边小、中间相等、右边大的形式
    前置知识数据结构:链表测试链接:链表划分本题考察对链表coding速度的熟练度。也考察读者对链表分块的处理,另外,透过此题可以窥探链表快速排序的实现。题目给定一个单向链表的头节点head,节点的值是int类型。给定任意整数pivot。实现这样一个函数。将原链表调整为......
  • 代码随想录算法训练营day20| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树
    学习资料:https://programmercarl.com/0669.修剪二叉搜索树.html#算法公开课学习记录:669.修剪二叉搜索树(直接在原函数上操作,要根据情况用root的左右子树递归,因为子树中有满足条件的;前序:根左右)点击查看代码#Definitionforabinarytreenode.#classTreeNode:#def_......
  • 通过已知明文攻击破解弱加密算法
    样本分析日志实习期间在微步沙箱上找到一个样本,其SHA256:36c3405eafd9bdb4c6dd0ca98a2a4779ab34b8777a36b38347316f09109a87e6,在沙箱上检测为木马。通过分析发现该样本总共分为三个阶段:第一阶段的逻辑是先检查当前路径,然后自复制到公共目录并运行,最后从远程FTP服务器上下载第二......