Spark:聚类算法之LDA主题模型算法
http://blog.csdn.net/pipisorry/article/details/52912179
Spark上实现LDA原理
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的最大次数。
- miniBatchFraction: 每次迭代使用的语料库抽样比例。
- optimizeDocConcentration: 如果设置为true,每次 minibatch 之后计算参数 docConcentration (aka alpha) 的最大似然估计,然后在返回的 LocalLDAModel 使用优化了的docConcentration。
- 和 : 用作学习率衰减,用 计算,这里 是目前的迭代次数。
- logLikelihood(documents): 给定推断的主题,计算提供的文档的下界。
- logPerplexity(documents): 给定推断的主题,计算提供的文档的复杂度的上界。
此外,OnlineLDAOptimizer 接收下列参数:
OnlineLDAOptimizer 生成 LocalLDAModel,它只存储了推断的主题。LocalLDAModel支持:
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
- # -*- coding: utf-8 -*-
- [dev_pipi]
- corpus_filename = /home/pipi/files/DATASETS/SparkMLlib/sample_lda_data.txt
- ;corpus_filename = hdfs://...
- SPARK_HOME = /home/pipi/ENV/spark
- PYSPARK_PYTHON = /home/pipi/ENV/ubuntu_env/bin/python
- SPARK_LOCAL_IP = 127.0.0.1
- JAVA_HOME = /home/pipi/ENV/jdk
- ;topic model设置
- K = 3
- alpha = 5
- beta = 5
- max_iter = 20
- seed = 0
- checkin_point_interval = 10
- optimizer = em
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """
- __title__ = 'Spark MLlib LDA实例代码'
- __author__ = 'pipi'
- __mtime__ = '16-10-24'
- __email__ = 'pipisorry@126.com'
- # code is far away from bugs with the god animal protecting
- I love animals. They taste delicious.
- ┏┓ ┏┓
- ┏┛┻━━━┛┻┓
- ┃ ☃ ┃
- ┃ ┳┛ ┗┳ ┃
- ┃ ┻ ┃
- ┗━┓ ┏━┛
- ┃ ┗━━━┓
- ┃ 神兽保佑 ┣┓
- ┃ 永无BUG! ┏┛
- ┗┓┓┏━┳┓┏┛
- ┃┫┫ ┃┫┫
- ┗┻┛ ┗┻┛
- """
- def config():
- '''
- 运行前的参数配置
- '''
- import configparser, os
- SECTION = 'dev_pipi'
- conf = configparser.ConfigParser()
- conf.read(os.path.join(os.path.split(os.path.realpath(__file__))[], 'config.ini'))
- global corpus_filename, K, alpha, beta, max_iter, seed, checkin_point_interval, optimizer
- corpus_filename = conf.get(SECTION, 'corpus_filename')
- K = conf.getint(SECTION, 'K')
- alpha = conf.getfloat(SECTION, 'alpha')
- beta = conf.getfloat(SECTION, 'beta')
- max_iter = conf.getint(SECTION, 'max_iter')
- seed = conf.getint(SECTION, 'seed')
- checkin_point_interval = conf.getint(SECTION, 'checkin_point_interval')
- optimizer = conf.get(SECTION, 'optimizer')
- # spark environment settings
- import sys, os
- os.environ['SPARK_HOME'] = conf.get(SECTION, 'SPARK_HOME')
- sys.path.append(os.path.join(conf.get(SECTION, 'SPARK_HOME'), 'python'))
- os.environ["PYSPARK_PYTHON"] = conf.get(SECTION, 'PYSPARK_PYTHON')
- os.environ['SPARK_LOCAL_IP'] = conf.get(SECTION, 'SPARK_LOCAL_IP')
- os.environ['JAVA_HOME'] = conf.get(SECTION, 'JAVA_HOME')
- import logging
- logging.basicConfig(], 'log.txt'), level=logging.DEBUG)
- config()
- from pyspark import SparkContext
- from pyspark.mllib.clustering import LDA, LDAModel
- from pyspark.mllib.linalg import Vectors
- if __name__ == '__main__':
- sc = SparkContext(master='local[4]', appName='lda')
- data = sc.textFile(corpus_filename).map(lambda line: Vectors.dense([float(i) for i in line.strip().split()]))
- corpus ], x[]]).cache()
- # print(corpus.take(5))
- lda_model = LDA.train(rdd=corpus, maxIterations=max_iter, seed=seed, checkpointInterval=checkin_point_interval, k=K,
- optimizer=optimizer, docConcentration=alpha, topicConcentration=beta)
- topics = lda_model.topicsMatrix()
- ):
- print('Topic' + str(tid) + ':')
- , lda_model.vocabSize()):
- print(' ' + str(topics[wid, tid]))
- lda_model.describeTopics()
- sc.stop()
- # 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
- Topic0: Topic1: Topic2:
- 7.37834974184 9.73045219375 8.89119806441
- 6.59081862005 11.1175108178 11.2916705621
- 3.49398022369 4.20302495549 4.30299482082
- 22.1867881493 8.95779840996 8.8554134407
- 5.66785332714 10.4148634185 8.91728325435
- 4.66999543003 9.0609229138 8.26908165618
- 12.0788314276 8.65705135654 10.2641172159
- 2.15391819 4.20420496512 3.64187684489
- 2.92593942578 2.42997556379 2.64408501043
- 7.77320999456 7.84974291061 8.37704709483
- 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主题模型算法的更多相关文章
- Spark机器学习(8):LDA主题模型算法
1. LDA基础知识 LDA(Latent Dirichlet Allocation)是一种主题模型.LDA一个三层贝叶斯概率模型,包含词.主题和文档三层结构. LDA是一个生成模型,可以用来生成一篇 ...
- [综] Latent Dirichlet Allocation(LDA)主题模型算法
多项分布 http://szjc.math168.com/book/ebookdetail.aspx?cateid=1&§ionid=983 二项分布和多项分布 http:// ...
- 用scikit-learn学习LDA主题模型
在LDA模型原理篇我们总结了LDA主题模型的原理,这里我们就从应用的角度来使用scikit-learn来学习LDA主题模型.除了scikit-learn, 还有spark MLlib和gensim库 ...
- R语言︱LDA主题模型——最优主题数选取(topicmodels)+LDAvis可视化(lda+LDAvis)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:在自己学LDA主题模型时候,发现该模 ...
- 理解 LDA 主题模型
前言 gamma函数 0 整体把握LDA 1 gamma函数 beta分布 1 beta分布 2 Beta-Binomial 共轭 3 共轭先验分布 4 从beta分布推广到Dirichlet 分布 ...
- 通俗理解LDA主题模型
通俗理解LDA主题模型 0 前言 印象中,最開始听说"LDA"这个名词,是缘于rickjin在2013年3月写的一个LDA科普系列,叫LDA数学八卦,我当时一直想看来着,记得还打印 ...
- 机器学习-LDA主题模型笔记
LDA常见的应用方向: 信息提取和搜索(语义分析):文档分类/聚类.文章摘要.社区挖掘:基于内容的图像聚类.目标识别(以及其他计算机视觉应用):生物信息数据的应用; 对于朴素贝叶斯模型来说,可以胜任许 ...
- 自然语言处理之LDA主题模型
1.LDA概述 在机器学习领域,LDA是两个常用模型的简称:线性判别分析(Linear Discriminant Analysis)和 隐含狄利克雷分布(Latent Dirichlet Alloca ...
- LDA主题模型三连击-入门/理论/代码
目录 概况 为什么需要 LDA是什么 LDA的应用 gensim应用 数学原理 预备知识 抽取模型 样本生成 代码编写 本文将从三个方面介绍LDA主题模型--整体概况.数学推导.动手实现. 关于LDA ...
随机推荐
- Linux查看文件指定某些行的内容
查看从第5行开始的100行内容,并把结果重定向到一个新的文件 cat file | tail -n +5 | head -n 100 > newfile.txt 查看第5行到100行的内容,并把 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 在脚本中使用MonoBehaviour
继上次分析了热更新的Demo后,这次来介绍如何在热更新代码中使用MonoBehaviour. MonoBehaviour挂载到GameObject对象上的脚本的基类.平常Unity开发时,简单的做法就 ...
- Mysql查询小作业
数据准备drop table if exists class;create table class( class_no int(2) unsigned zerofill primary key ...
- [USACO 06NOV]Corn Fields
Description 题库链接 给你一个 \(0,1\) 矩阵,只准你在 \(1\) 上放物品:并且要满足物品不能相邻.允许空放,问方案数,取模. \(1\leq n,m\leq 12\) Solu ...
- UVA - 11468:Substring
随机生成一个字符可以看成在AC自动机里面向前走一个节点,那么ans就是0向前走L步并且不经过单词节点, 由概率知识可得,f[p][L]=∑f[nxt[p][i]][L-1]*g[i] 其中p表示位于p ...
- poj 1755 半平面交+不等式
Triathlon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6461 Accepted: 1643 Descrip ...
- 全排列hash-康拓展开
这是对很多全排列问题适用的方法,而且还能用于一些题目的判重 第一位是3,当第一位的数小于3时,那排列数小于321 如 123. 213 ,小于3的数有1.2 .所以有2*2!个.再看小于第二位2的:小 ...
- bzoj1791: [Ioi2008]Island 岛屿 单调队列优化dp
1791: [Ioi2008]Island 岛屿 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1826 Solved: 405[Submit][S ...
- java的数据结构
常见的数据结构 线性表(list) 1.有序列表,就像小朋友排队(一队)放学出校门,插入的顺序作为遍历的顺序,位置不变(长度固定) 2.顺序存储:从起始位置开始依次向后存储,查询方便,但是插入(排队 ...
- PHP Laravel框架入门心得 | How to study PHP Laravel Framework
PHP有不少开发框架,其中比较出名的有Symfony和Laravel. 我说说我最近入门Laravel的感受和学习方法吧. 1.第一个感受是Laravel的社区讨论和学习资源真的是太棒了,中文化也做得 ...