机器学习实战之k-近邻算法

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树可以省去对大部分数据点的搜索,从而减少搜索的计算量.   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值