Probabilistic Principal Component Analysis

Tipping M E, Bishop C M. Probabilistic Principal Component Analysis[J]. Journal of The Royal Statistical Society Series B-statistical Methodology, 1999, 61(3): 611-622.

PPCA 通过高斯过程给出了普通PCA一个概率解释,这是很有意义的。论文还利用PPCA进行缺失数据等方面的处理(不过这方面主要归功于高斯过程吧)。

t=Wx+μ+ϵ

其中tRd为观测变量,也就是样本,而xRq是隐变量,WRd×qx,t二者联系起来。另外,ϵ是噪声。

S=1Nn=1N(tnμ)(tnμ)T是样本协方差矩阵,其中μ是样本均值。论文的主要工作,就是将S的列空间和W联系起来。

主要内容

假设ϵN(0,σ2I),xN(0,I),二者独立。那么,容易知道tx已知的情况下的条件概率为:

t|xN(Wx+μ,σ2I)

然后论文指出,通过其可求得t的边际分布:

tN(μ,C)

其中C=WWT+σ2I。这个证明,在贝叶斯优化中有提过,不过我发现,因为t=Wx+μ+ϵ,是服从正态分布随机变量的线性组合,所以t也服从正态分布,所以通过E(t)E((tE(t))(tE(t))T)也可以得到t的分布。

其似然函数L为:
在这里插入图片描述
Wσ视为参数,我们可以得到其极大似然估计:
在这里插入图片描述
其中Uq的列是S的主特征向量,而Λq的对角线元素为特征向量对应的特征值λ1,,λq(为所有特征值的前q个,否则W将成为鞍点),RRq×q是一个旋转矩阵。注意到,WML的列向量并不一定正交。
在这里插入图片描述
这部分的推导见附录。

同样的,我们可以推导出,xt已知的情况下的条件分布:

x|tN(M1WT(tμ),σ2M1

其中M=WTW+σ2I
这个推导需要利用贝叶斯公式:

p(x|t)=p(t|x)p(t)p(t)

为什么要提及这个东西,因为可以引出一个很有趣的性质,注意到x|t的均值为:

M1WT(tu)

W=WML,且假设σ20,那么均值就成为:

(WMLTWML)1WMLT(tu)

实际上就是(tu)在主成分载荷向量上的正交投影,当然这里不要计较WMLTWML是否可逆。这就又将PPCA与普通的PCA联系在了一起。

EM算法求解

论文给出了W的显式解(虽然有点地方不是很明白),也给出了如何利用EM算法来求解。

构造似然估计:
在这里插入图片描述
xn求条件期望(条件概率为p(xn|tn,W,σ2)):
在这里插入图片描述
在这里插入图片描述

M步是对上述W,σ求极大值,注意<>里面的M,σ是已知的(实际上,用M,σ来表述更加合适):
在这里插入图片描述
有更加简练的表述形式:
在这里插入图片描述
符号虽然多,但是推导并不麻烦,自己推导的时候并没有花多大工夫。

附录

极大似然估计

已知对数似然函数为:
在这里插入图片描述
先考察对W的微分:

dL=N2{d|C||C|+dtr(C1S)}

d|C||C|=tr(C1dC)=tr[C1(dWWT+WdWT)]=2tr[WTC1dW]

dtr(C1S)=tr(dC1S)=tr(C1[dC]C1S)=tr(C1SC1dC)=2tr(WTC1SC1dW)

所以,要想取得极值,需满足:

C1W=C1SC1WSC1W=W

论文说这个方程有三种解:

  1. W=0,0解,此时对数似然函数取得最小值(虽然我没看出来)。
  2. C=S:

WWT+σ2I=SWWT=Sσ2

其解为:

W=US(ΛSσ2I)1/2R

其中S=USΛUST

  1. 第三种,也是最有趣的解,SC1W=W但是W0,CS。假设W=ULVT,其中URd×q, LRq×q为对角矩阵,VRq×q。通过一系列的变换(我没有把握能完成这部分证明,感觉好像是对的),可以得到:

SUL=U(σ2L+L2)L

于是Suj=(σ2I+lj2)uj,其中ujU的第j列,ljL的第j个对角线元素。因此,uj就成了S的对应特征值λj=σ2+lj2的特征向量(注意到这个特征值是必须大于等于σ2)。于是,有:

W=Uq(Kqσ2I)1/2R

其中:

kj={λjujσ2

实际上就是kj=λj

注意,上面的分析只能说明其为驻定解,事实上Uq只说明了其为S的特征向量,而没有限定是哪些特征向量。

将解W=Uq(Kqσ2I)1/2R代入对数似然函数可得(C=WWT+σ2I):
在这里插入图片描述
其中q是非零l1,,lq的个数。
上面的是蛮好证明的,注意{}中第2项和第4项和为ln|C|,第3,5项构成tr(C1S)
σ求极值,可得:
在这里插入图片描述
且是极大值,因为显然σ0会导致L。代入原式可得:
在这里插入图片描述
最大化上式等价于最小化下式:
在这里插入图片描述

注意到,上式只与被舍弃的lj=0λj有关,又λiσ2,i=1,,q,再结合(18),可以知道最小的特征值一定是被舍弃的。但是论文说,应当是最小的dq个特征值作为被舍弃的(因为这些特征值必须在一块?)。
在这里插入图片描述
仔细想来,似然函数可以写成:

L=N2{dln(2π)+j=1qln(λj)+1σ2j=q+1dλj+(dq)ln(σ2)+q}

好吧,还是不知道该如何证明。

代码

"""
瞎写的,测试结果很诡异啊
"""
import numpy as np

class PPCA:

    def __init__(self, data, q):
        self.__data = np.array(data, dtype=float)
        self.__n, self.__p = data.shape
        self.__mean = np.mean(self.data, 0)
        self.q = q
        assert q < self.__p, "Invalid q"
    @property
    def data(self):
        return self.__data

    @property
    def n(self):
        return self.__n

    @property
    def p(self):
        return self.__p

    def explicit(self):
        data = self.data - self.__mean
        S = data.T @ data / self.n
        value, vector = np.linalg.eig(S)
        U = vector[:, :self.q]
        sigma = np.mean(value[self.q:])
        newvalue = value[:self.q] - sigma

        return U * newvalue

    def EM(self):
        data = self.data - self.__mean
        S = data.T @ data / self.n
        W_old = np.random.randn(self.p, self.q)
        sigma = np.random.randn()
        count = 0
        while True:
            count += 1
            M = W_old.T @ W_old + sigma
            M_inv = np.linalg.inv(M)
            W_new = S @ W_old @ np.linalg.inv(sigma + M_inv @ W_old.T @ S @ W_old)
            sigma_new = np.trace(S - S @ W_old @ M_inv @ W_new.T) / self.p

            if np.sum(np.abs(W_new - W_old)) / np.sum(np.abs(W_old)) < 1e-13 and \
                np.abs(sigma_new - sigma) < 1e-13:
                return W_new
            else:
                W_old = W_new
                sigma = sigma_new


posted @   馒头and花卷  阅读(1388)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示