KNN分类器实现
1.1 题目的主要研究内容
(1)KNN 是什么?KNN(K-Nearest Neighbor)是最简单的机器学习算法之一,可以用于分类和回归,是一种监督学习算法。它的思路是这样,如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。也就是说,该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
(2)KNN怎么分类?KNN本质是基于一种数据统计的方法,其实很多机器学习算法也是基于数据统计的。同时, KNN是一种instance-based learning,属于lazy learning, 即它没有明显的前期训练过程,而是程序开始运行时,把数据集加载到内存后,就可以直接开始分类。其中,每次判断一个未知的样本点时,就在该样本点附近找K个最近的点进行投票,这就是KNN中K的意义,通常K是不大于20的整数。
(3)kNN算法又称为k近邻分类(k-nearest neighbor classification)算法,最简单平凡的分类器也许是那种死记硬背式的分类器,记住所有的训练数据,对于新的数据则直接和训练数据匹配,如果存在相同属性的训练数据,则直接用它的分类来作为新数据的分类。这种方式有一个明显的缺点,那就是很可能无法找到完全匹配的训练记录。
kNN算法则是从训练集中找到和新数据最接近的k条记录,然后根据他们的主要分类来决定新数据的类别。该算法涉及3个主要因素:训练集、距离或相似的衡量、k的大小。
1.2 题目研究的工作基础或实验条件
(2)软件环境 spyder内置python3.9
1.3 设计思想
计算待分类点与已知类别的点之间的距离按照距离递增次序排序选取与待分类点距离最小的K个点,确定前K个点所在类别的出现次数,返回前K个点出现次数最高的类别作为待分类点的预测分类。
KNN 的全称是 K Nearest Neighbors,意思是 K 个最近的邻居。从这个名字我们就能看出一些 KNN 算法的蛛丝马迹了。K 个最近邻居,毫无疑问,K 的取值肯定是至关重要的,那么最近的邻居又是怎么回事呢?其实,KNN 的原理就是当预测一个新的值 x 的时候,根据它距离最近的 K 个点是什么类别来判断 x 属于哪个类别。听起来有点绕,还是看看图吧。图中绿色的点就是我们要预测的那个点,假设 K=3。那么 KNN 算法就会找到与它距离最近的三个点(这里用圆圈把它圈起来了),看看哪种类别多一些,比如这个例子中是蓝色三角形多一些,新来的绿色点就归类到蓝三角了。但是,当 K=5 的时候,判定就变成不一样了。这次变成红圆多一些,所以新来的绿点被归类成红圆。从这个例子中,我们就能看得出 K 的取值是很重要的。
1.4 流程图
1.5 主要程序代码
#导入库
import numpy as np
import matplotlib.pyplot as plt
from collections import Counter
#设置训练集
X_train = np.array([[2.9,6.1],[5,6.7],[4,5.7],[5,8.1],[6,7],[7,7],[8,6],[9,6],[10,5.2],[11,6.5]])
Y_train = np.array([1,1,1,1,0,1,0,0,0,0])
m1=input("x1=")
m2=input("y1=")
x = np.array([float(m1),float(m2)])#需判断样本:
distance1 = []#计算距离:
for x_train in X_train:
d = np.sqrt(np.sum((x-x_train)**2))
distance1.append(d)#添加到空列表
out1 = np.argsort(distance1)#给列表排序
k = 5#定义k值:
topK_y1 = [Y_train[i] for i in out1[:k]]#类对应
r1= Counter(topK_y1)#统计数量
s1= r1.most_common(1)[0][0]
#输出并可视化
print(s1)
print(x,"归属为",s1,"类")
plt.scatter(X_train[Y_train==0,0],X_train[Y_train==0,1],c='g')
plt.scatter(X_train[Y_train==1,0],X_train[Y_train==1,1],c='r')
plt.scatter(x[0],x[1],c='b')
plt.show()
1.6 运行结果及分析
设置10个点,归为1类和0类,分别计算蓝色测试点到10个点的距离
蓝色点被成功归类到0类即绿色类别