算法总结

Posted 天使_陈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法总结相关的知识,希望对你有一定的参考价值。

一.聚类算法:

1.1LDA算法:

算法的目的:对文本进行聚类,得到几簇相似的样本。

算法的流程:

预处理:统计sscCorpus中所有的词、词频、词的标号。

初始化:形成初始的文章-主题和主题-词的矩阵(最开始)

Gibbs 采样:使用Gibbs采样得到稳定的文章-主题和主题-词的矩阵

每一簇的主题提取:提取出每一类中的文章,再对每一类中的文章找出主题词。(注:不能将这些doc进行相加,再对其提取关键词,理论可行但是实践不可行。现在的方法是提取出每doc的关键词再取前TOP)

算法的输入和输出:

输入(待聚类的文本):SscCorpus sscCorpus

输出(每一簇是一个Cluster):List<Cluster>

1.2Kmeans算法

1.2.1Kmeans+canopy

 

算法的目的:在没有指定聚类数目的条件下,使用canopy找到聚类的数目K,再根据聚类数目得到K簇结果。

算法的流程:

         预处理:输入的是SscCorpus corpus 输出的是List<CorpusBean> 。目的就是为了转化格式。

         Canopy确定数目:根据所有点的平均距离设为阈值T,使用canopy计算文本大致分为几簇,找到初始的聚类的中心点。确定文本聚类的中心点。(这样可以减少寻找聚类数目K的时间)

         聚类:按照离中心点最近的原则,将点分配到各个簇中,直到其中有一个中心点没有发生变化就可以终止循环。(注:可以设置其他的结束条件,当两次的中心点的大小差距小于阈值时,就终止循环。)

每一簇的主题提取:提取出每一类中的文章,再对每一类中的文章找出主题词。(注:不能将这些doc进行相加,再对其提取关键词,理论可行但是实践不可行。现在的方法是提取出每doc的关键词再取前TOP)

算法的输入和输出:

输入(待聚类的文本):SscCorpus sscCorpus

输出(每一簇是一个Cluster):List<Cluster>

 

1.2.2Kmeans+numberCluster

 

算法的目的:在指定聚类数目K的条件下,将文本聚成K簇。

算法的流程:

预处理:输入的是SscCorpus corpus 输出的是List<CorpusBean> 。目的就是为了转化格式。

         确定聚类中心:根据输入的聚类数目K,找到文本的K个中心,确定文本聚类的中心点。      聚类:按照离中心点最近的原则,将点分配到各个簇中,直到其中有一个中心点没有发生变化就可以终止循环。(注:可以设置其他的结束条件,当两次的中心点的大小差距小于阈值时,就终止循环。)

每一簇的主题提取:提取出每一类中的文章,再对每一类中的文章找出主题词。(注:不能将这些doc进行相加,再对其提取关键词,理论可行但是实践不可行。现在的方法是提取出每doc的关键词再取前TOP)

算法的输入和输出:

输入(待聚类的文本):SscCorpus sscCorpus

输出(每一簇是一个Cluster):List<Cluster>

 

 

Entropy

对于一个聚类i,首先计算。指的是聚类 i 中的成员(member)属于类(class)j 的概率,。其中是在聚类 i 中所有成员的个数,是聚类 i 中的成员属于类 j 的个数。每个聚类的entropy可以表示为,其中L是类(class)的个数。整个聚类划分的entropy为,其中K是聚类(cluster)的数目,m是整个聚类划分所涉及到的成员个数。

Purity

使用上述Entropy中的定义,我们将聚类 i 的purity定义为。整个聚类划分的purity为,其中K是聚类(cluster)的数目,m是整个聚类划分所涉及到的成员个数。

二.分类算法:

2.1朴素贝叶斯算法

 

算法的目的:根据朴素贝叶斯算法得到文本的分类,主要使用的公式是: 

算法的流程:

         训练模型:得到每个分类中,所有的词及其权重。

         预测文本分类:将文本进行分词,计算分到每个类中的概率,选择概率最大的作为文本的类别。

算法的输入和输出:Doc doc 和NBModel model

计算准确率即可。

2.2 RandomForest

 

算法的目的: 对文本进行分类。

算法的流程:

         训练模型:将文本进行预处理,得到每篇文本的属性的矩阵。构建随机森林的模型

         预测文本分类:将文本转化成需要的矩阵的形式,输入模型进行预测。

算法的输入和输出: Doc doc 和RFModel  model

信息熵: 

信息增益: 

三.关键词提取:

算法的目的:提取每篇文本的重要词语。

算法的流程:

         预处理:将文本进行分词,去停用词。

         整理成活动窗口的形式:

         根据公式进行计算每个词的权重: 

 

         将词的权重进行排序:

         按照规定的数目进行输出:

算法的输入和输出:Doc doc  List<KeywordExtractorBean> result

 

举例说明:

先看看测试数据:

程序员(英文Programmer)是从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国。软件从业人员分为初级程序员、高级程序员、系统分析员和项目经理四大类。

我取出了百度百科关于“程序员”的定义作为测试用例,很明显,这段定义的关键字应当是“程序员”并且“程序员”的得分应当最高。

首先对这句话分词,这里可以借助各种分词项目,比如HanLP分词,得出分词结果:

