文章目录
KNN(K近邻算法)实现及可视化
1 算法描述:
KNN的工作原理::给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻 近的k个实例,如果这k个实例的多数属于某个类别,那么新数据就属于这个类别。可以简单理解为:由那些离X最 近的k个点来投票决定X归为哪一类。
它的算法步骤为:(1) 计算已知类别数据集中的点与当前点之间的距离; (2) 按照距离递增次序排序; (3) 选取与当前点距离最小的k个点; (4) 确定前k个点所在类别的出现频率; (5) 返回前k个点出现频率最高的类别作为当前点的预测类别。
2 KNN算法的Python实现:
2.1 实践问题背景:
现要将目标分为四类,分别记为第0类、第1类、第2类、第3类。
2.2 目标:
给定目标向量,得出其所属类别。
目标数据集是一个15行,每行有两个特征值的数据集。
2.3 数据集:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tsQIaCgx-1609429162595)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201126101025891.png)]
数据集从上至下依次代表了第0类到第3类数据。每个数据集有50行数据,每行有两个特征值。
2.4 要求:
通过python实现k最近邻算法。
2.5 实施步骤:
① 准备数据:
# loadtxt()函数是读取txt 文件,注意被读取的文件需要数据文件要求每一行数据的格式相同
data1 = np.loadtxt('data1.txt')
#绘制散点图
#scatter中的参数,第一个为横轴值,第二个为纵轴值,第三个为点的颜色
plt.scatter(data1[:,0],data1[:,1],color="r")
data2 = np.loadtxt('data2.txt')
plt.scatter(data2[:,0],data2[:,1],color="g")
data3 = np.loadtxt('data3.txt')
plt.scatter(data3[:,0],data3[:,1],color="b")
data4 = np.loadtxt('data4.txt')
plt.scatter(data4[:,0],data4[:,1],color="k")
# 给定的目标向量
objdata = np.loadtxt('objdata.txt')
plt.scatter(objdata[:,0],objdata[:,1],color="y")
plt.show()
# objdata 为待预测的数据集,Trains是已知的数据集(该数据集的类别是四类,分别对应0,1,2,3)
#vstack()能够合并所读取的数据集
Trains = np.vstack([data1,data2,data3,data4])
#为已知数据集,创建分类标签。
TrainsClass = np.vstack([np.zeros((50,1)),np.ones((50,1)),2*np.ones((50,1)),3*np.ones((50,1))])
②计算已知类别数据集中的点与当前点之间的距离:
# 开始假设k值 k=10
k=10
for i in range(15):
# 求已知类别的值与位置类别点的距离
dist = (((Trains - objdata[i,:])**2).sum(1))**0.5
# 对算出的距离进行排序,由小到大,所排的内容是已知数据集数据的下标
# 这个下标与已知数据集的标签下标一致,可以借此找到数据所对应的标签
sortedDist = dist.argsort()
③将距离升序排列,然后选取距离最小的k个点。
#classCount空字典是用来,做分类计数。这是判断最终分类结果的关键。
classCount = {
}
# k =10
for i in range(k):
# voteLabel 获得的是Trains数据集的分类
voteLabel = str(TrainsClass[sortedDist[i]])
#get 获取字典的值,参数1为键,参数2为默认的值。默认值在键所对应的值不存在的时候被触发,返回的是键所对应的值。
#确定前K个点所在类别的出现频率
classCount[voteLabel] = classCount.get(voteLabel,0)+1
④选择频率最高的类别作为当前点的预测类别。
maxType = 0
maxCount = -1
# 找出出现次数最多的类别
for key,value in classCount.items():
if value > maxCount:
maxType = key,
maxCount = value
⑤上述的四个步骤执行一次可以分辨一个目标数据集中的向量值,但是在实际的判断中,我们不止判断一个。
#将所有类别最大的值存放在一个数组中
if(maxType == (&#