1、算法思路
通过计算每个训练样例到待分类样品的距离,取和待分类样品距离最近的K个训练样例,K个样品中哪个类别的训练样品占比较多,则该分类样品就属于哪个类别。
2、算法步骤:
(1)初始化距离为最大值
(2)计算未知样本和每个训练样本的距离dist
(3)得到目前K各最临近样本中的最大距离maxdist
(4)如果dist小于maxdist,则将该样本作为K—最近邻样本
(5)重复步骤2/3/4,直到位置样本和所有训练样本的距离
(6)统计K—最近邻样本中每个类标号出现的次数
(7)选择出现频率最大的类标号作为未知样本的类标号
3、算法优缺点
优点:简单、易于理解和实现,无需估计参数,无需训练,是和赝本容量比较大的分类问题,特别适合多分类问题
缺点:懒惰算法,对测试样本分类时的计算量大,内存开销大,评分慢,可解释性较差,无法给出决策树那样的规则,对于样本量较小的分类问题,或产生误分
4、常见问题
(1)K设置多大合适:
K太小,分类结果容易受到噪声点影响,K太大,近邻中可能包含太多其他类别的点(对距离加权,可以降低K值设定的影响)
K值通常采用交叉检验来确定(以K=1为基准) 经验规则,K一般低于训练样本数的平方根
(2)类别如何判定合适
股票法没有考虑近邻的距离远近,距离更近的近邻也许更应该决定最终的分类,所以加权投票法更加恰当。
(3)如何选择合适的距离衡量
高维度对距离衡量的影响:众所周知变量数越多,欧式距离的区分能力越差;
变量值域对距离的影响:值越大的变量常常在距离的计算值占据主导作用,因此应先对变量进行标准化
(4)训练样本是否要一视同仁
在训练集中,有些样本可能是更值得依赖的,可以给不同的样本施加不同的权重,加强依赖样本的权重,降低不可信赖样本的影响
(5)性能问题
KNN是一种懒惰算法,平时不训练,直到实际分类时才临时去找K个近邻
懒惰的后果,构造模型简单,但是在对测试样本分类时系统开销大,因为要扫描全部的训练样本并计算距离
已经有的方法提高计算的效率:压缩训练样本量等
(6)能发大幅度减少训练样本量有保持分类精度
浓缩技术
编辑技术
(7)python实现电影分类
import numpy as np
from sklearn import neighbors
knn = neighbors.KNeighborsClassifier() #取得knn分类器
data = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]]) # <span style=
"font-family:Arial, Helvetica, sans-serif;">data对应着打斗次数和接吻次数</span>
labels = np.array([1,1,1,2,2,2]) #<span style="font-family:Arial, Helvetica,
sans-serif;">labels则是对应Romance和Action</span>
knn.fit(data,labels) #导入数据进行训练'''
#Out:KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=5, p=2,
weights='uniform')
knn.predict([18,90])