[程序员/n, (, 英文/nz, programmer/en, ), 是/v, 从事/v, 程序/n, 开发/v, 、/w, 维护/v, 的/uj, 专业/n, 人员/n, 。/w, 一般/a, 将/d, 程序员/n, 分为/v, 程序/n, 设计/vn, 人员/n, 和/c, 程序/n, 编码/n, 人员/n, ,/w, 但/c, 两者/r, 的/uj, 界限/n, 并/c, 不/d, 非常/d, 清楚/a, ,/w, 特别/d, 是/v, 在/p, 中国/ns, 。/w, 软件/n, 从业/b, 人员/n, 分为/v, 初级/b, 程序员/n, 、/w, 高级/a, 程序员/n, 、/w, 系统/n, 分析员/n, 和/c, 项目/n, 经理/n, 四/m, 大/a, 类/q, 。/w]

然后去掉里面的停用词,这里我去掉了标点符号、常用词、以及“名词、动词、形容词、副词之外的词”。得出实际有用的词语:

[程序员, 英文, 程序, 开发, 维护, 专业, 人员, 程序员, 分为, 程序, 设计, 人员, 程序, 编码, 人员, 界限, 特别, 中国, 软件, 人员, 分为, 程序员, 高级, 程序员, 系统, 分析员, 项目, 经理]

之后建立两个大小为5的窗口,每个单词将票投给它身前身后距离5以内的单词:

{开发=[专业, 程序员, 维护, 英文, 程序, 人员],

 软件=[程序员, 分为, 界限, 高级, 中国, 特别, 人员],

 程序员=[开发, 软件, 分析员, 维护, 系统, 项目, 经理, 分为, 英文, 程序, 专业, 设计, 高级, 人员, 中国],

 分析员=[程序员, 系统, 项目, 经理, 高级],

 维护=[专业, 开发, 程序员, 分为, 英文, 程序, 人员],

 系统=[程序员, 分析员, 项目, 经理, 分为, 高级],

 项目=[程序员, 分析员, 系统, 经理, 高级],

 经理=[程序员, 分析员, 系统, 项目],

 分为=[专业, 软件, 设计, 程序员, 维护, 系统, 高级, 程序, 中国, 特别, 人员],

 英文=[专业, 开发, 程序员, 维护, 程序],

 程序=[专业, 开发, 设计, 程序员, 编码, 维护, 界限, 分为, 英文, 特别, 人员],

 特别=[软件, 编码, 分为, 界限, 程序, 中国, 人员],

 专业=[开发, 程序员, 维护, 分为, 英文, 程序, 人员],

 设计=[程序员, 编码, 分为, 程序, 人员],

 编码=[设计, 界限, 程序, 中国, 特别, 人员],

 界限=[软件, 编码, 程序, 中国, 特别, 人员],

 高级=[程序员, 软件, 分析员, 系统, 项目, 分为, 人员],

 中国=[程序员, 软件, 编码, 分为, 界限, 特别, 人员],

 人员=[开发, 程序员, 软件, 维护, 分为, 程序, 特别, 专业, 设计, 编码, 界限, 高级, 中国]}

四.文本相似:(可以基于不同的粒度:character,word)

4.1 Cosine Distance

算法的目的:计算文本之间的相似度。短文本和长文本都是比较好的。

算法的流程:

         预处理:将文本处理成字符串的形式。

         Cosine Distance:根据余弦公式计算两文本之间的距离。

算法的输入和输出:

         输入:Dod doc1  Doc doc2

         输出:Double similarity

4.2 Edit Distance

算法的目的:计算文本之间的相似度。适合短文本或者是句子相似度计算。

算法的流程:

         预处理:将文本处理成字符串的形式。

         Edit Distance:根据两字符串通过增删改的次数计算两文本的相似度。

算法的输入和输出:

输入:Dod doc1  Doc doc2

         输出:Double similarity

4.3 Jaccard Distance

算法的目的:计算文本之间的相似度。适合使用短文本。

算法的流程:

预处理:将文本处理成字符串的形式。

         Jaccard Distance:根据两字符串交集与并集的商值作为文本的相似度。

算法的输入和输出:

输入:Dod doc1  Doc doc2

         输出:Double similarity

4.4 Simhash

算法的目的:simhash算法的主要思想是降维,将高维的特征向量映射成一个f-bit的指纹(fingerprint),通过比较两篇文章的f-bit指纹的Hamming Distance来确定文章是否重复或者高度近似。

算法的流程:

算法的输入和输出:

实现方式:

1. 首先基于传统的IR方法,将文章转换为一组加权的特征值构成的向量。

2.初始化一个f维的向量V,其中每一个元素初始值为0。

3.对于文章的特征向量集中的每一个特征,做如下计算:

利用传统的hash算法映射到一个f-bit的签名。对于这个f- bit的签名,如果签名的第i位上为1,则对向量V中第i维加上这个特征的权值,否则对向量的第i维减去该特征的权值。

4.对整个特征向量集合迭代上述运算后,根据V中每一维向量的符号来确定生成的f-bit指纹的值,如果V的第i维为正数,则生成f-bit指纹的第i维为1,否则为0。

 

 

五.交叉验证

算法的目的:

算法的流程:

算法的输入和输出:

 

以上是关于算法总结的主要内容,如果未能解决你的问题,请参考以下文章

SLAM算法总结——经典SLAM算法框架总结

十大经典排序算法总结(归并排序)

十大经典排序算法总结(桶排序)

十大经典排序算法总结(希尔排序)

十大经典排序算法总结(快速排序)

十大经典排序算法总结(基数排序)