首页 > 代码库 > MLiA.第2章.k-近邻算法(kNN)

MLiA.第2章.k-近邻算法(kNN)

简单地说,k-近邻算法采用测量不同特征值之间的距离方法进行分类。

优缺点:

优点精确度高、对异常值不敏感、无数据输入假定。
缺点计算复杂度高、空间复杂度高。
使用数据范围数值型和标称型。

例子:

电影名称打斗镜头接吻镜头已知电影类型
California3104爱情片
Gongfu995动作片

算法伪代码:

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

  1. 计算已知类别数据集中的点与当前点之间的距离.
  2. 按照距离递增次序排序.
  3. 选取与当前点距离最小的k个点.
  4. 确定前k个点所在类别的出现频率.
  5. 返回前k个点出现频率最高的类别作为当前点的预测分类。

算法实现细节:

  1. 利用矩阵计算,得到未知数据与已知类别数据集中每个数据之间的距离.
  2. 返回距离由大到小的数据的索引值.
  3. 利用索引值找到对应的标签(labels),计算前k个标签中不同标签对应的个数。并利用字典数据结构保存{标签:个数 , ......}.
  4. 按照个数由高到低排序字典,返回字典首位置的标签即为发生频率最高的元素标签。

其它知识:

一:从文本文件中解析数据.4列数据(最后一列是标签)

def file2matrix(filename):

    fr = open(filename)

    numberOfLines = len(fr.readlines())         

    returnMat = zeros((numberOfLines,3))       

    classLabelVector = []                       

    fr = open(filename)

    index = 0

    for line in fr.readlines():

        line = line.strip()

        listFromLine = line.split(‘\t‘)

        returnMat[index,:] = listFromLine[0:3]

        classLabelVector.append(int(listFromLine[-1]))

        index += 1

    return returnMat,classLabelVector

二:分析数据:使用Matlotlib创建散点图

三:准备数据:归一化数值

  newValue = http://www.mamicode.com/(oldValue - min) / (max - min)

小结:k-邻近存储空间大,计算耗时大;另一个缺陷是它无法给出数据的基础结构信息,因此我们也无法知晓平均实例样本和典型实力样本具有什么特征。

 

 

 

 

 

MLiA.第2章.k-近邻算法(kNN)