PySpark.ml库中的Clustering

LDA模型介绍

LDA是一种典型的Bag-of-words模型,即一篇文档是由一组词构成,词与词之间没有先后顺序的关系。
可以将文档集中每篇文档的主题以概率分布的形式给出,从而通过分析一些文档抽取出它们的主题(分布)出来后,便可以根据主题(分布)进行主题聚类或文本分类。

Latent Dirichlet allocation (LDA)

LDA是主题模型,它推测文本文档集合中的主题。按照下述描述,LDA可以被认为是一种聚类算法:

  • 主题对应聚类中心,文档对应数据集中的例子。
  • 主题和文档在特征空间中都存在,且特征向量是词频向量。
  • LDA不是用传统的距离来衡量一个类簇,它使用的是基于文本文档生成的统计模型的函数。

LDA通过 setOptimizer 函数支持不同的推断算法。EMLDAOptimizer 对于似然函数用 expectation-maximization 算法学习聚类,然后获得一个合理的结果。OnlineLDAOptimizer使用迭代的mini-batch抽样来进行 online variational inference,它通常对内存更友好。

LDA接收文档集合表示的词频向量,和下列参数(使用builder模式进行设置):

  • k: 主题数(也就是聚类中心数)
  • optimizer: 学习LDA模型使用的优化器,EMLDAOptimizer 或者 OnlineLDAOptimizer
  • docConcentration: 文档-主题分布的先验Dirichlet参数。值越大,推断的分布越平滑。
  • topicConcentration: 主题-词语分布的先验Dirichlet参数。值越大,推断的分布越平滑。
  • maxIterations: 迭代次数的限制
  • checkpointInterval: 如果你使用checkpointing(在Spark配置中设置),该参数设置checkpoints创建的次数,如果maxIterations过大,使用checkpointing可以帮助减少磁盘上shuffle文件的大小,然后帮助失败恢复。

所有spark.mllib的 LDA 模型都支持:

  • describeTopics: 返回主题,它是最重要的term组成的数组和term对应的权重组成的数组。
  • topicsMatrix: 返回一个 vocabSize*k 维的矩阵,每一个列是一个topic。

注意:LDA仍然是一个正在开发的实验特性。某些特性只在两种优化器/由优化器生成的模型中的一个提供。目前,分布式模型可以转化为本地模型,反过来不可以。

下列讨论将分开描述每个优化器/模型。

Expectation Maximization

Implemented in EMLDAOptimizer and DistributedLDAModel.

提供给LDA的参数有:

  • docConcentration: 只支持对称的先验,因此在提供的k维向量中所有值都相等。所有值也必须大于1.0。提供Vector(-1)会导致默认值 (uniform k dimensional vector with value (50/k))+1。
  • topicConcentration: 只支持对称的先验,所有值也必须大于1.0。提供-1会导致默认值0.1 加1。
  • maxIterations: EM迭代的最大次数。

注意:做足够多次迭代是重要的。在早期的迭代中,EM经常会有一些无用的topics,但是这些topics经过更多次的迭代会有改善。依赖你的数据集,如果使用至少20个topic,可能需要50-100次的迭代。

EMLDAOptimizer 会产生 DistributedLDAModel, 它不只存储推断的主题,还有所有的训练语料,以及训练语料库中每个文档的主题分布:

  • topTopicsPerDocument: 训练语料库中每个文档的前若干个主题和对应的权重
  • topDocumentsPerTopic: 每个主题下的前若干个文档和文档中对应的主题的权重
  • logPrior: 基于超参doc Concentration 和 topic Concentration,估计的主题和文档-主题分布的对数概率。
  • logLikelihood: 基于推断的主题和文档-主题分布,训练语料的对数似然。

Online Variational Bayes

Implemented in OnlineLDAOptimizer and LocalLDAModel.

提供给LDA的参数有:

  • docConcentration: 通过传递每个维度值都等于Dirichlet参数的向量使用不对称的先验,值应该大于等于0 。提供 Vector(-1) 会使用默认值(uniform k dimensional vector with value \((1.0/k)\))。
  • topicConcentration: 只支持对称的先验,值必须大于等于0。提供值-1会使用默认值 \((1.0/k)\)。
  • maxIterations: 提交的minibatches的最大次数。

此外,OnlineLDAOptimizer 接收下列参数:

  • miniBatchFraction: 每次迭代使用的语料库抽样比例。
  • optimizeDocConcentration: 如果设置为true,每次 minibatch 之后计算参数 docConcentration (aka alpha) 的最大似然估计,然后在返回的 LocalLDAModel 使用优化了的docConcentration。
  • \({ \tau }_{ 0 }\) 和 \(\kappa\): 用作学习率衰减,用 \({ ({ \tau }_{ 0 }+iter) }^{ -\kappa }\) 计算,这里 \(iter\) 是目前的迭代次数。

OnlineLDAOptimizer 生成 LocalLDAModel,它只存储了推断的主题。LocalLDAModel支持:

  • logLikelihood(documents): 给定推断的主题,计算提供的文档的下界。
  • logPerplexity(documents): 给定推断的主题,计算提供的文档的复杂度的上界。