K-邻近算法

来源:互联网 发布:09外设淘宝店地址 编辑:程序博客网 时间:2024/04/18 13:11

一.k-邻近算法概述


k近邻算法(KDD)采用测量不同特征值之间的距离方法进行分类。

优点:精度高、对异常值不敏感、无数据输入假定

缺点:计算复杂度高、空间复杂度高

适用数据范围:数值型和标称型。


k近邻法模型采用基于特征空间的划分,由距离度量、k值选择、分类决策规则决定。


距离度量:两个实例点相似程度的反映。可以使用欧式距离或者其他距离(Manhattan distance、Minkowski distance


k值选择:k值对算法产生重大影响,k小,过拟合;k大,模型过于简单。(考虑k=1和k=N两种极端情况)



二.KNN算法


1.伪代码


对未知类编属性的数据集中每个点依次执行一下操作:

(1)计算已知类别数据集中点与当前点之间的距离(采用欧式距离公式:

(2)按照距离递增次序排列

(3)选取与当前点距离最小的k个点

(4)确定前k个点所在类别出现的频率

(5)返回前k个点出现频率最高的类别作为当前点的预测分类。


2.python版本KDD


环境:win7+python3.4+NumPy函数库

下载numpy地址:http://sourceforge.net/projects/numpy/files/

程序

def classify(inX,dataSet,labels,k):        dataSetSize = dataSet.shap[0];        diffMat = tile(inX,(dataSet,1)) -dataSet     #tile函数:在inX列上方重复dataSetSize次,行1次        sqDiffMat = diffMat**2                      # **幂运算符        sqDistances = sqDiffMat.sum(axis=1)        # sum(axis=1)表示将sqDiffMat每一行相加        distances = sqDistances**0.5        sortedDistIndicies = distances.argsort()  #argsort()函数返回值为升序下标值,并非值        classCount={}        for i in range(k):            voteIlabel = labels[sortedDistIndicies[i]]             classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1  #get函数找到key为voteIlabel的,如果没有,则赋值为0        sortClassCount = sorted(classCount.iteritems(), key=operation.itemgetter(1),reverse=True) #iteritems()返回迭代器,key定义排序标准,True:升序        return sortClassCount[0][0];


3.测试分类器


分类器错误率 = 分类器给出错误结果次数/测试执行总次数  (错误率:0~1.0)


三.kd树


kd树提高k近邻搜索效率,减少计算距离次数。
1.构造kd平衡树(依次选择坐标轴对空间划分,选定坐标轴上中位点为切分点)
2.搜索kd树。(分治、回溯)
kd树适合于实例数远大于空间维数是的k近邻搜索
 
参见http://xiaofeng1982.blog.163.com/blog/static/31572458201210214406792/
0 0