文本分类——K-Nearest Neighbor算法

来源:互联网 发布:华为网络产品线 编辑:程序博客网 时间:2024/06/16 08:22

文本分类——K-Nearest Neighbor

 

1       关于k-Nearest Neighbor算法

KNN算法的基本思路:存在一个预先选定并且人工标注好类别的训练集合,给定一个新的文本,需要计算这个新文本与训练集合中每个文本的相似度,选出其中相似度最大的K个文本,然后在这K个文本中找出类别最多的一个类作为最后新文本的所属类别。可以形式化的描述如下:

         其中Sim(X,d) 为新样本和训练集中文档d的相似度,f(d,c)为文档d的类别函数,取值01. 从公式可以看出,最重要的就是相似度函数了。

2       文本相似度函数

文本的相似度函数也可以称为距离函数,是用来衡量两个文本的相近程度,距离越小那么就越相近反之也是成立。对于距离函数的介绍网上的介绍资料非常之多。自行google或者百度一下就能发现不少。 这里仅介绍下比较流行的两种距离函数——cosine距离函数和欧式距离函数。

Cosine距离和欧式距离的计算都是基于数据的VSM表示模型。对于这两个距离可以用这样一张图来直观表达。

本分类——K-Nearest Neighbor算法 - zengkui111 - 北斗之首——魁
 

         Cosine距离计算的就是向量AB和向量AC之间夹角的余弦值,值越大(趋近于1)那么文本就越相似,反之也成立。而欧式距离计算的是向量AB和向量AC之间点B和点C之间的长度(即红线的长度)。形式化表述如下:


 本分类——K-Nearest Neighbor算法 - zengkui111 - 北斗之首——魁

 

3       代码实现

https://github.com/zengkui/machine-learning/blob/master/K-NN/knn.py

此代码中实现了cosine距离函数和欧式距离函数。其中vsm模型中特征词的筛选算法是采用的信息增益,即对分类样本文本分词后,计算各个词的信息增益选出top50个词来表示文本。

4       模型评价和对比

选取搜狗实验室的分类语料:商务类新闻和娱乐类新闻各100篇作为分类样本,测试集中商务类新闻文章19926篇,娱乐类新闻文章11987篇。其中商务类标记为正样本,娱乐类标记为负样本。

KNN模型对比了两个距离函数在不同的K值情况下的召回,准确以及正确率这三个指标,数据如下:

距离函数

评价参数

K=5

K=11

K=21

K=31

K=41

K=51

K=101

欧式距离

正确率

87.60

79.64

92.37

92.84

92.49

91.91

89.10

Cosine距离

92.64

92.66

92.76

92.72

92.34

91.92

88.50

欧式距离

召回率

82.22

69.09

89.98

91.50

91.03

90.04

85.05

Cosine距离

96.78

96.93

97.07

97.60

97.65

97.64

99.52

欧式距离

准确率

97.53

97.61

97.62

96.86

96.76

96.77

97.13

Cosine距离

91.87

91.78

91.81

91.34

90.79

90.22

84.73


将这些数据从直观的形式表示出来的图表如下:

本分类——K-Nearest Neighbor算法 - zengkui111 - 北斗之首——魁
 

从实验数据可以看出:整体来将cosine距离要略好于欧式距离,效果更好也更加稳定。欧式距离在k=11的时候出现了一个异常,这是由于数据样本筛选导致的。

5       模型的优缺点

该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。因此可以采用权值的方法(和该样本距离小的邻居权值大)来改进。该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。

         

原创粉丝点击