http://blog.csdn.net/pipisorry/article/details/52912179

Spark上实现LDA原理

LDA主题模型算法

[主题模型TopicModel:隐含狄利克雷分布LDA]

Spark实现LDA的GraphX基础

在Spark 1.3中,MLlib现在支持最成功的主题模型之一,隐含狄利克雷分布(LDA)。LDA也是基于GraphX上构建的第一个MLlib算法,GraphX是实现它最自然的方式。

有许多算法可以训练一个LDA模型。我们选择EM算法,因为它简单并且快速收敛。因为用EM训练LDA有一个潜在的图结构,在GraphX之上构建LDA是一个很自然的选择。

LDA主要有两类数据:词和文档。我们把这些数据存成一个偶图(如下所示),左边是词节点,右边是文档节点。每个词节点存储一些权重值,表示这个词语和哪个主题相关;类似的,每篇文章节点存储当前文章讨论主题的估计。

每当一个词出现在一篇文章中,图中就有一个边连接对应的词节点和文章节点。例如,在上图中,文章1包含词语“hockey” 和“system”

这些边也展示了这个算法的流通性。每轮迭代中,每个节点通过收集邻居数据来更新主题权重数据。下图中,文章2通过从连接的词节点收集数据来更新它的主题估计。

GraphX因此是LDA自然的选择。随着MLlib的成长,我们期望未来可以有更多图结构的学习算法!

可扩展性

LDA的并行化并不直观,已经有许多研究论文提出不同的策略来实现。关键问题是所有的方法都需要很大量的通讯。这在上图中很明显:词和文档需要在每轮迭代中用新数据更新相邻节点,而相邻节点太多了。

我们选择了EM算法的部分原因就是它通过很少轮的迭代就能收敛。更少的迭代,更少的通讯。

Note: Spark的贡献者正在开发更多LDA算法:在线变分贝叶斯(一个快速近似算法)和吉布斯采样(一个更慢但是有时更准确的算法)。

[用 LDA 做主题模型:当 MLlib 邂逅 GraphX]

[Spark官网上关于LDA的解释:Latent Dirichlet allocation (LDA)]

PySpark.ml库中Clustering LDA简介

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

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

  • k: 主题数(也就是聚类中心数)
  • optimizer: 优化计算方法,目前支持"em", "online"。学习LDA模型使用的优化器,EMLDAOptimizer 或者 OnlineLDAOptimizer。
  • docConcentration: 文档-主题分布的先验Dirichlet参数。值越大,推断的分布越平滑。文章分布的超参数(Dirichlet分布的参数)。只支持对称的先验,因此在提供的k维向量中所有值都相等。所有值也必须大于1.0。
  • topicConcentration: 主题-词语分布的先验Dirichlet参数。值越大,推断的分布越平滑。主题分布的超参数(Dirichlet分布的参数),必需>1.0。
  • maxIterations: 迭代次数的限制
  • checkpointInterval: 迭代计算时检查点的间隔。如果你使用checkpointing(在Spark配置中设置),该参数设置checkpoints创建的次数,如果maxIterations过大,使用checkpointing可以帮助减少磁盘上shuffle文件的大小,然后帮助失败恢复。
  • setSeed:随机种子

参数设置

Expectation Maximization

docConcentration: 提供Vector(-1)会导致默认值 (uniform k dimensional vector with value (50/k))+1。

topicConcentration: 提供-1会导致默认值0.1 加1。

Online Variational Bayes

docConcentration:Providing Vector(-1) results indefault behavior (uniform k dimensional vector with value ).

topicConcentration: Providing -1 results in defaulting to a value of .

[Latent Dirichlet allocation (LDA)]

[Asuncion, Welling, Smyth, and Teh. “On Smoothing and Inference for Topic Models.” UAI, 2009.]

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

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

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

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 )。
  • topicConcentration: 只支持对称的先验,值必须大于等于0。提供值-1会使用默认值 。
  • maxIterations: 提交的minibatches的最大次数。
  • 此外,OnlineLDAOptimizer 接收下列参数:

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

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

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

