目录
KNN是机器学习十大算法之一,因为原理很好理解,有一句话:“Talk is cheap.Show me the code.” 所以用Python来实现一下吧,并在iris数据集上检验模型效果。
算法原理:看新样本与最接近的那个训练集样本属于哪一类,“最接近”一般是用距离来量化的。找到距离最近的K个训练样本,按“少数服从多数”原则,实现待判样本分类。
这里的距离(distance)用的是欧氏距离:
算法缺点:算法复杂度较高,因为要比较所有训练样本与待测样本;另外,当训练样本分布不均衡时,比如某一类样本占比过大,那待测样本就很容易被归为这一类,实际上可能距离并没有更接近,只是在数量上占了优势。
算法优化:所以有一个优化方法,弱化样本不平衡代来的影响,即将距离作为权重加权(weight=1/d),使得离待判样本越近的训练集样本权重越大。
下面就是我的实现过程了。这个例子是根据电影的打斗次数和接吻次数来划分电影类型。
调整调整一下:
一、KNN算法Python实现
1、导入包
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
2、 画图,展示不同电影在图上的分布
#画图
x1 = np.array([3,2,1])
y1 = np.array([104,100,81])
x2 = np.array([101,99,98])
y2 = np.array([10,5,2])
s1 = plt.scatter(x1,y1,c='r')
s2 = plt.scatter(x2,y2,c='b')
#未知电影
x = np.array([18])
y = np.array([90])
s3 = plt.scatter(x,y,c='k')
plt.legend(handles=[s1,s2,s3],<