K-近邻算法

来源:互联网 发布:摩托罗拉v8和v9 java 编辑:程序博客网 时间:2024/06/13 01:33

简介

K-近邻算法采用测量不同特征值之间的距离方法进行分类。
优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和标称型
工作原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签, 即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

过程

对未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前K个点所在类别的出现频率;
(5)返回前K个点出现频率最高的类别作为当前点的预测分析。
程序清单如下:

def classify0(inX, dataSet, labels, k):    dataSetSize=dataSet.shape[0]    diffMat=tile(inX, (dataSetSize,1))-dataSet    sqDiffMat=diffMat**2    sqDiffMat=diffMat**2    sqDistances=sqdiffMat.sum(axis=1)    distances=sqDistances**0.5    sortedDistIndicies=distances.argsort()    classCount={}    for i in range(k):        voteIlabel=label[sortedDistIndicies[i]]        classCount[voteIlabel]=classCount.get(voteIlabel,0)        +1    sortedClassCount=sorted(classCount.iteritems(),     key=operator.itemgetter(1),reverse=True)    return sortedClassCount[0][0]

classify0()函数有4个输入参数:用于分类的输入向量是inX,输入的训练样本集为dataSet,标签向量为labels,最后的参数k表示用于选择最近邻居的数目,其中标签向量的元素数目和矩阵dataSet的行数相同。

0 0
原创粉丝点击