kNN算法(k-临近算法)

kNN算法应该是一个最简单的分类算法
首先,存在一个有标签的样本数据集,然后输入无标签数据,将新输入是数据对应的特征值进行比较,让背后算法提取样本集中特征最相似数据,即为最邻近的分类标签。一般我们取前k个最相似的数据,并且以其中出现次数最多的分类作为新数据的分类。

算法中有三个基本因素:k值、距离度量、分类决策规则,在这个算法中,我们一般以欧式距离作为判别的度量方式。

(内容来源于机器学习实战)
算法的具体过程可以表述为如下:
我们对未知类别属性的数据集中的每个点进行如下操作:
(1)计算距离
已知类别数据集中的点与当前点之间的距离。
a.向量之间作差
b.差值的平方(相加)
c.开二次根号
(0,0)与(0,1)之间的欧式距离为,(0,0)-(0,1) 得到(0,-1) 平方以后得(0,1) 然后相加开根号 根号下(0+1) 得欧式距离为1
(2)按照距离排序。递增顺序
(3)选取前k个点
(4)计算前k个点的类别出现频率
(5)返回前k个点中出现频率最高的类别作为当前未知数据的预测分类。

程序及其注释如下:``

def  kNN_classify(X,dataSet,labels,k):  #此处X和dataSet相当于一个矩阵
     dataSetSize = data.shape[0]           #计算矩阵dataSet中的行数,即计算数据集中的数据个数
     Mat_diff = tile(X,(dataSetSize,1)) - dataSet  #将X变成与dataSet相同的矩阵,相当于每一行都是一个X,X与每一行的dataSet作差,即得到输入数据与数据集中每个数据的差值,从而计算欧式距离。
     sqMat_diff = Mat_diff**2
     sqDistances = sqMat_diff.sum(axis = 1)  #矩阵每一行计算求和,即X与数据集中每行数据的差值平方和
     ouDistances = sqDistances**0.5
     sortedDisIndex = ouDistances.argsort() #按距离从小到大排序后返回之前位置的index
     class = {}
     for i in range(k):
         voteLabel = labels[sortedDisIndex[i]]  #将label按距离大小排序
         class[voteLabel] = classCount.get(voteLabel ,0) + 1 #实现对不同的便签label的计数功能。
         sortedClass = sorted(class.items(),key=key = operator.itemgetter(1),reverse=True)   #对新到的计数后字典(相当于矩阵)按从大到小排序,即得到k个相似数据中,出现次数最多的分类
         return sortedClassCount[0][0] #返回第一个即为出现次数最多的分类 实现kNN

本程序来源于机器学习实战。且该程序只为算法模拟程序,一般不在实际中使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值