原文链接:http://tecdat.cn/?p=4261

原文出处:拓端数据部落公众号

应用潜在Dirichlet调配(LDA)和t-SNE中的可视化进行主题建模。

本文中的代码片段仅供您在浏览时更好地了解。无关残缺的工作代码,请参阅残缺材料。

咱们将首先介绍主题建模和t-SNE,而后将这些技术利用于两个数据集:20个新闻组和推文。

什么是主题建模?

主题模型是一套算法/统计模型,能够揭示文档集中的暗藏主题。文档通常波及不同比例的多个主题,特地是在跨学科文档中(例如,60%对于生物学,25%对于统计学,15%对于计算机科学的生物信息学文章)。主题模型在数学框架中检查和发现主题可能是什么以及每个文档的主题可能性。

热门话题建模算法包含潜在语义剖析(LSA),分层Dirichlet过程(HDP)和潜在Dirichlet调配(LDA),其中LDA在实践中曾经显示出很好的后果,因而被宽泛采纳。这篇文章将应用LDA进行主题建模。

T-SNE

t-SNE或t散布随机邻域嵌入是用于高维数据可视化的维数升高算法。这部分是为了加重人类不能(至多当初不能)感知超过3-D的向量空间这一事实。

这是一个降维并在三维空间中可视化的示例(信用:Google嵌入我的项目)

t-SNE是不确定的,其后果取决于数据批次。换句话说,绝对于批次中的其余数据点,雷同的高维数据点能够被转换成不同批次的不同2-D或3-D向量。

能够应用各种语言实现t-SNE,但速度可能会有所不同。

环境

15-inch MacBook Pro, macOS Sierra

2.2 GHz Intel Core i7 processor

16 GB 1600 MHz DDR3 memory

1.将10,000 x 50矩阵转换为10,000 x 2

C ++和Python

real 1m2.662s

user 1m0.575s

sys 0m1.929s

Python sklearn

real 3m29.883s

user 2m22.748s

sys 1m7.010s

2.将20,000 x 50矩阵转换为20,000 x 2

C ++和Python

real 2m40.250s

user 2m32.400s

sys 0m6.420s

Python sklearn

real 6m54.163s

user 4m17.524s

sys 2m31.693s

3.将1,000,000 x 25矩阵转换为1,000,000 x 2

C ++和Python

real 224m55.747s

user 216m21.606s

sys 8m21.412s

Python sklearn

