PLSA (概率潜语义分析) 是基于 双模式 共现 的数据分析方法延伸的经典的统计学方法。概率潜语义分析 应用于信息检索,过滤,自然语言处理,文本的机器学习或者其他相关领域。概率潜语义分析 与 标准潜语义分析 的不同是,标准潜在语义分析是以 共现表(就是共现的矩阵)的奇异值分解的形式表现的,而概率潜在语义分析却是基于派生自 LCM 的混合矩阵分解。考虑到word和doc共现形式,概率潜语义分析 基于 多项式分布 和 条件分布 的混合来建模共现的概率。所谓 共现 其实就是 W和D 的一个矩阵,所谓 双模式 就是在 W和D 上同时进行考虑。

PLSA的缺点:

PLSA有时会出现过拟合的现象。所谓过拟合(Overfit),是这样一种现象:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集上却不能很好的拟合数据。此时我们就叫这个假设出现了overfit的现象。出现这种现象的主要原因是训练数据中存在噪音或者训练数据太少。

解决办法,要避免过拟合的问题,PLSA使用了一种广泛应用的最大似然估计的方法,期望最大化。PLSA中训练参数的值会随着文档的数目线性递增。PLSA可以生成其所在数据集的的文档的模型,但却不能生成新文档的模型。

 关于SVD:

LSA的基本思想就是把高维的文档降到低维空间,那个空间被称为潜在语义空间。这个映射必须是严格线性的而且是基于共现表(就是那个矩阵啦)的奇异值分解。

PLSA是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(n*m) = U(n*n) E(n*m) VT(m*m)

保留奇异值矩阵E的K个特征值(奇异值是特征值的非负平方根)。然后求矩阵A的共轭转置AH,然后奇异值分解AH

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)

 

注:这里的C和上面说的Z是一样的。

公式解析:第一个公式是对称公式,在这个公式中,W和D都是以相同的方式(都用了W和D基于C的条件概率)通过潜在类C处理的。第二个公式是非对称公式。在这个公式中,对于每一个D,先根据D的条件概率计算C,然后根据C的条件概率计算W。事实上,这个公式可以扩展成计算任何一对离散变量的共现。因为我们的W和D是已知的,但是Z是未知的,所以我们的重心放在求Z上。那么如何求Z呢?

 

最大似然估计:

概率学中有很多隐含的量是未知的,我们处理的办法有很多种,可以根据经典统计学,也有很多现在统计学的分支,比较著名的是贝叶斯统计学。

在PLSA中,我们使用最大似然估计来训练隐含量。最大似然估计中比较常用的算法就是期望最大化算法。期望最大化算法分为两步:

1. Expectation Step——隐含参数的估计

2. Maximization Step——确定实际参数,然后根据实际参数做最大似然估计。

关于过拟合的问题,过拟合的概念已经提到了,在PLSA中,我们通过修改EM(期望最大化)的算法来避免这个问题,我么把这个算法称为强化的期望最大化算法(tempered EM)。

强化的期望最大化算法中引入了控制参数beta。

 

Beta值起始是1,紧着逐渐减少。引入beta的目的就是为了避免过拟合的问题,在beta中,过拟合和不充分拟合的状态被定义。具体的算法是:

让beta的初始值为1,然后根据待训练数据来测试模型,如果成功,则使用该beta,如果不成功,则收敛。收敛的意思就是使得beta = n*beta, n<1。