主题模型
只是看结论没那么复杂,但是理论依据相对麻烦。
如图,LDA的粗略示意图,即如何根据X从隐变量推出Z的分布。
严格意义来说,下面的示意图,是一个贝叶斯网络,只是LDA属于贝叶斯网络。LDA是一个三层的贝叶斯网络
问答
问:对于模型评估的时候,如果是有监督模型,y_hat, y_true是多类别的,如何把他们的ROC_AUC(只能画二分类的)的曲线画到同一个图上面?
答:邹博之前的课件,有根据鸢尾花数据,绘制出ROC曲线的示例
找了一下代码,找到车辆接受情况的例子,代码中包括了二分类与多分类,如何绘制ROC曲线与AUC的方法:
# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegressionCV
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
import matplotlib as mpl
import matplotlib.pyplot as plt
if __name__ == '__main__':
pd.set_option('display.width', 300)
pd.set_option('display.max_columns', 300)
data = pd.read_csv('car.data', header=None)
n_columns = len(data.columns)
columns = ['buy', 'maintain', 'doors', 'persons', 'boot', 'safety', 'accept']
new_columns = dict(list(zip(np.arange(n_columns), columns)))
data.rename(columns=new_columns, inplace=True)
print(data.head(10))
# one-hot编码
x = pd.DataFrame()
for col in columns[:-1]:
t = pd.get_dummies(data[col])
t = t.rename(columns=lambda x: col+'_'+str(x))
x = pd.concat((x, t), axis=1)
print(x.head(10))
# print x.columns
y = np.array(pd.Categorical(data['accept']).codes)
# y[y == 1] = 0
# y[y >= 2] = 1
x, x_test, y, y_test = train_test_split(x, y, train_size=0.7)
clf = LogisticRegressionCV(Cs=np.logspace(-3, 4, 8), cv=5)
clf.fit(x, y)
print(clf.C_)
y_hat = clf.predict(x)
print('训练集精确度:', metrics.accuracy_score(y, y_hat))
y_test_hat = clf.predict(x_test)
print('测试集精确度:', metrics.accuracy_score(y_test, y_test_hat))
n_class = len(np.unique(y))
if n_class > 2:
y_test_one_hot = label_binarize(y_test, classes=np.arange(n_class))
y_test_one_hot_hat = clf.predict_proba(x_test)
fpr, tpr, _ = metrics.roc_curve(y_test_one_hot.ravel(), y_test_one_hot_hat.ravel())
print('Micro AUC:\t', metrics.auc(fpr, tpr))
auc = metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='micro')
print('Micro AUC(System):\t', auc)
auc = metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='macro')
print('Macro AUC:\t', auc)
else:
fpr, tpr, _ = metrics.roc_curve(y_test.ravel(), y_test_hat.ravel())
print('AUC:\t', metrics.auc(fpr, tpr))
auc = metrics.roc_auc_score(y_test, y_test_hat)
print('AUC(System):\t', auc)
mpl.rcParams['font.sans-serif'] = 'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(8, 7), dpi=80, facecolor='w')
plt.plot(fpr, tpr, 'r-', lw=2, label='AUC=%.4f' % auc)
plt.legend(loc='lower right')
plt.xlim((-0.01, 1.02))
plt.ylim((-0.01, 1.02))
plt.xticks(np.arange(0, 1.1, 0.1))
plt.yticks(np.arange(0, 1.1, 0.1))
plt.xlabel('False Positive Rate', fontsize=14)
plt.ylabel('True Positive Rate', fontsize=14)
plt.grid(b=True, ls=':')
plt.title('ROC曲线和AUC', fontsize=18)
plt.show()
问:感觉LDA和EM很像啊,都有个中间的隐变量?
答:非常好。是这样的。
问:Z变量是隐变量还是可观测到的变量?
答:Z是可观测的,X是先验知识,采样的值,即中间部分是隐变量。
问:LDA是根据概率反推分布么?
答:不是的,贝叶斯网络是做这个的,即根据已知样本推算参数。
问:什么是贝叶斯网络?
答:贝叶斯网络的概念如下图:
贝叶斯网络在几年前很重要
贝叶斯网络是挺重要的,在深度学习火之前,几乎是机器学习中最可能落地的内容。虽然目前大家主要用神经网络做落地应用,但是贝叶斯网络还是很有用的。
举例说明,任何一个节点,用一个条件概率表,可以描述这个节点所有情况。
相关数据,有些容易获取,有些不容易获取,我们把容易获取的数据,得到条件概率表,去计算未知那些节点上的条件概率表。
即Inference,推断;或者Learning,学习
所以贝叶斯网络是:通过随机变量做节点,所形成的有向无环图。
而LDA就是有向无环图
问:我觉得深度学习在基础理论上的欠缺早晚会妨碍它自身的发展。
答:是的。
问:LDA: Latent Dirichlet Allocation为什么叫主题模型呢?好像和缩写不一样?
答:主题模型的简称是Topic Model,其实有很多种办法实现主题模型,比如:
- PLSA,概率化隐主题分析: 可以用EM算法来算
- LSI
- SVD (奇异值分解)
- LDA
-- 隐狄利克雷分布,无监督学习,降维 (本节课所提的LDA,是指这个)
-- 还有一个LDA,即线性判别分析(Linear Discriminant Analysis ),是有监督学习,降维。又名费舍尔准则
主要内容
应用方向
LDA最大的特点,就是带隐变量。
凡是涉及隐变量的应用,都有可能使用LDA。
邹博强调:生物信息数据的应用,是除了图像、自然语言之外,非常有可能落地的方向。不过不见得一定用LDA,也可以使用其他算法来做。
朴素贝叶斯的分析
在下一节课说它的原理,但是今天说另外一个事情。
主题的基本概念
M篇文档,
D1,具有w11, w12, w13, ..., w1n1,有n1个词,记为D1n1
D2 ,具有w21, w22, w23, ..., w2n2,有n2个词,记为D2n2
...
Dm,具有wm1, wm2, wm3, ..., wmnm,有nm个词,记为Dmnm
我们将所有词拿在一起,这些词当中不出意外,总有重复的词,称为Word。
我们将不重复的词拿出来,形成一个词典:Dictionary,如果有v个不重复的词,则将词典记为:t1, t2, t3,..., tv。
t为Term或Token(词项)的缩写。
回过头来看,wm1一定是词典v个Token中的某一个。
比如说w11是词典中第8个词,v的数目是1000,我们用one-hot编码,表示:
000000010000....0 (共1000个成员的向量,只有第8个成员的值是1)
w12是词典中第4个词,v的数目是1000,我们用one-hot编码,表示:
000100000000....0 (共1000个成员的向量,只有第4个成员的值是1)
如此这番,一直到n1个词,也这样通过one-hot编码表示。
因此得到n1 x v的非常稀疏的矩阵(one-hot矩阵)
同理,我们可以将D1, D2, ..., Dm都通过这样的one-hot矩阵表示出来。
所以我们现在所拿到的这些文档的维度,都是v维的。
而v的数目是1000,换句话说,就是所有文档不重复词的个数。
所以我们做自然语言处理,往往维度是很高的。
维度很高的话,就不好用,而且浓度太稀疏。
如果我们想用20列表示:
这个20,其实是我们想让其降维到某一个维度上去。
比如20列,第1列记为Z1,第2列记为Z2,..., 第20列记为Z20。
而这个n1 x 20的矩阵任意一行,都代表一个词,比如水杯。
降维之后,如果Z8列代表物体,Z1列代表爱情,
水杯这个词可能对应到Z8列,占了0.8的比例系数,对应到Z1列,占了0.15的比例系数,还有0.05的比例系数分布到其他18个类别。
于是长度为1000的v维的向量,映射到长度为20的向量,但是20项里面,水杯大概率属于物体这个类别,小概率属于爱情这个类别,极小概率属于其他类别。
于是我们可以总结为:我们选择了20个主题
所以我们可以将这些词,获取属于哪些主题的概率
即通过将v维降维至20之后,信息的浓度变高了
比如可以将键盘与鼠标归类到一个类别当中去。
也可以将某个词归类到多个主题,而主题就是隐变量。
比如cup这个词,归类到物体(水杯),或者体育(世界杯)多个主题
即通过主题做媒介,使得文档 -> 主题 -> 单词形成关系。
问答
问:对视觉类应聘者的要求?
答:要求就是没有要求。。。
问:有没有可能D1中间有全0行?
答:没有可能,因为任意一个词总是在词典中的
问:感觉把每一行加起来成为一个行向量也能用啊?
答:当然是可以的,但是浓度不够
问:每一个关键词和主题的相关性是一个已知的么?
答:不是的。因为我们可以观察到文档,比如天龙八部,也可以观察到包括的词,比如萧峰,丐帮,星宿派等等,但是观测不到主题,即隐变量。
问:主题是怎么选的?
答:主题个数一般不是选的,大都是事先先算出来,作为主题个数的确定。算出来之后,再确定主题的表达,比如爱情,政治,经济等等。
问:如果一般的问题,所谓的词是不是对应一个特征啊?
答:是的。
问:把停用词去掉,有时就剩下重要的词了?
答:是的,主题模型建立,一定要去停用词,比如:的,么,了等等
问:例子:天龙八部是文档,topic是隐变量?
答:是的
问:文档到主题的关系,是先验的么?
答:不是先验的,是要计算的。
问:每篇文档必定会对应一个部分具有1值的行向量么?会不会有可能不同文档对应同一个值?
答:不可能不同文档对应同一个值。文档对应不到词上,文档对应主题,主题对应词。
问:gensim是这个套路出来的么?
答:在LDA实践,会使用到Gensim,不再只是使用scikit-learn了。
引子:伽玛(γ)函数
看到伽玛函数,比如γ(8),其实就是7的阶乘,即7!
遇到γ(2.4),也可以认为是2.4的阶乘,因为2的阶乘是2,3的阶乘是6,所以2.4的阶乘是位于2~6之间的一个数
Beta分布
问答
问:Bag of Words后面需要用深度学习么?
答:不需要。Bag of Words仅仅是个认识,即我们用深度学习,会用到bag of words,比如直接用TF/ IDF求特征。当然,也有可能用n-gram对词做Word2Vec,将词映射到向量中去。
问:Topic这个隐变量服从什么分布,怎么确定?
答:Topic这个隐变量,如果是文档到主题,服从的是多项分布;从主题到单词,服从的是多项分布;如果加上主题之间的先验,则服从Dirichlet分布
问:词的顺序变,按实际情况应该是变了,至少含义应该变了?
答:这个是刚才说的假设,而且假设有发散性。结果或许是堪用的。
文档和主题的例子
LDA涉及的主要问题
共轭先验分布
说明:
p(θ):未给定任何数据时,参数θ的分布,称为先验分布
P(θ|x):给定数据之后的分布,称为后验分布
P(x|θ):有了参数θ,算出样本x的发生概率,即为似然概率。
实际样本分布,总是可以根据实际场景问题做建模。比如:如果x为身高或房价,则建模为高斯分布;如果x为骰子,则为六点分布;如果是数个数,则有可能建模为泊松分布;
先验概率 P(θ)x 似然概率P(x|θ) = 后验概率P(θ|x),如果先验概率 P(θ)与后验概率P(θ|x)都是同样的分布,那么先验分布和后验分布被叫做共轭分布。
这将利于我们的迭代运算。
这里的修正公式,分母+10,分子+5,是因为其符合Beta分布,所以PB的分子+5相当于α,PG的分子+5相当于β,而PB与PG的分母各自都+10,相当于α+β,符合Beta分布的期望E(X) = α / α+β
如图,Beta分布就是二项分布的共轭先验分布。
更详细解释为:先验分布P(θ)是α与β的Beta分布;后验分布P(θ|x)是K+α与n-k+β的Beta分布,二者都是Beta分布
问答
问:听说有一种识别大众情绪的算法,先随机分配标签(包括一些分错的标签),然后采用一种自适应的方法多次迭代修改最初的错误,直到找不到更多的错误为止。请问这种方法也可以用到EM或是深度学习解决么?
答:其实不仅是识别大众情绪,很多场景都可以这样做。比如K均值聚类,最开始就是将样本随机分为几个簇,然后迭代修正簇的数目。
最开始定初值,往往都是拍脑门做的。
问:为什么P(x)可以省略?
答:x是样本,如果P(x|θ)是给了参数θ,算x的分布的话,那么P(x)是证据,与θ是无关的,所以可以省略P(x)
问:最终是要学习两个多项分布么?
答:PLSA(概率化隐主题分析)是的,LDA不是的。LDA需要学习两个多项分布以及两个Dirichlet分布,是且的关系。当然,最后输出是两个多项分布,但是过程得到的是两个Dirichlet分布,即利用两个Dirichlet分布得到两个多项分布。
问:共轭怎么理解?
答:大家第一次看到轭这个字的时候,是在学数学的时候,但是这不是数学老师的原因。其实属于语文老师的原因。这里的共轭的轭与虚数没关系。
共轭的意思是相互依赖,相互依存的关系。
我们将这样的关系,称为对偶的,或者共轭的,或者相关的。
下图是邹博老师绘制的辕与共轭的关系:
伪计数
如将抛硬币的场景,换为抛骰子的场景。
则α,β,就变成了α1, α2, α3, α4, α5, α6
如果是20个主题,则α,β,就变成了α1, α2, α3..., α19, α20
这就变成了Dirichlet分布
问答
问:学过的分布中有几对共轭分布?
答:高斯分布的均值,其共轭分布还是高斯分布;高斯分布的方差是伽玛分布;
Dirichlet分布可以从Beta分布推导而来:
我们将二项分布的:xα-1(1-x)β-1替换为x1α1-1x2α2-1,对于多项分布,则可以看做:
x1α1-1x2α2-1x3α3-1x4α4-1...xkαk-1
其中x∈[0, 1],且x1 + x2 + x3 + ... + xk = 1
δ(α->)其实就是S(α1, α2, α3, ..., αk),即面积,且积分为1
δ(α->)不是主要关注点
主要关注点应该是:pkαk-1,这表示才是概率与参数α之间的关系。
问答
问:哪些分布是Dirichlet分布?
答:事实上,Dirichlet分布是造出来的分布。
邹博这个时候自言自语:当初1000多人,现在只有100多人了;如果之后又学习录播的,大概只会有两三百人。当然,还有不知有谁散播出去的盗版,也许学习的人要更多一些(比如B站,哈哈哈)
如果α1=α2=...=αk,则称为对称Dirichlet分布
如α=6,且是四元的,则x15x25x35x45,写为(6, 4)
我们往往会取对称Dirichlet分布
α = 1,因为取均值,所以退化为平面:
α > 1:
α < 1:
初始情况,大概率会取样到极值,但有一些主题没有被取样,直观体现如图,这也符合一般情况,即一篇文档不会面面俱到,什么都谈的文档,一般什么都谈不好,一篇文档聚焦在某几个主题的概率很大,其他主题的概率很小,换句话来说,α ∈[0, 1],可能是我们取的先验值:
调参经验传授:做LDA的时候,在条件允许的情况下,α值尽量不要设置太大,这样做的好处是充分考虑样本的因素,而不要过分考虑先验参数的影响。
当然,如果先验给的大,就是更多考虑先验,而不是样本。这需要充分根据实际情况决定,如果说我们认为样本的情况是重要的,就不要加入太大的先验。
在EM算法的课程,DPGMM(Dirichlet过程高斯混合模型)里面也有一个先验参数,它的Dirichlet过程,就是调α值,尽量不要太大
dpgmm = BayesianGaussianMixture(n_components=n_components,
covariance_type='full',
max_iter=1000,
n_init=5,
weight_concentration_prior_type='dirichlet_process',
weight_concentration_prior=0.1)
其中,weight_concentration_prior就是α值
问答:
问:这个是不是可以用来给微博内容打标签呢?
答:如果对微博内容分类,是可以的。先将微博做成长文档,然后主题模型聚类,然后喂给LPA,半监督的标签传播算法。
LDA的解释
很重要
这是一个生成模型。
由于最近GAN的火爆,大家应该对生成模型不陌生了。
1. 文章到主题分布的过程
生成模型的概念:摆在我们面前的不是最终的文档,而是一个可以生成文档的机器。用这个机器生成我们的样本。
以 《天龙八部》为例,我们假定有如下主题以及各自的分布:
武侠 0.7, 爱情 0.2, 军事 0.08, 历史 0.02, 机器学习 0, 经济 0
以《自然语言处理入门》为例,这些主题对应的分布:
武侠 0, 爱情 0.01, 军事 0, 历史 0, 机器学习 0.99, 经济 0
6个主题,决定了若干个6点分布,形成了6项分布
P1P2P3P4P5P6
因为服从Dirichlet分布,即Dir(Pi|αi),如果αi都取0.1,因为Pi的指数项为αi-1,则Pi可写为:
P1-0.9P2-0.9P3-0.9P4-0.9P5-0.9P6-0.9
这就是取0.1这个α值的时候的6点分布的共轭先验分布,即Dirichlet分布。
这个分布,跟我们的主题之间的关系,仅仅在于主题之间的参数们,如《天龙八部》:武侠 0.7, 爱情 0.2, 军事 0.08, 历史 0.02, 机器学习 0, 经济 0,而《自然语言处理入门》:武侠 0, 爱情 0.01, 军事 0, 历史 0, 机器学习 0.99, 经济 0。。。都是可能从这个分布当中采样采出来的。
这个分布需要两个参数:
- α,比如取0.1
- k,比如取6(即主题的假定个数)
2. 主题到词分布的过程
词分布,比如有1万个词,武侠这个主题中,共有t1 t2 t3 ... tv个词,这些词中,可能“少林寺”被采样的概率极高,但是武侠这个主题中,出现“计算机”这个词的概率就很小。
所以不同的主题,词不一样。
对于武侠这个主题,就是v个词的词分布。
词分布是多项分布,其参数服从Dirichlet分布。
- β,比如取0.01
- V,取100000 (10万个词)
这样就可以通过Dirichlet分布描述词分布的参数:β
β应该是向量,但是我们采用对称Dirichlet分布,那么β就是标量,例如:0.01
3. 如何生成呢?
首先文章到主题:(α, k),得到P1P2P3...Pk的主题分布,本身是多项分布,只是参数α采样自Dirichlet分布
主题分布的k个参数值们采出一个数来,比如8, 4或者3, 记为z
z是标量,∈[1, k],得到第几号主题
然后从词到主题:(β, v)
从(β, v)这个超参数,做一个Dirichlet分布,采样采出词分布,记做:
φ(1)1φ(1)2...φ(1)v,这是我们第一个词分布,即对应第一号主题的分布
继续采出词分布:
φ(2)1φ(2)2...φ(2)v,这是我们第二个词分布,即对应第二号主题的分布
...
然后采k回,得到:
φ(k)1φ(k)2...φ(k)v,这是我们第k个词分布,即对应第k号主题的分布
刚才得到一个标量z,而这个标量的值是[1, k]的,则根据z,比如8,则挑出第8行:φ(8)1φ(8)2...φ(8)v
如果z=3,则挑出第3行:φ(3)1φ(3)2...φ(3)v
则挑出的这一行词,是z号主题的词分布。
词分布本身是多项分布,从v个词选出一个词,比如选中了φ(2)n,将这个词,填充到wm, n中去,完成第m个文档,第n个词的生成。
我们再去完成第m个文档的第n+1个词,第n+2个词。。。
如此不断生成,将摆在我们面前的m个文档的所有词都生成出来。
问答
问:Word2Vec用了LDA的思想了吗?
答:不是,相似词比较,环境往往是相似的。Word2Vec就是这么玩的
问:主题分布的那些概率是已知的还是算出来的?
答:主题分布的概率是算出来的。但是α,k,β是我们事先给的,v是数出来的
问:前面推导的Dirichlet分布的期望,在哪儿使用了呢?没看到啊
答:最后的地方会让大家来看到。用Dirichlet分布的期望解释词分布与主题分布是怎么回事
问:文档的词都是已经知道的啊,还生成什么?
答:我们有认识事物的两种方法。
首先我们有样本(x1, y1), (x2, y2), ..., (xn, yn),
根据xi得到yi的模型,叫做判别模型(Determination),如线性回归,Logistic回归,决策树,随机森林,SVM, CNN,条件随机场(CRF)等都是判别模型
根据yi得到xi的模型,叫做生成模型(Generation),如LDA(本质是贝叶斯网络),朴素贝叶斯,隐马尔科夫模型,都是生成模型
这是认识事物不同的方式
不管用什么方式,都可以求参数。
问:β是做什么的?
答:其与α的原理是一样的,从β这个超参数生成词分布;相应的,α是生成主题分布的。
问:如果是连续变量,需要进行离散化么?
答:有些是需要的。
问:结合购物篮是否可以进行用户画像呢?例如年轻,香水,包包,意味着某种标签呢?
答:是有可能通过用户行为,推断这个人的情况。
4. 推导过程
吉布斯采样
更新规则结论。
即判断给定的文档w,第i个词,属于k号主题的概率。
主题也涉及一词多义的情况,比如之前提过的cup,在《成长的烦恼》中,应该指水杯,属于生活主题;而如果在某篇文章,这个词旁边有阿根廷,梅西,法国队等词,应该指奖杯,属于体育主题。
所以,词属于哪一个主题,真的与文档是相关的。
文档本身,第k号主题出现的概率,与词属于哪一个主题,是成正比的。
比如某人来自清华大学,自然认为这个人学习好。
从词方面出发,如果前9个词与旅游相关,那么第10个词与旅游相关的概率也很大,因为相关。
这是直观解释。
问答
问:到底什么是吉布斯采样?
答:其实是又绕过一个问题,即绕过了采样这个章节。
问:能不能讲讲采样?
答:采样已经更到了下面一层。有兴趣可以自己看一看,作为知识储备
问:生成模型是为了学习最后的参数么?
答:是的。就是为了做拟合。
问:EM算法也讲了主题模型,和LDA这个有什么区别?
答:两个是不一样的贝叶斯网络。EM算法中的主题模型,是两层的PIA;LDA中的是三层的
问:LDA除了做主题模型还有其他应用吗?比如是否可以用于用户画像呢?
答:用户画像,还不如使用标签,然后通过标签做传递;当然,如果觉得样本特征数据稀疏,即浓度不够,可以用LDA降维。其可以起到降维,浓度,增强的作用。