首页 > 代码库 > MLiA.第2章.k-近邻算法(kNN)
MLiA.第2章.k-近邻算法(kNN)
简单地说,k-近邻算法是采用测量不同特征值之间的距离方法进行分类。
优缺点:
优点 | 精确度高、对异常值不敏感、无数据输入假定。 |
缺点 | 计算复杂度高、空间复杂度高。 |
使用数据范围 | 数值型和标称型。 |
例子:
电影名称 | 打斗镜头 | 接吻镜头 | 已知电影类型 |
California | 3 | 104 | 爱情片 |
Gongfu | 99 | 5 | 动作片 |
算法伪代码:
对未知类别属性的数据集中的每个点依次执行以下操作:
- 计算已知类别数据集中的点与当前点之间的距离.
- 按照距离递增次序排序.
- 选取与当前点距离最小的k个点.
- 确定前k个点所在类别的出现频率.
- 返回前k个点出现频率最高的类别作为当前点的预测分类。
算法实现细节:
- 利用矩阵计算,得到未知数据与已知类别数据集中每个数据之间的距离.
- 返回距离由大到小的数据的索引值.
- 利用索引值找到对应的标签(labels),计算前k个标签中不同标签对应的个数。并利用字典数据结构保存{标签:个数 , ......}.
- 按照个数由高到低排序字典,返回字典首位置的标签即为发生频率最高的元素标签。
其它知识:
一:从文本文件中解析数据.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)