机器学习 Python kNN算法

一、基本思想:
存在一个训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每个数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般我们只选择样本数据集中前k个最相似的数据。
二、算法代码:

from numpy import * import operator def createDataSet(): #创建训练样本集和标签 group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) #训练样本集 labels = [ 'A','A','B','B'] #每个样本所属的标签 return group, labels ###################################### #创建分类器 #inX:输入的待分类的向量 #dataSet:训练样本集 #labels:样本集中每个样本的标签 #k:选择最近邻居的数量(kNN即是k-Nearest Neighbor algorithm) ###################################### def classify0(inX,dataSet,labels,k): dataSetSize = dataSet.shape[0] #计算dataSet的行数 print 'dataSet的行数=', print dataSetSize diffMat = tile(inX,(dataSetSize,1)) #tile函数构造(dataSetSize,1)个copy print '扩充后的数组=' print diffMat diffMat = diffMat - dataSet #再与dataSet做差 print '坐标之差diffMat=', print diffMat sqDiffMat = diffMat**2 #每行坐标计算平方 print '坐标平方sqDiffMat=', print sqDiffMat sqDiffMat = sqDiffMat.sum(axis=1) #每行进行求和 print '行和sqDiffMat=', print sqDiffMat distances = sqDiffMat ** 0.5 #开方即得到两个元素的欧氏距离 print '欧氏距离distances=', print distances sortedDistIndicies = distances.argsort()#对距离进行升序排序 print '升序排序后的距离的下标sortedDistIndicies=', print sortedDistIndicies classCount = {} for i in range(k): #取前k个距离 voteLabel = labels[sortedDistIndicies[i]] #得到升序排序后的距离所对应的的标签 print '对应的标签', print voteLabel classCount[voteLabel] = classCount.get(voteLabel,0) + 1 #对标签从零进行计数,对应的标签每出现一次加一 print classCount[voteLabel] print '前k个距离所对应的标签的统计' print classCount sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse=True) #sorted函数对标签的个数进行降序排序

#或者sortedClassCount = sorted(classCount.iteritems(),key = lambda classCount: classCount[1],reverse=True) return sortedClassCount[0][0] #排序后第一个标签的个数最多,即认为待分类的向量归属于此标签 group,labels = createDataSet() outputLabel = classify0([0,0],group,labels,3) print '待分类向量归属于' print outputLabel

输出结果:

dataSet的行数= 4 扩充后的数组= [[0 0] [0 0] [0 0] [0 0]] 坐标之差diffMat= [[-1. -1.1] [-1. -1. ] [ 0. 0. ] [ 0. -0.1]] 坐标平方sqDiffMat= [[ 1. 1.21] [ 1. 1. ] [ 0. 0. ] [ 0. 0.01]] 行和sqDiffMat= [ 2.21 2. 0. 0.01] 欧氏距离distances= [ 1.48660687 1.41421356 0. 0.1 ] 升序排序后的距离的下标sortedDistIndicies= [2 3 1 0] 对应的标签 B 1 对应的标签 B 2 对应的标签 A 1 k个距离所对应的标签的统计 {'A': 1, 'B': 2} 待分类向量归属于 B

http://maoersong.blog.163.com/blog/static/17155735120142593131755/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值