[PySpark.ml库中的Clustering]

皮皮blog

Spark实现LDA实例

步骤

1)加载数据

返回的数据格式为:documents: RDD[(Long, Vector)],其中:Long为文章ID,Vector为文章分词后的词向量;用户可以读取指定目录下的数据,通过分词以及数据格式的转换,转换成RDD[(Long, Vector)]即可。

2)建立模型

模型参数设置说明见上面的简介

3)结果输出

topicsMatrix以及topics(word,topic))输出。

注意事项

从Pyspark LDA model中获取document-topic matrix

mllib上的lda不是分布式的,目前好像只存储topic的信息,而不存储doc的信息,所以是没法获取doc-topic矩阵的。

要获取的话,只能使用ml中的lda,

或者使用scala版本的lda:

val ldaModel = lda.run(documents)

val distLDAModel = ldaModel.asInstanceOf[DistributedLDAModel]

distLDAModel.topicDistributions

[Extract document-topic matrix from Pyspark LDA Model]

使用pyspark实现LDA

  1. # -*- coding: utf-8 -*-
  2. [dev_pipi]
  3. corpus_filename = /home/pipi/files/DATASETS/SparkMLlib/sample_lda_data.txt
  4. ;corpus_filename = hdfs://...
  5. SPARK_HOME = /home/pipi/ENV/spark
  6. PYSPARK_PYTHON = /home/pipi/ENV/ubuntu_env/bin/python
  7. SPARK_LOCAL_IP = 127.0.0.1
  8. JAVA_HOME = /home/pipi/ENV/jdk
  9.  
  10. ;topic model设置
  11. K = 3
  12. alpha = 5
  13. beta = 5
  14. max_iter = 20
  15. seed = 0
  16. checkin_point_interval = 10
  17. optimizer = em

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. __title__ = 'Spark MLlib LDA实例代码'
  5. __author__ = 'pipi'
  6. __mtime__ = '16-10-24'
  7. __email__ = 'pipisorry@126.com'
  8. # code is far away from bugs with the god animal protecting
  9. I love animals. They taste delicious.
  10. ┏┓ ┏┓
  11. ┏┛┻━━━┛┻┓
  12. ┃ ☃ ┃
  13. ┃ ┳┛ ┗┳ ┃
  14. ┃ ┻ ┃
  15. ┗━┓ ┏━┛
  16. ┃ ┗━━━┓
  17. ┃ 神兽保佑 ┣┓
  18. ┃ 永无BUG! ┏┛
  19. ┗┓┓┏━┳┓┏┛
  20. ┃┫┫ ┃┫┫
  21. ┗┻┛ ┗┻┛
  22. """
  23.  
  24. def config():
  25. '''
  26. 运行前的参数配置
  27. '''
  28. import configparser, os
  29. SECTION = 'dev_pipi'
  30. conf = configparser.ConfigParser()
  31. conf.read(os.path.join(os.path.split(os.path.realpath(__file__))[], 'config.ini'))
  32.  
  33. global corpus_filename, K, alpha, beta, max_iter, seed, checkin_point_interval, optimizer
  34. corpus_filename = conf.get(SECTION, 'corpus_filename')
  35. K = conf.getint(SECTION, 'K')
  36. alpha = conf.getfloat(SECTION, 'alpha')
  37. beta = conf.getfloat(SECTION, 'beta')
  38. max_iter = conf.getint(SECTION, 'max_iter')
  39. seed = conf.getint(SECTION, 'seed')
  40. checkin_point_interval = conf.getint(SECTION, 'checkin_point_interval')
  41. optimizer = conf.get(SECTION, 'optimizer')
  42.  
  43. # spark environment settings
  44. import sys, os
  45. os.environ['SPARK_HOME'] = conf.get(SECTION, 'SPARK_HOME')
  46. sys.path.append(os.path.join(conf.get(SECTION, 'SPARK_HOME'), 'python'))
  47. os.environ["PYSPARK_PYTHON"] = conf.get(SECTION, 'PYSPARK_PYTHON')
  48. os.environ['SPARK_LOCAL_IP'] = conf.get(SECTION, 'SPARK_LOCAL_IP')
  49. os.environ['JAVA_HOME'] = conf.get(SECTION, 'JAVA_HOME')
  50.  
  51. import logging
  52. logging.basicConfig(], 'log.txt'), level=logging.DEBUG)
  53.  
  54. config()
  55.  
  56. from pyspark import SparkContext
  57. from pyspark.mllib.clustering import LDA, LDAModel
  58. from pyspark.mllib.linalg import Vectors
  59.  
  60. if __name__ == '__main__':
  61. sc = SparkContext(master='local[4]', appName='lda')
  62.  
  63. data = sc.textFile(corpus_filename).map(lambda line: Vectors.dense([float(i) for i in line.strip().split()]))
  64. corpus ], x[]]).cache()
  65. # print(corpus.take(5))
  66.  
  67. lda_model = LDA.train(rdd=corpus, maxIterations=max_iter, seed=seed, checkpointInterval=checkin_point_interval, k=K,
  68. optimizer=optimizer, docConcentration=alpha, topicConcentration=beta)
  69. topics = lda_model.topicsMatrix()
  70. ):
  71. print('Topic' + str(tid) + ':')
  72. , lda_model.vocabSize()):
  73. print(' ' + str(topics[wid, tid]))
  74. lda_model.describeTopics()
  75. sc.stop()
  76.  
  77. # df = pyspark.createDataFrame([[1, Vectors.dense([0.0, 1.0])], [2, SparseVector(2, {0: 1.0})],], ["id", "features"])

数据及结果:

1 2 6 0 2 3 1 1 0 0 3
1 3 0 1 3 0 0 2 0 0 1
1 4 1 0 0 4 9 0 1 2 0
2 1 0 3 0 0 5 0 2 3 9
3 1 1 9 3 0 2 0 0 1 3
4 2 0 3 4 5 1 1 1 4 0
2 1 0 3 0 0 5 0 2 2 9
1 1 1 9 2 1 2 0 0 1 3
4 4 0 3 4 2 1 3 0 0 0
2 8 2 0 3 0 2 0 2 7 2
1 1 1 9 0 2 2 0 0 3 3
4 1 0 0 4 5 1 3 0 1 0

  1. Topic0: Topic1: Topic2:
  2. 7.37834974184 9.73045219375 8.89119806441
  3. 6.59081862005 11.1175108178 11.2916705621
  4. 3.49398022369 4.20302495549 4.30299482082
  5. 22.1867881493 8.95779840996 8.8554134407
  6. 5.66785332714 10.4148634185 8.91728325435
  7. 4.66999543003 9.0609229138 8.26908165618
  8. 12.0788314276 8.65705135654 10.2641172159
  9. 2.15391819 4.20420496512 3.64187684489
  10. 2.92593942578 2.42997556379 2.64408501043
  11. 7.77320999456 7.84974291061 8.37704709483
  12. 19.3787362983 6.39079305857 7.2304706431

使用scala的spark实现LDA

[spark的python, scala, java示例代码:spark/examples/src]

[FatherAbraham1/MLlibMachineLearning]

from: http://blog.csdn.net/pipisorry/article/details/52912179

ref:

Spark:聚类算法之LDA主题模型算法的更多相关文章

  1. Spark机器学习(8):LDA主题模型算法

    1. LDA基础知识 LDA(Latent Dirichlet Allocation)是一种主题模型.LDA一个三层贝叶斯概率模型,包含词.主题和文档三层结构. LDA是一个生成模型,可以用来生成一篇 ...

  2. [综] Latent Dirichlet Allocation(LDA)主题模型算法

    多项分布 http://szjc.math168.com/book/ebookdetail.aspx?cateid=1&&sectionid=983 二项分布和多项分布 http:// ...

  3. 用scikit-learn学习LDA主题模型

    在LDA模型原理篇我们总结了LDA主题模型的原理,这里我们就从应用的角度来使用scikit-learn来学习LDA主题模型.除了scikit-learn,  还有spark MLlib和gensim库 ...

  4. R语言︱LDA主题模型——最优主题数选取(topicmodels)+LDAvis可视化(lda+LDAvis)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:在自己学LDA主题模型时候,发现该模 ...

  5. 理解 LDA 主题模型

    前言 gamma函数 0 整体把握LDA 1 gamma函数 beta分布 1 beta分布 2 Beta-Binomial 共轭 3 共轭先验分布 4 从beta分布推广到Dirichlet 分布 ...

  6. 通俗理解LDA主题模型

    通俗理解LDA主题模型 0 前言 印象中,最開始听说"LDA"这个名词,是缘于rickjin在2013年3月写的一个LDA科普系列,叫LDA数学八卦,我当时一直想看来着,记得还打印 ...

  7. 机器学习-LDA主题模型笔记

    LDA常见的应用方向: 信息提取和搜索(语义分析):文档分类/聚类.文章摘要.社区挖掘:基于内容的图像聚类.目标识别(以及其他计算机视觉应用):生物信息数据的应用; 对于朴素贝叶斯模型来说,可以胜任许 ...

  8. 自然语言处理之LDA主题模型

    1.LDA概述 在机器学习领域,LDA是两个常用模型的简称:线性判别分析(Linear Discriminant Analysis)和 隐含狄利克雷分布(Latent Dirichlet Alloca ...

  9. LDA主题模型三连击-入门/理论/代码

    目录 概况 为什么需要 LDA是什么 LDA的应用 gensim应用 数学原理 预备知识 抽取模型 样本生成 代码编写 本文将从三个方面介绍LDA主题模型--整体概况.数学推导.动手实现. 关于LDA ...

随机推荐

  1. Linux查看文件指定某些行的内容

    查看从第5行开始的100行内容,并把结果重定向到一个新的文件 cat file | tail -n +5 | head -n 100 > newfile.txt 查看第5行到100行的内容,并把 ...

  2. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 在脚本中使用MonoBehaviour

    继上次分析了热更新的Demo后,这次来介绍如何在热更新代码中使用MonoBehaviour. MonoBehaviour挂载到GameObject对象上的脚本的基类.平常Unity开发时,简单的做法就 ...

  3. Mysql查询小作业

    数据准备drop table if exists class;create table class(    class_no int(2) unsigned zerofill primary key ...

  4. [USACO 06NOV]Corn Fields

    Description 题库链接 给你一个 \(0,1\) 矩阵,只准你在 \(1\) 上放物品:并且要满足物品不能相邻.允许空放,问方案数,取模. \(1\leq n,m\leq 12\) Solu ...

  5. UVA - 11468:Substring

    随机生成一个字符可以看成在AC自动机里面向前走一个节点,那么ans就是0向前走L步并且不经过单词节点, 由概率知识可得,f[p][L]=∑f[nxt[p][i]][L-1]*g[i] 其中p表示位于p ...

  6. poj 1755 半平面交+不等式

    Triathlon Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6461   Accepted: 1643 Descrip ...

  7. 全排列hash-康拓展开

    这是对很多全排列问题适用的方法,而且还能用于一些题目的判重 第一位是3,当第一位的数小于3时,那排列数小于321 如 123. 213 ,小于3的数有1.2 .所以有2*2!个.再看小于第二位2的:小 ...

  8. bzoj1791: [Ioi2008]Island 岛屿 单调队列优化dp

    1791: [Ioi2008]Island 岛屿 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1826  Solved: 405[Submit][S ...

  9. java的数据结构

    常见的数据结构 线性表(list) 1.有序列表,就像小朋友排队(一队)放学出校门,插入的顺序作为遍历的顺序,位置不变(长度固定)  2.顺序存储:从起始位置开始依次向后存储,查询方便,但是插入(排队 ...

  10. PHP Laravel框架入门心得 | How to study PHP Laravel Framework

    PHP有不少开发框架,其中比较出名的有Symfony和Laravel. 我说说我最近入门Laravel的感受和学习方法吧. 1.第一个感受是Laravel的社区讨论和学习资源真的是太棒了,中文化也做得 ...