跟着大神重写的KNN 文档归类小工具

·背景 html

在知道KNN以前,楼主有时候会粗糙地作一些分类模型的计算。在拜读了Orisun大神[http://www.cnblogs.com/zhangchaoyang/articles/2162393.html]的一些文章从中获得了一些启发,这些天突发奇想决定把N年前的分类模型按照KNN的思路重写,从新把大神的思路形象地再回溯一下,方便后人更加清晰的认识整个过程。不少时候,历史的进步来源于前辈们的传道、授业、解惑。既然大神给JAVA,不材这边就继续补充一个C++的,为陷在JAVA中的斗士们吹一曲老革命之歌。linux

·设计思路 c++

    像大多数的ML体系一下,向量和几率学几乎是整个ML体系的基础,但从历史经验的推断又是ML的命门,人类与机器之间的战争从未体质。文档分类工具的设计初衷是但愿拿到的这边文章可以准确的归为某一类,大神是经过KNN把复旦的语料分个类。楼主这边就简单地把公司投诉内容也简单归个类。KNN的最先设计模型以下图所示:算法

 

如上面左所示,X在K的定义范围内(规则半径或规则图形内)与其周围邻居属性归类最多的一项,则归为某类。具体到与邻居的类似是如何计算的,则是采用最基本的向量空间算法,Cos夹角。而SVM则是利用两个向量至理想边界的最大距离来分类,因此对于向量的理解相当重要。不少人KNN很简单,可是越是简单的,要用好反而更难。centos

 

在得知了最基本的计算思路后,作文档分类就能迎刃而解。把用天然分词分类,把每个文档设置成一个向量,把每一个词汇出现几率增益做为向量的维度,这样每个向量就有了本身的标尺。有了标尺以后,就能够回到了上面有图的理论部分。剩下的工做就是遍历计算夹角,以下图所示,一目了然吧。网络

 

 

·编码中的可能碰到问题 工具

  1. 文档分词工具,按目前汉字系来讲其实都差很少,看我的喜爱,楼主喜欢用SCWS开源加自定义词汇,惟独在编译时会碰到const char*的警告问题,这个与会不一样的编译器有关。有洁癖者,请变量前加const。
  2. 计算文档向量原始矩阵:原著中推荐使用了berkleyDB+MR,可是实际操做过程当中,并无原著中那么复杂,通过实践,64位下c++ String和Map,真的隐秘而强大。
  3. 从流行的角度,在真正分类时,能够推荐使用Spark,几乎完爆hadoop了,后续楼主会补充pyspark的代码。惋惜了分词的时候不能发挥外部API的特点。
  4. 因为出于我的兴趣,未追求程序计算量的性能极限,有一些声明和全局的处理比较粗糙。有该癖好的者,请多用指针。
  5. 下面是代码和工具截图,方便期间仅作了.a文件。其中涉及到部分公司的商业数据,楼主作了敏感处理,请仅作学术以后。如派为他用,请自行接受法律制裁。
  6. 仅适用linux/centos kernel2.6

 

·测试的结果 oop

把投诉内容按网络质量、终端销售、服务质量进行分类。如以前所述楼主把cos值作了直接相加,相加最大值为最类似断定。在测试样本的随机结果中命中仍是OK的。固然,话说回来,任何ML算是的弊端仍是"历史经验和人的因素。性能

 

相关文章
相关标签/搜索