Python实现KNN算法附源码视
2022/7/9 来源:不详本篇我们将讨论一种广泛使用的分类技术,称为k邻近算法,或者说K最近邻(KNN,k-NearestNeighbor)。所谓K最近邻,是k个最近的邻居的意思,即每个样本都可以用它最接近的k个邻居来代表。
01
KNN算法思想
如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法在类别决策时,只与极少量的相邻样本有关。
由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
02
KNN算法的决策过程
下图中有两种类型的样本数据,一类是蓝色的正方形,另一类是红色的三角形,中间那个绿色的圆形是待分类数据:
▍近邻分类图
如果K=3,那么离绿色点最近的有2个红色的三角形和1个蓝色的正方形,这三个点进行投票,于是绿色的待分类点就属于红色的三角形。而如果K=5,那么离绿色点最近的有2个红色的三角形和3个蓝色的正方形,这五个点进行投票,于是绿色的待分类点就属于蓝色的正方形。
KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成反比。
下面用代码来实现KNN算法的应用。本次用到的数据是经典的Iris数据集。该数据集有条鸢尾花数据样本,并且均匀分布在3个不同的亚种:每个数据样本被4个不同的花瓣、花萼的形状特征所描述。
#读取数据fromsklearn.datasetsimportload_irisdata=load_iris()#查看数据大小data.data.shape(,4)#查看数据说明print(data.DESCR)Notes-----DataSetCharacteristics::NumberofInstances:(50ineachofthreeclasses):NumberofAttributes:4numeric,predictiveattributesandtheclass:AttributeInformation:-sepallengthincm-sepalwidthincm-petallengthincm-petalwidthincm-class:-Iris-Setosa-Iris-Versicolour-Iris-Virginica:SummaryStatistics:======================================================MinMaxMeanSDClassCorrelation======================================================sepallength:4.37.95...sepalwidth:2.04.43..43-0.petallength:1.06.93...(high!)petalwidth:0.12.51...(high!)======================================================:MissingAttributeValues:None:ClassDistribution:33.3%foreachof3classes.:Creator:R.A.Fisher:Donor:MichaelMarshall(MARSHALL%PLU
io.arc.nasa.gov):Date:July,ThisisacopyofUCIMLirisdatasets.