K-最近邻算法

K-最近邻(KNN)是一种简单的分类算法,基于样本的最近邻规则。其核心思想是通过寻找样本点的K个最近邻来决定其分类,常用的距离计算方法包括欧几里得距离等。K值的选择对结果有很大影响,过小易受噪声影响,过大则近似误差增大。文章还给出了KNN算法的Python代码示例,展示如何计算距离并进行分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*K-最近邻算法*

简介

邻近算法,或者说K-最近邻(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻近值来代表。

核心思想

如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

我们需要确定绿点属于哪个颜色(蓝色或者红色),要做的就是选出距离目标点距离最近的k个点,看这k个点的大多数颜色是什么颜色。以绿点为圆心做圆,可以直观地看到其他样本与其目标点距离大小的排序,当k取3的时候,我们可以看出距离最近的三个,分别是红色,红色,蓝色,因此得到目标点为红色;但当k取5时,我们可以看出距离最近的五个,分别是红色,红色,蓝色,蓝色,蓝色,所以得到的目标点为蓝色,因此我们可以知道k的取值不同,得到的结果也是不同的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aAN9fI35-1682328961074)(file:///C:\Users\Lenovo\AppData\Local\Temp\ksohtml14324\wps1.jpg)]

算法步骤

步骤描述
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别(决策依据方法之一)作为测试数据的预测分类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qve0sAxP-1682328961077)(file:///C:\Users\Lenovo\AppData\Local\Temp\ksohtml14324\wps2.png)]

关于距离的计算
这里的距离指的是平面上两个点的直线距离。常用的距离计算公式有:
1.闵可夫斯基距离
2.欧几里得距离
3.曼哈顿距离
4.切比雪夫距离
5.马氏距离
6.余弦相似度
7.皮尔逊相关系数
8.汉明距离
9.杰卡德相似系数
10.编辑距离

11.DTW距离

12.KL散度

Ps:超参数

在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。

关于K值的选择

K称为临近数,即在预测目标点时取几个临近的点来预测。
K值得选取非常重要,因为:
1.如果当K的取值过小时,一旦有噪声得成分存在们将会对预测产生比较大影响,例如取K值为1时,一旦最近的一个点是噪声,那么就会出现偏差,K值的减小就意味着整体模型变得复杂,容易发生过拟合;

2,如果K的值取的过大时,就相当于用较大邻域中的训练实例进行预测,学习的近似误差会增大。这时与输入目标点较远实例也会对预测起作用,使预测发生错误。K值的增大就意味着整体的模型变得简单,也就是容易发生欠拟合;
3.如果K=N的时候,那么就是取全部的实例,即为取实例中某分类下最多的点,就对预测没有什么实际的意义了;
为此我们可以这样取K的值:
1.从k=1开始,使用检验集估计分类器的误差率。重复该过程,每次K增值1,允许增加一个近邻。选取产生最小误差率的K;

2,一般K的取值不超过20,上限是n的开方,随着数据集的增大,K的值也要增大;
3.K的取值尽量要取奇数以保证在计算结果最后会产生一个较多的类别,如果取偶数可能会产生相等的情况,不利于预测。
关于决策依据/规则

最常用的决策规则是:

1.多数表决法(更常用):多数表决法类似于投票的过程,也就是在K个邻居中选择类别最多的种类作为测试样本的类别;
2.加权表决法:根据距离的远近,对近邻的投票进行加权距离越近则权重越大,通过权重计算结果最大值的类为测试样本的类别。

优缺点

优点:

1)简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归;
2)可用于数值型数据和离散型数据;
3)训练时间复杂度为0(n);无数据输入假定;
4)对异常值不敏感。

缺点:

1计算复杂性高;空间复杂性高;
2)样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
3)一般数值很大的时候不用这个,计算重太大,但是单个样本又不能太少,否则容易发生误分;
4)最大的缺点是无法给出数据的内在含义。

总结

这是一个非常实用的算法,算是一种机器学习预测,总的来说通过画圈来计算圈内某一个无主的点到底分类到哪里,是红色方还是绿色方是一个很笨的训练方式,就是看他里那种颜色距离比较近,比较多,这就是投票。

代码讲解

#K-means算法
import numpy as np
import matplotlib.pyplot as plt
from math import sqrt
%matplotlib inline
'''
%matplotlib inline是一个魔法命令,它使得 Jupyter notebook 
中的绘图在 notebook 页面中显示。这个命令需要在引入 matplotlib 
库之后调用,如果引入了其他绘图库,也需要将其指定为当前绘图库。
这个命令在数据可视化和机器学习等领域十分实用,
可以在 notebook 中动态显示绘制的图像。'''
#原始数据
data = [[1,0.9],[1,1],[0.1,0.2],[0,0.1]]
labels=['A','A','B','B']
test_data=[[0.1,0.3]]
#绘制散点图
print("begin!!!")
print("HUI      ZHI")
for i in range(len(data)):
  plt.scatter(data[i][0],data[i][1],color='b')
plt.scatter(test_data[0][0],test_data[0][1],color='r')
print("123")
plt.show()
#数据测试 :欧氏距离计算
print("距离计算。。。")
x=[[0.1,0.3]]
distance=[]
labels_vz=[]
for i in range(len(data) ):
  d=0
  d=sqrt((x[0][0]-data[i][0])**2+(x[0][1]-data[i][1])**2)
  distance.append(d)
  labels_vz.append(i)
print("距离:\n",distance)
print("NOW 标签位置\n",labels_vz)
#按照升序排序,并去距离最小的前三个
print("排序")
for i in range (len(data)-1):
  for j in range (i+1,len(data)):
    if distance[i]>distance[j]:
      distance[i],distance[j]=distance[j],distance[i]
      labels_vz[i],labels_vz[j]=labels_vz[j],labels_vz[i]
print("排序后的距离\n",labels_vz)
print("前三距离值:",distance[0:3])
#投票表决
print("投票开始")
A=0
B=0
for i in range  (len (labels_vz[0:3])):
  if labels[labels_vz[i]]=='A':
    A+=1
  else:
    B+=1
print("投票A的数量为:\n",A)
print("投票B的数量:\n",B)
print("对照初始图中红色点(测试点)与前两个标签为A的离得最近,所以我们的计算与图中所呈现的绘图一致")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LQabbozg-1682328961079)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20230424172000595.png)]

t(“投票A的数量为:\n”,A)
print(“投票B的数量:\n”,B)
print(“对照初始图中红色点(测试点)与前两个标签为A的离得最近,所以我们的计算与图中所呈现的绘图一致”)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值