先来说说概念,什么事k近邻算法?
kNN算法的核心思想是用距离最近的k个样本数据的分类来代表目标数据的分类。
其原理具体地讲,存在一个训练样本集,这个数据训练样本的数据集合中的每个样本都包含数据的特征和目标变量(即分类值),输入新的不含目标变量的数据,将该数据的特征与训练样本集中每一个样本进行比较,找到最相似的k个数据,这k个数据出席那次数最多的分类,即输入的具有特征值的数据的分类。
下面是一张很经典的图:
运用kNN算法思想,距离最近的k个样本的分类来代表测试数据的分类
当k=3时,距离最近的3个样本在实线内,具有2个红色三角和1个蓝色正方形**,因此将它归为红色三角。
当k=5时,距离最近的5个样本在虚线内,具有2个红色三角和3个蓝色正方形**,因此将它归为蓝色正方形。
优点
(1)监督学习:可以看到,kNN算法首先需要一个训练样本集,这个集合中含有分类信息,因此它属于监督学习。
(2)通过计算距离来衡量样本之间相似度,算法简单,易于理解和实现。
(3)对异常值不敏感
缺点
(4)需要设定k值,结果会受到k值的影响,通过上面的例子可以看到,不同的k值,最后得到的分类结果不尽相同。k一般不超过20。
(5)计算量大,需要计算样本集中每个样本的距离,才能得到k个最近的数据样本。
(6)训练样本集不平衡导致结果不准确问题。当样本集中主要是某个分类,该分类数量太大,导致近邻的k个样本总是该类,而不接近目标分类
2.kNN算法流程
一般情况下,kNN有如下流程:
(1)收集数据:确定训练样本集合测试数据;
(2)计算测试数据和训练样本集中每个样本数据的距离;
常用的距离计算公式:
欧式距离公式:d(x,y)=∑ni=1(xi−yi)2‾‾‾‾‾‾‾‾‾‾‾‾‾√d(x,y)=∑i=1n(xi−yi)2
曼哈顿距离公式:d(x,y)=∑ni=1|xi−yi|d(x,y)=∑i=1n|xi−yi|
(3)按照距离递增的顺序排序;
(4)选取距离最近的k个点;
(5)确定这k个点中分类信息的频率;
(6)返回前k个点中出现频率最高的分类,作为当前测试数据的分类。
---------------------
数据归一化处理:
由于不同的数据在大小上差别较大,在计算欧式距离,整体较大的数据明细所占的比重更高,因此需要对数据进行归一化处理。
#归一化处理函数
def autoNorm(dataSet):
minVals=dataSet.min(0) #最小值
maxVals=dataSet.max(0) #最大值
ranges=maxVals-minVals #最大最小值之差
normDataSet=zeros(shape(dataSet)) #构造零矩阵
m=dataSet.shape[0] #行数,shape返回[nrow,ncol]
normDataSet=dataSet-tile(minVals,(m,1))#tile复制minval
normDataSet=normDataSet/tile(ranges,(m,1))
return normDataSet,ranges,minVals