文章目录
PLSA
PLSA(Probabilistic Latent Semantic Analysis) 概率隐语义分析
PLSA (概率潜语义分析) 是基于双模式和共现的数据分析方法延伸的经典的统计学方法。概率潜语义分析应用于信息检索,过滤,自然语言处理,文本的机器学习或者其他相关领域。概率潜语义分析与标准潜语义分析的不同是,标准潜在语义分析是以共现表(就是共现的矩阵)的奇异值分解的形式表现的,而概率潜在语义分析却是基于派生自 LCM 的混合矩阵分解。考虑到word和doc共现形式,概率潜语义分析基于多项式分布和条件分布的混合来建模共现的概率。所谓共现其实就是W和D的一个矩阵,所谓双模就是在W和D上同时进行考虑。
PLSA的缺点:
PLSA有时会出现过拟合的现象。所谓过拟合(Overfit),是这样一种现象:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集上却不能很好的拟合数据。此时我们就叫这个假设出现了overfit的现象。出现这种现象的主要原因是训练数据中存在噪音或者训练数据太少。
解决办法,要避免过拟合的问题,PLSA使用了一种广泛应用的最大似然估计的方法,期望最大化。PLSA中训练参数的值会随着文档的数目线性递增。PLSA可以生成其所在数据集的的文档的模型,但却不能生成新文档的模型。
PLSA是LSA的概率学延伸,所以我们首先要知道LSA的算法。
LSA
LSA的算法:
假设有N篇的document,D={d_1, … ,d_N},和M个words,W={w_1, … ,w_M},再设置K个潜在类Z={z_1, … ,z_K}。
首先,建立一个N*M的项——文档矩阵,统计频率。矩阵A中的每一项分别对应了DiWj出现的频率。这个就是前面说的共现表。
接着,对这个矩阵做奇异值分解。这个是奇异值分解的公式。A(nm) = U(nn) E(nm) VT(mm)
保留奇异值矩阵E的K个特征值(奇异值是特征值的非负平方根)。然后求矩阵A的共轭转置AH,然后奇异值分解AH。
A H ( n ∗ m ) = U ( n ∗ k ) E ( k ∗ k ) V T ( k ∗ m ) AH(n*m) = U(n*k) E(k*k) VT(k*m) AH(n∗m)=U(n∗k)E(k∗k)VT(k∗m)
AH ≈ A
这时,一个项(term)其实就是K维向量空间的的一维。
把意义相同的项(term)做同一映射。
到这里就很清楚的看出来,LSA没有建立统计学基础。但是PLSA就解决了这个问题。
PLSA:
PLSA是更为先进的方法。他解决了同义词和多义词的问题,利用了强化的期望最大化算法(EM)来训练隐含类(潜在类)。而且相对了LSA,有了坚实的统计学基础。
PLSA的建模——层面模型
层面模型就是关联于潜在类Z的共现表的潜在可变模型。在层面模型中,文档被视为潜在的K个层面的混合。每一个层面就是word对于z(潜在类)的概率分布。
PLSA的建模——数据的共现
对于每一组(w,d)都使之与潜在变量z关联。
PLSA的建模——预测words
已经的是文档的概率,首先要计算潜在类Z根据条件概率D,生成单词W根据条件概率Z。
PLSA的公式:
P ( w , d ) = ∑ P ( c ) P ( d ∣ c ) P ( w ∣ c ) = P ( d ) ∑ P ( c ∣ d ) P ( w ∣ c ) P(w,d) = ∑ P(c)P(d | c)P(w | c) = P(d) ∑ P(c | d)P(w | c) P(w,d)=∑P(c)P(d∣c)P(w∣c)=P(d)∑P(c∣d)P(w∣c)
注:这里的C和上面说的Z是一样的。
公式解析:第一个公式是对称公式,在这个公式中,W和D都是以相同的方式(都用了W和D基于C的条件概率)通过潜在类C处理的。第二个公式是非对称公式。在这个公式中,对于每一个D,先根据D的条件概率计算C,然后根据C的条件概率计算W。事实上,这个公式可以扩展成计算任何一对离散变量的共现。因为我们的W和D是已知的,但是Z是未知的,所以我们的重心放在求Z上。那么如何求Z呢?
最大似然估计:
概率学中有很多隐含的量是未知的,我们处理的办法有很多种,可以根据经典统计学,也有很多现在统计学的分支,比较著名的是贝叶斯统计学。
在PLSA中,我们使用最大似然估计来训练隐含量。最大似然估计中比较常用的算法就是期望最大化算法。期望最大化算法分为两步:
-
Expectation Step——隐含参数的估计
-
Maximization Step——确定实际参数,然后根据实际参数做最大似然估计。
关于过拟合的问题,过拟合的概念已经提到了,在PLSA中,我们通过修改EM(期望最大化)的算法来避免这个问题,我么把这个算法称为强化的期望最大化算法(tempered EM)。
强化的期望最大化算法中引入了控制参数beta。
Beta值起始是1,紧着逐渐减少。引入beta的目的就是为了避免过拟合的问题,在beta中,过拟合和不充分拟合的状态被定义。具体的算法是:
让beta的初始值为1,然后根据待训练数据来测试模型,如果成功,则使用该beta,如果不成功,则收敛。收敛的意思就是使得beta = n*beta, n<1。
共轭先验分布
1 概念
简单来说,如果先验分布 p(θ) 和似然函数 p(X|θ) 可以使得先验 p(θ) 和后验分布 p(θ|X) 有相同的形式,那么就称先验分布与似然函数是共轭分布。
共轭的意义在于是共轭特性可以使得先验分布和后验分布的形式相同,这样一方面合符人的直观(它们应该是相同形式的)另外一方面是可以形成一个先验链,即现在的后验分布可以作为下一次计算的先验分布,如果形式相同,就可以形成一个链条,后验又可以作为下一次的先验分布。
隐含狄利克雷分布、LDA(Latent Dirichlet Allocation)
1、概念
a、是一种无监督的贝叶斯模型
b、是一种主题模型,它可以将文档集中每篇文档的主题按照概率分布的形式给出
c、同时它是一种无监督学习算法,在训练时不需要手工标注的训练集,需要的仅仅是档集以及指定主题的数量量k即可。
d、是一种典型的词袋模型,即它认为一篇文档是由一组词构成的一个集合,词与词之间没有顺序以及先后的关系。
即:①可以把文档集中的每一篇文档是什么主题以概率分布的形式给出来,形式如下图:
1
这样的一个作用就是只要有一篇文章,就可以知道这一篇文章被分为每一类主题的概率,如果这个数据量比较大的情况下,基本可以判断出这篇文章是什么主题。
②对于①判断文章主题的准确性,是可以通过文章训练后提高的,而用于训练的文章,也不需要提前标注文章的一些属性。
③这个模型处理的方式是把文章通过分词形成一个个词,且不考虑词与词之间顺序,就像是一个装满词语的口袋一样,称为词袋模型。
2、原理
根据上述基本可以理解为:给你一篇文章,你就能够判断这篇文章是什么主题的,好牛逼的样子,但是是怎么做到的呢?这里又的搬出伟大的贝叶斯公司:
我们不讨论计算的步骤,反正已经经过无数大神门验证过了,我们就直接相信这个是正确的就行了,一步一步计算后得到下面公式:
P(θ | y) = P(θ | x) * P(x | y)
然后把字母换成我们的汉字,就变成了下面的公式:
P(单词 | 文档) = P(单词 | 主题) * P(主题 | 文档)
仔细一看,我们要求的不就是P(主题 | 文档)这个吗?而对于给定的一篇文章,P(单词 | 文档)是很容易统计出来的,所以我们只要有P(单词 | 主题)这样一个东西问题不就解决了吗?所以我们训练生产LDA的目的,就是要拿到P(单词 | 主题)这样一个分布。
由此引出的LDA的生成过程如下:
one、对于语料库中每一篇文档,从主题分布中选出一个主题
two、从该主题的单词分布中抽出一个单词
three、重复上述的过程,知道遍历文章的每一个单词理解:如上图,使用公式P(单词 | 文档) = P(单词 | 主题) * P(主题 | 文档),通过左图,也就是P(主题 | 文档)的值,和直接统计的P(单词 | 文档)的值,不断的去修正P(词|主题)的分布。当训练达到一定的程度之后,可以直接把右图也就是P(词|主题)的分布是正确的。这样就可以在使用LDA时,通过主题和词的分布,结合P(单词 | 文档) = P(单词 | 主题) * P(主题 | 文档)公式,对于一篇新的文章,可以拿到P(主题|文档)的值,也就是该文档的主题分布。
3、总结
所谓的LDA模型,实际上就是基于许多理论基础,通过大量的文档,总结出主题的单词分布,使用的时候,又根据此模型,反算出该文档的主题分布,从而判断该文档主题。
4、应用场景
通常LDA用户进主题模型挖掘,当然也可用于降维。
推荐系统:应用LDA挖掘物品主题,计算主题相似度
情感分析:学习出用户讨论、用户评论中的内容主题
5、主要优点有:
1)在降维过程中可以使用类别的先验知识经验,而像PCA这样的无监督学习则无法使用类别先验知识。
2)LDA在样本分类信息依赖均值而不是方差的时候,比PCA之类的算法较优。
6、主要缺点有:
1)LDA不适合对非高斯分布样本进行降维,PCA也有这个问题。
2)LDA降维最多降到类别数k-1的维数,如果我们降维的维度大于k-1,则不能使用LDA。当然目前有一些LDA的进化版算法可以绕过这个问题。
3)LDA在样本分类信息依赖方差而不是均值的时候,降维效果不好。
4)LDA可能过度拟合数据。
string_1 = '沙瑞金 赞叹 易学习 的 胸怀 , 是 金山 的 百姓 有福 , 可是 这件 事对 李达康 的 触动 很大 。 易学习 又 回忆起 他们 三人 分开 的 前一晚 , 大家 一起 喝酒 话别 , 易学习 被 降职 到 道口 县当 县长 , 王大路 下海经商 , 李达康 连连 赔礼道歉 , 觉得 对不起 大家 , 他 最 对不起 的 是 王大路 , 就 和 易学习 一起 给 王大路 凑 了 5 万块 钱 , 王大路 自己 东挪西撮 了 5 万块 , 开始 下海经商 。 没想到 后来 王大路 竟然 做 得 风生水 起 。 沙瑞金 觉得 他们 三人 , 在 困难 时期 还 能 以沫 相助 , 很 不 容易 。'
string_2 = '沙瑞金 向 毛娅 打听 他们 家 在 京州 的 别墅 , 毛娅 笑 着 说 , 王大路 事业有成 之后 , 要 给 欧阳 菁 和 她 公司 的 股权 , 她们 没有 要 , 王大路 就 在 京州 帝豪园 买 了 三套 别墅 , 可是 李达康 和 易学习 都 不要 , 这些 房子 都 在 王大路 的 名下 , 欧阳 菁 好像 去 住 过 , 毛娅 不想 去 , 她 觉得 房子 太大 很 浪费 , 自己 家住 得 就 很 踏实 。'
string_3 = '347 年 ( 永和 三年 ) 三月 , 桓温 兵至 彭模 ( 今 四川 彭山 东南 ) , 留下 参军 周楚 、 孙盛 看守 辎重 , 自己 亲率 步兵 直攻 成都 。 同月 , 成汉 将领 李福 袭击 彭模 , 结果 被 孙盛 等 人 击退 ; 而 桓温 三 战三胜 , 一直 逼近 成都 。'
stpwrdpath = "stop.txt"
stpwrd_dic = open(stpwrdpath, 'rb')
stpwrd_content = stpwrd_dic.read()
#将停用词表转换为list
stpwrdlst = stpwrd_content.splitlines()
stpwrd_dic.close()
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
corpus = [string_1,string_2,string_3]
cntVector = CountVectorizer(stop_words=stpwrdlst)
cntTf = cntVector.fit_transform(corpus)
# print(cntTf)
lda = LatentDirichletAllocation(n_topics=2,
learning_offset=50.,
random_state=0)
docres = lda.fit_transform(cntTf)
print(docres)
print(lda.components_)