郑捷《机器学习算法原理与编程实践》学习笔记(第二章 中文文本分类(三)—KNN算法)
(上接第二章)
2.4 分类算法:KNN
2.4.1 KNN算法原理(略)
KNN算法的步骤构成:
第一阶段:确定k值(就是指最近邻居的个数)。一般是一个奇数。因为测试样本有限,故取k值为3.
第二阶段:确定距离度量公式。文本分类一般使用夹角余弦,得出分类数据点和所有已知类别的样本点,从中选择距离最近的k个样本。
第三个阶段:统计这k个样本点中各个类别的数量,根据k个样本中数量最多的样本是什么类型,我们就把这数据点定为什么类别。
2.4.2 KNN算法的Python实现
第一阶段:导入所需的库,进行数据的初始化
#coding:utf-8 import sys import os from numpy import * import numpy as np from Nbayes_lib import * import operator
第二阶段:实现夹角余弦的距离公式
#夹角余弦距离公式 def consdist(vector1,vector2): return dot(vector1,vector2)/(linalg.norm(vector1)*linalg.norm(vector2))
第三阶段:KNN实现分类器
#KNN分类器 #测试集:testdata;测试集:trainSet;类别标签:listClasses;k:k个邻居 def classify(testdata,trainSet,listClasses,k): dataSetsize = trainSet.shape[0] #返回样本的行数 distances = array(zeros(dataSetsize)) for indx in xrange(dataSetsize): #计算测试集和训练集之间的距离:余弦夹角 distances[indx] = consdist(testdata,trainSet[indx]) #根据生成的夹角余弦按从大到小排序,结果为索引号 sortedDistIndics = argsort(-distances) classCount = {} for i in range(k): #获得角度最小的前k项作为参考项 #按排序顺序返回样本集对应的类别标签 voteIlabel = listClasses[sortedDistIndics[i]] #为字典classCount赋值,相同key,其中value加1 classCount[voteIlabel] = classCount.get(voteIlabel,0)+1 #获得voteIlabel的value值,没有则默认为0 #对分类字典classCount按value重新排序 #sorted(data.iteritems(),key = operator.itemgetter(1),reverse = True) #该句是按字典值排序的固定用法 #classCount.iteritems();字典迭代器函数 #key:排序参数:operator.itemgetter(1):多级排序 sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse = True) return sortedClassCount[0][0] #返回序最高的一项
2.4.3 评估分类结果:
#使用KNN算法实现文本分类 dataSet,lisClasses = loadDataSet() nb = NBayes() nb.train_set(dataSet,lisClasses) #使用之前的贝叶斯分类阶段的数据集及生成的TF向量进行分类 print classify(nb.tf[3],nb.tf,lisClasses,k)
输出结果如下:
1
资料来源及版权所有:郑捷《机器学习算法原理与编程实践》