out of memory... :(

t-SNE的作者说,他们“曾经将这项技术利用于数据集,最多有3000万个例子”(只管他没有指定数据和运行时的维度)。如果你有一个更大的数据集,你能够扩充你的硬件,调整参数(例如,sklearn的t-SNE中的angle参数),或尝试代替(如LargeVis,其作者宣称“与tSNE比拟,LargeVis显着升高了图形构建步骤的计算成本“。我还没有测试过它。

把它放在一起:20个新闻组的例子

在本节中,咱们将在20个新闻组数据集上利用LDA算法,以发现每个文档中的根底主题,并应用t-SNE将它们显示为组。

获取数据

sklearn具备检索和过滤20个新闻组数据的性能:

from sklearn.datasets import fetch_20newsgroups remove = ('headers', 'footers', 'quotes') newsgroups\_train = fetch\_20newsgroups(subset ='train', remove =remove)newsgroups\_test = fetch\_20newsgroups(subset ='test', remove =remove)  news = \[' ' .join(filter(unicode .isalpha, raw .lower() .split())) for raw innewsgroups\_train .data + newsgroups\_test .data\]

LDA模型

在咱们取得清理后的数据后,咱们能够对数据进行矢量化并训练LDA模型:

import ldafrom sklearn.feature_extraction.text import CountVectorizern_topics = 20 # 主题数目n_iter = 500 # 循环次数 cvectorizer = CountVectorizer(min\_df =5, stop\_words ='english')cvz = cvectorizer .fit_transform(news) lda\_model = lda .LDA(n\_topics =n\_topics, n\_iter =n_iter)X\_topics = lda\_model .fit_transform(cvz)

其中X\_topics是18,846(num\_news)乘20(n\_topics)矩阵。留神,咱们在这里有一个很好的概率解释:每一行是属于某个主题的这个新闻的概率分布(由咱们的LDA模型学习)(例如,X\_topics[0][0]代表属于主题1的第一个新闻的可能性)。

用t-SNE缩小到2-D

咱们有一个学习过的LDA模型。但咱们无奈直观地查看咱们的模型有多好。t-SNE来剖析:

from sklearn.manifold import TSNE tsne\_model = TSNE(n\_components =2, verbose =1, random_state =0, angle =.99, init='pca')# 20-D -> 2-Dtsne\_lda = tsne\_model .fit\_transform(X\_topics)

可视化组及其关键字

当初,咱们已筹备好应用风行的Python可视化库来可视化新闻组和关键字。

首先咱们做一些设置工作(导入类和函数,设置参数等):

import numpy as npimport bokeh.plotting as bpfrom bokeh.plotting import savefrom bokeh.models import HoverTooln\_top\_words = 5 colormap = np .array(\["#1f77b4", "#aec7e8", "#ff7f0e", "#ffbb78", "#2ca02c","#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5","#8c564b", "#c49c94", "#e377c2", "#f7b6d2", "#7f7f7f","#c7c7c7", "#bcbd22", "#dbdb8d", "#17becf", "#9edae5"\])

而后咱们找到每个新闻最可能的主题:

\_lda\_keys = \[\]for i in xrange(X_topics .shape\[0\]):\_lda\_keys += _topics\[i\] .argmax(),并取得每个主题的顶级单词:topic_summaries = \[\]topic\_word = lda\_model .topic\_word\_ # 所有主题关键词vocab = cvectorizer .get\_feature\_names()for i, topic\_dist in enumerate(topic\_word):topic\_words = np .array(vocab)\[np .argsort(topic\_dist)\]\[: -(n\_top\_words + 1): -1\] # 取得数据topic\_summaries .append(' ' .join(topic\_words)) # 加到单词列表

咱们绘制新闻(每个点代表一个新闻):

title = '20 newsgroups LDA viz'num\_example = len(X\_topics)plot\_lda = bp .figure(plot\_width =1400, plot_height =1100,title =title,tools ="pan,wheel\_zoom,box\_zoom,reset,hover,previewsave",x\_axis\_type =None, y\_axis\_type =None, min_border =1)plot\_lda .scatter(x =tsne\_lda\[:, 0\], y =tsne_lda\[:, 1\],color =colormap\[\_lda\_keys\]\[:num_example\],source =bp .ColumnDataSource({"content": news\[:num_example\],"topic\_key": \_lda\_keys\[:num\_example\]}))#绘制每个主题的关键词: topic\_coord = np .empty((X\_topics .shape\[1\], 2)) * np .nanfor topic\_num in \_lda_keys:if not np .isnan(topic_coord) .any():breaktopic\_coord\[topic\_num\] = tsne\_lda\[\_lda\_keys .index(topic\_num)\] for i in xrange(X_topics .shape\[1\]):plot\_lda .text(topic\_coord\[i, 0\], topic\_coord\[i, 1\], \[topic\_summaries\[i\]\]) hover = plot_lda .select(dict(type =HoverTool))hover .tooltips = {"content": "@content - topic: @topic_key"} save(plot_lda, '{}.html' .format(title))

你会失去一个像这样的交互式图表:

当咱们为每个文档调配一个次要主题时,有些状况最可能的主题的概率相当低(极其状况是每个主题被调配5%,即,均匀分布)。换句话说,咱们的模型无奈为这样的新闻调配主题。

一种解决办法是增加一个阈值因子,以帮忙过滤掉低相信的调配。在咱们训练LDA模型之后,应用t-SNE缩小维数之前,简略地阐明:

import numpythreshold = 0.5\_idx = np .amax(X\_topics, axis =1) > threshold  X\_topics = X\_topics\[_idx\]

并从新运行咱们将失去的代码:

看起来好多了:独立和明确的簇!

推文示例

Twitter已成为最受欢迎的新闻和社交网络服务(SNS)平台之一。咱们也能够应用推文语料库来模仿主题。

咱们心愿将推文保留到磁盘并积攒肯定数量(至多数百万)来无效地模仿主题,而不是将推文放在内存中进行实时处理。

首先,咱们须要建设一个推文连贯,咱们能够抓取实时推文:

至多花一两天工夫来积攒相当数量的推文。有时连贯可能会中断:只需从新运行脚本,以便将新推文保留到磁盘。

取得足够的推文后,咱们能够加载推文,解决它们,对它们进行矢量化并计算tf-idf分数,训练LDA模型,缩小到2-D,并可视化后果。请参阅此处的残缺脚本。

你会失去一个如下图:

这是对200万条推文进行过训练的模型的可视化,只显示了5,000个数据点(或推文)。咱们有一些很好的集群学习模型: “视频点赞新”代表社交网络内容。


参考文献

1.matlab偏最小二乘回归(PLSR)和主成分回归(PCR)和主成分回归(PCR)")

2.R语言高维数据的主成分pca、 t-SNE算法降维与可视化剖析

3.主成分剖析(PCA)基本原理及剖析实例基本原理及剖析实例")

4.基于R语言实现LASSO回归剖析

5.应用LASSO回归预测股票收益数据分析

6.r语言中对lasso回归,ridge岭回归和elastic-net模型

7.r语言中的偏最小二乘回归pls-da数据分析

8.r语言中的偏最小二乘pls回归算法

9.R语言线性判别分析(LDA),二次判别分析(QDA)和正则判别分析(RDA)