基于kNN的文本分类原理以及实现

    前两天写了 基于libsvm中文文本分类 ,只是做到了会用的,要做到知其然知其所以然还是很难的。不过SVM的应用很广泛,除了文本分类,比如人脸识别,手写识别,甚至验证码识别都可以搞定。

    kNN(k最邻近)算法相对而言,就简单得多了。

 

1,kNN算法就是找到k个最相似的样本,这些样本所在的类,就是当前文档的所属的类。如下图:绿色圆圈表示你想分类的文本,其他是已知类别的样本。图中其他形状和绿色圆圈的距离代表了相似度。如果k = 3,就是取3个最相似的文本,那么1个蓝色框,2红色三角被选中,因为红色三角多,则绿色圆圈所属的类就是红色三角所在的类。如果k = 5,3个蓝色框和2个红色三角选中,那么就属于蓝色框所属于的类。kNN你也可以取多个类别,就是绿色圆圈既属于蓝色框,也属于红色三角所属的类别。

kNN理解

 

2,如何计算文章的相似度?建议先看看《数学之美-余弦定理和新闻分类 》。首先必须对文档分词,对于所有出现的词叫做特征。每个特征必须有一定的值,这个值是根据某些公式计算出来的比如TF/IDF。比如文档x表示为(f1:x1,f2:x2,......,fn:xn)文档y表示为(f1:y1,f2:y2,......,fn:yn)。

x1...xn以及y1...yn都是通过比如TF/IDF公式计算出来的(你也可以用别的公式)。f1...fn就是特征,如果特征从0....n已经选择好了,那么fn可以省略,写作x (x1,x2,......,xn),y写作(y1,y2,......,yn)。

向量的相似度

如上图,如果x和y的夹角小,则相似度高,夹角大,则相似度小,那么计算余弦cos(xy)就可以,越接近1,越相似,还有一种方法时计算内积,就是夹角间的面积,有兴趣的同学可以试试。计算cos的公式为:

余弦定律

 

上面公式很好理解,把数据的代入,就等同下面的公式:

余弦定律表示

 

3,第2步是计算两个文本之间的相似度,剩下的计算很简单,计算和所有样本的相似度。然后根据sim的值按照从高到低排序。k 等于几,就取前几个。下面有是一个公式,看起来很麻烦,理解很容易:就是k个邻居中,属于哪个类别的多,x就属于哪个类。

类别选择

 

4,实现。实现请参考基于libsvm中文文本分类 中的,分词部分,特征提取部分,向量值计算部分,训练样本和测试样本部分。kNN的实现代码如下:

 


5,总结。kNN的分类方法因为没有训练过程,所以,分类时特别慢,因为需要和所有样本进行比较,同时特征维数很多,也要影响效率。分类准确度还可以,基本和没有优化过的svm差不多,70%多。kNN的准确度和样本数量还是蛮相关的,我用每个类下的100个样本和200个样本,准确度差了9%左右。kNN因为效率的问题,所以在实际中应用还需要慎重。

 

  • 0
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值