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实现电影分类

k最近邻法JAVA k最近邻分类算法例题_k最近邻法JAVA

 

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])