1 k-近邻算法原理
- k值的选择/距离的度量/分类决策规则是k近邻算法的三个基本要素
- 存在一个训练样本集,并且每个样本集中每个数据都存在标签,也就是我们知道样本集中每个数据与所属分类的对应关系;
- 当输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。
- 特征空间中两个实例点的距离是两个实例点相似程度的反映.k近邻算法的特征空间一般是n维实数向量空间,常使用欧氏距离.
- 一般地,只选择样本数据集中与新数据最相似的k个数据,通常k为不大于20的整数
- 选择这k个最相似数据中出现次数最多的分类,作为新数据的分类。即多数表决方式.
2 kNN算法流程
(1)收集数据
(2)准备数据:计算距离时所需要的数据,最好是结构化的数据
(3)分析数据:若数据单位不一样,可进行归一化处理
(4)训练算法:不过K-近邻算法不需要训练,实际上利用训练数据集对特征向量进行划分
(5)测试算法:通过测试数据的错分类来计算错误率
(6)使用算法:首先需要输入样本数据和其结构化的处理结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后对计算出的分类执行后续的处理。
3 分类中心代码
输入测试数据测试向量test,dataSet,labels分别为训练数据的特征向量以及所属标签
def classfy(test,dataSet,labels,k):
#step1:compute the distance between the current point and the point in dataset
dataSetSize = dataSet.shape[0] #return the row of dataSet, namely the number of train
diff = tile(test,(dataSetSize,1))-dataSet #tile(A,rep) :construct a array by repeat A rep times
sqdiff = diff**2 # squared the every elements in array
sumsqdiff = sum(sqdiff,axis=1) #sum the every row in array
distance = sumsqdiff**0.5 # the every row is the distance between test and one train sample
#step2:sort the distance ascending: get the index of every element
sortDistance = argsort(distance)
#count the numbers of the every label appear in k samples
classCount={}
for i in range(k):
#step3:get the k smallest point by the distance :
votelabel = labels[sortDistance[i]]
#step4:get the frequence of the label of the k point
#if the votelabel is ont in the dictionary, return 0
classCount[votelabel] = classCount.get(votelabel,0)+1
#step5:return the top frequence label compute the max votes label in k samples
maxCount=0
for key,value in classCount.items():
if(value>maxCount):
maxCount=value
maxKey=key
return maxKey
可以用于手写数字识别,电影分类等等
4 tips
(1)在计算特征值之间的距离时,数字差值最大的属性对计算结果的影响最大,因为所有的特征是等同重要的,因此在处理不同取值范围的特征值时,通常采用的方法是将数值归一化(针对每一维特征),如将取值范围处理为0-1或-1~1之间。
eg:新值=(旧值-最小值)/(最大值-最小值) 0-1
(2)k值的选择:
若选择较小的k值,表示用较小的领域中的训练实例进行预测,学习的近似误差会减小,只有与实例较近的训练实例才会对预测结果起作用,但缺点是学习的估计误差会增大,预测结果对实例周围的近邻非常敏感,若实例点附近恰好是噪声,预测就会出错.k值的减小意味着整体模型变得复杂,容易产生过拟合;
若选择较大的k值,相当于用较大邻域中的训练实例进行预测.优点是学习的估计误差会减小,但是学习的近似误差会增大,这时与输入实例相差很远的样本也会对预测其作用,使预测发生错误.k值的增大意味着整体的模型变得简单.
在应用中,k值一般是一个比较小的数值,通常采用交叉验证来选取最优的k值.
5 kNN算法评价
- 分类数据最简单最有效的算法
- 基于实例的学习,使用此算法时必须有接近实际数据的训练样本数据
- 必须保存所有数据集,若数据集很大,需使用大量的存储空间
- 使用时,必须对数据集中的每个数据计算距离值,实际使用非常耗时
6 k近邻算法的改进
k近邻算法的实现需要考虑如何快速搜索k个最近邻点.最简单的方法是线性扫描,这种方法要计算输入实例与每一个训练实例的距离,当训练集大时,非常耗时,不可行;
提高方法:kd树是一种便于对k维空间中的数据进行快速检索的数据结构.
利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量.