目录
代码实现
训练集准备
可视化操作
测试集
结果猜想
KNN算法实现
求距离
对距离x的测试集点排序
求最近k个点所属类别
计算投票数
把KNN过程集合到一个py文件KNN.py
这里是一个分类问题----思想很简单
对要预测的数据与测试集的各个点求距离,然后取出距离最近k个点,采取投票制,即k个点中那个类别的数量最多,就预测为哪类
代码实现
训练集准备
import numpy as np
x=[[1.2,5.6],
[3.4,8.2],
[2.6,9.1],
[1.8,7.2],
[4.1,7.8],
[7.5,2.5],
[9.1,4.5],
[3.8,5.4],
[7.7,1.4],
[5.5,6.6]
]
y=[0,0,0,1,1,1,1,2,2,2]
x_train=np.array(x)
y_train=np.array(y)
这里假设:训练集x有10个样本,每个样本有2个属性;测试集y有3类,即:0,1,2
注意:训练集x的行数,要与测试集y的元素个数一致
可视化操作
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color="r")
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color="b")
plt.scatter(x_train[y_train==2,0],x_train[y_train==2,1],color="g")
import numpy as np x=[[1.2,5.6], [3.4,8.2], [2.6,9.1], [1.8,7.2], [4.1,7.8], [7.5,2.5], [9.1,4.5], [3.8,5.4], [7.7,1.4], [5.5,6.6] ] y=[0,0,0,1,1,1,1,2,2,2] x_train=np.array(x) y_train=np.array(y)
这里假设:训练集x有10个样本,每个样本有2个属性;测试集y有3类,即:0,1,2
注意:训练集x的行数,要与测试集y的元素个数一致
可视化操作
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color="r")
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color="b")
plt.scatter(x_train[y_train==2,0],x_train[y_train==2,1],color="g")
x_train[y_train==0,0]
这里的意思是:
取x_train中y_train==0的那些行,由于y_train是一维的,所以用true和false过滤然后取x_train的第0列,即第一个属性
绘图是选取不同类别中x_train的第1个属性为横坐标,第2个属性为纵坐标
测试集
x=[4.3,6.2]
结果猜想
很明显---如果k=4,距离x(黄)最近的且类别最多的为绿色,即2
KNN算法实现
首先求距离最近的k个点,主要关注的不是距离值,而是距离对应的点的位置
求距离
from math import sqrt
distance=[ ]
for i in x_train:
m=sqrt(np.sum((x-i)**2))
distance.append(m)
当然也可以使用Python的lammda表达式,而且更高效
对距离x的测试集点排序
使用了argsort,因为我们关注的不是dist的排序,而是点
求最近k个点所属类别
如图:从nearest的前k个点取出对应y即类别
计算投票数
采用了集合类中的Counte用法,a:b,a是集合元素,b是出现个数
注意most_common(k)是取集合的前k个元素
()得到元组,第一个[0]取得是第一个元素,第二个【0】是我们关注的类别
把KNN过程集合到一个py文件KNN.py
import numpy as np
from math import sqrt
from collections import Counter
def kNN_classify(k,x_train,y_train,x):
#输入合法性检查
assert 1<=k<=x_train.shape[0],"k must valid"
assert x_train.shape[0]==y_train.shape[0],"label and attribute"
assert x_train.shape[1]==x.shape[0],
"x attribute--1d==x_train attribute--2d"
#knn算法
dist=[sqrt(np.sum((x-i)**2)) for i in x_train]
nearest=np.argsort(dist)
tok_y=[y_train[i] for i in nearest[:k]]
votes=Counter(tok_y)
return votes.most_common(1)[0][0]
使用魔法命令



