Knn算法的实现

 

一.Knn的简介

当涉及到分类问题时,K最近邻算法是一种简单而常用的机器学习算法。KNN算法属于监督学习算法,可以用于对未知样本分类或标记。

KNN算法的基本思想是基于近邻样本的距离进行分类。它不需要事先对数据进行训练,而是在预测时根据待分类样本与训练集中已有样本的距离来确定其类别。

KNN算法的步骤如下:

准备数据集:收集带有标签的训练样本数据集,其中每个样本都有对应的特征和标签。
选择k值:确定要考虑的邻居数量k,通常通过交叉验证来选择最佳的k值。
计算距离:对于要预测的每个未知样本,计算其与训练集中所有已知样本的距离。常用的距离度量包括欧氏距离、曼哈顿距离等。
选择邻居:根据距离选择与未知样本最近的k个邻居。
进行投票:对于选定的k个邻居,根据其标签进行投票,选择出现次数最多的类别作为未知样本的预测类别。
输出预测结果:将未知样本分类到预测的类别中。

二.Knn的核心思想

2.1距离的计算

 已知数据和测试数据的距离有多种度量方式,比如曼哈顿距离,欧式距离,余弦距离等。在KNN算法中常使用的距离计算方式是欧式距离,计算公式如下:

 二维空间:p=\sqrt{(x_{2}^{}-x_{1}^{})^{2}+(y_{2}-y_{1})^{2}}

n维空间:d=\sqrt{\sum_{i=1}^{n}\left ( x_{i}-y_{i}^{} \right )^{2}}

2.2 k值的选择

KNN算法中k值的选择对于算法性能至关重要。一种常用的方法是通过交叉验证来选择最佳的k值。交叉验证是一种评估和选择模型参数的统计方法,它将数据集分为训练集和验证集,反复训练和测试模型以找到最佳参数。

以下是关于交叉验证来选择k值

 通过以上代码并且通过下面的输出图:

从图中我们可以看到当k=3的时候最准确,并且在自动输出中也得出了最佳k的取值,和所得曲线图结果一致。

以下为结果图:

三,Knn算法的具体代码实现

 我这边采用的是vscode里面自带的数据集可以通过导包来实现,具体数据读取实现如下:

根据步骤并将其数据集划分为训练集和数据集:

再创建knn分类器对象训练模型并在测试集上进行预测:

通过以下代码生成散点图,其中散点图可以直观显示模型的分类效果,帮助我们评估模型的性能并提供反馈,同时也方便我们对分类错误的样本进行分析和调试:

以下是散点图的输出:

然后再打印出预测集的具体输出和设置数据测试集:

以下是输出结果:

最后我们可以计算准确率:

以下是计算结果:

通过运行结果我们可以得到准确率为1,当准确率为1时,意味着模型对测试集中的所有样本都进行了正确的分类。

四.Knn算法的优劣

KNN算法的优点包括:

实现简单:KNN算法的实现非常简单,不涉及复杂的数学推导或模型训练过程。
可解释性强:KNN算法对于预测结果的解释性比较好,可以根据最近邻居的标签进行直接分析和理解。
适用于多分类问题:KNN算法可以用于解决二分类和多分类问题。


然而,KNN算法也存在一些缺点:

计算复杂度高:对于大规模数据集和高维数据,计算样本之间的距离会变得非常耗时。
数据不平衡性:当训练数据中某个类别的样本数量远远大于其他类别时,KNN算法可能会偏向于预测样本数量较多的类别。
参数选择:选择合适的k值对于KNN算法的性能至关重要,并且需要通过交叉验证等方法进行参数选择

五.实验中遇到的问题和解决办法

1.在最开始的时候由于不知道k值的选择导致准确度一直处于很大的波动水平,后面通过网上查资料发现KNN算法中的超参数k值需要选择合适的取值。选择过小的k值可能导致过拟合,而选择过大的k值可能导致欠拟合。解决办法是使用交叉验证或网格搜索等技术来选择最优的k值。在学习完交叉验证的方法后很好地解决了这个问题。

2.在运行案例的时候会出现vscode终端无法输入的情况,解决方法如下:

找出设置,然后输入runInTerminal,在用户和工作区中的Run in Terminal都打上勾。就设置成功。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值