(九) 概率PCA推导&&核概率PCA

作者: Pan_Ziheng | 来源:发表于2020-08-05 16:54 被阅读0次

    1.概率PCA建模

    概率PCA(Probability Principle Component Analysis)是从概率的角度理解主元分析这个事情。
    X\in R^{p};Latent\space Variable:Z\in R^{q}\\ X_{[p\times 1]}=W_{[p\times q]}Z_{[q\times 1]}+\mu_{[p\times 1]}+\sigma \epsilon_{[p\times 1]} \\ \epsilon \tilde{}N(0,I_{p});Z\tilde{}N(0,I_{q});
     看到这里,我们会发现这个像是一个因子分析的模型,什么是因子分析,实际上就是一种数据简化技术,用较少的特征来反映原数据的基本结构。而这个较少的数据特征就是我们的隐变量Z,而原数据就是我们的XZ\epsilon相互独立,且都服从于高斯分布。而W被称作因子载荷。这个模型意在用隐变量的特征来解释原数据的主要特征。
     但是这个和我们的降维有什么关系呢,我们如何通过这样一个模型来降维呢?换句话说我们的降维过程具体化到我们的目的是求什么?
     实际上,我们试图算一个后验E(Z|X-\mu),也就是得到一个条件分布,取到它的均值。要求后验,首先我们想到的是贝叶斯公式
    P(Z|X-\mu)=\frac{P(X-\mu|Z)\cdot P(Z)}{P(X-\mu)}
     由我们先前在(二)多元高斯分布与概率图条件独立性假设中提到的定理一可知X-\mu|Z仍然服从高斯分布:
    因为:
    E(X-\mu|(Z,\sigma))=E(WZ+\sigma\epsilon|(Z,\sigma))=E(WZ)=WZ;
    D(X-\mu|(Z,\sigma))=D(WZ+\sigma\epsilon|(Z,\sigma))=D(\sigma\epsilon)=\sigma^{2}D(\epsilon)=\sigma^{2}I_{p}
    因此:
    X-\mu|(Z,\sigma)\tilde{}N(WZ,\sigma^{2}I_{p})
    Z\tilde{}N(0,I_{q})的分布是我们的已知条件,那么剩下的是P(X-\mu)
    X-\mu={ \left[ \begin{array}{*{20}{l}} {W}&{ \sigma I\mathop{{}}\nolimits_{{p}}} \end{array} \left] { \left[ \begin{array}{*{20}{l}} {Z}&{ \varepsilon } \end{array} \right] }\mathop{{}}\nolimits^{{T}}\right. \right. }
    因为:{ \left[ \begin{array}{*{20}{l}} {Z}&{ \varepsilon } \end{array} \right] }\mathop{{}}\nolimits^{{T}}\tilde{}N(0,I_{p+q})
    所以:
    D(X-\mu)={{ \left[ \begin{array}{*{20}{l}} {W}&{ \sigma I\mathop{{}}\nolimits_{{p}}} \end{array} \left] \left[ \begin{array}{*{20}{l}} {I\mathop{{}}\nolimits_{{q}}}&{0}\\ {0}&{I\mathop{{}}\nolimits_{{p}}} \end{array} \right] \right. \right. } \left[ \begin{array}{*{20}{l}} {W}\\ { \sigma I\mathop{{}}\nolimits_{{p}}} \end{array} \right] }
    (X-\mu)\tilde{}N(0,WW^{T}+\sigma^{2}I_{p})
    我们令C=WW^{T}+\sigma^{2}I_{p}
     现在我们已经凑齐我们可以求解参数的要素了,我们需要显式的表达出这个后验概率Z|X-\mu,由于都服从于高斯分布,我们可以丢掉高斯分布前面的常数项:
    P(Z|X-\mu)\propto P(X-\mu|Z)\cdot P(Z)

    P(Z|X-\mu)\propto e^{-\frac{1}{2\sigma^{2}}(X-\mu-WZ)^{T}(X-\mu-WZ)}\cdot e^{-\frac{1}{2}(Z^{T}Z)}
     因为我们关心的X-\mu已知的情况下Z的概率分布,所有与Z无关的项都视为常数,
    e^{-\frac{1}{2\sigma^{2}}(X-\mu-WZ)^{T}(X-\mu-WZ)}\cdot e^{-\frac{1}{2}(Z^{T}Z)}=e^{-\frac{1}{2\sigma^{2}}(X-\mu)^{T}(X-\mu)}\cdot e^{-\frac{1}{2\sigma^{2}}(Z^{T}W^{T}WZ-2(X-\mu)^{T}WZ+\sigma^{2}Z^{T}Z)}\\ =e^{-\frac{1}{2\sigma^{2}}(X-\mu)^{T}(X-\mu)}\cdot e^{-\frac{1}{2\sigma^{2}}(Z^{T}(W^{T}W+\sigma^{2}I_{q})Z-2Z^{T}W^{T}(X-\mu))}\\ =e^{-\frac{1}{2\sigma^{2}}(X-\mu)^{T}(X-\mu)}\cdot e^{-\frac{1}{2\sigma^{2}}(Z^{T}(W^{T}W+\sigma^{2}I_{q})Z-2Z^{T}W^{T}(X-\mu)+(X-\mu)^{T}W(W^{T}W+\sigma^{2}I_{q})^{-1}W^{T}(X-\mu))-(X-\mu)^{T}W(W^{T}W+\sigma^{2}I_{q})^{-1}W^{T}(X-\mu))}\\ =e^{-\frac{1}{2\sigma^{2}}(X-\mu)^{T}(X-\mu)}\cdot e^{-\frac{1}{2\sigma^{2}} (X-\mu)^{T}W(W^{T}W+\sigma^{2}I_{q})^{-1}W^{T}(X-\mu)}\cdot e^{-\frac{1}{2\sigma^{2}}[(Z-(W^{T}W+\sigma^{2}I_{q})^{-1}W^{T}(X-\mu))^{T}(W^{T}W+\sigma^{2}I_{q})(Z-(W^{T}W+\sigma^{2}I_{q})^{-1}W^{T}(X-\mu)) ]}\\
     所以经过上面的凑项配方可以看出:
    P(Z|X-\mu)\propto e^{-\frac{1}{2\sigma^{2}}[(Z-(W^{T}W+\sigma^{2}I_{q})^{-1}W^{T}(X-\mu))^{T}(W^{T}W+\sigma^{2}I_{q})(Z-(W^{T}W+\sigma^{2}I_{q})^{-1}W^{T}(X-\mu)) ]}
     因此:(Z|X-\mu) \tilde{}N((W^{T}W+\sigma^{2}I_{q})^{-1}W^{T}(X-\mu),\sigma^{2}(W^{T}W+\sigma^{2}I_{q})^{-1})

     从这个高斯分布可以得出我们想要的最后结果:E(Z|X-\mu)=(W^{T}W+\sigma^{2}I_{q})^{-1}W^{T}(X-\mu)
     在这个式子里,哪些是我们知道的参数呢?数据X是我们唯一知道的,W,\mu,\sigma^{2}都是我们需要估计的参数。接下来我们将用极大似然估计来讲这几个未知参数给估计出来。

    2.极大似然估计求解

     我们想要用极大似然估计的话,我们就必须知道我们样本数据的概率分布,即 X-\mu的分布,我们在上面求过这个分布:
    (X-\mu)\tilde{}N(0,WW^{T}+\sigma^{2}I_{p})
     我们令C=WW^{T}+\sigma^{2}I_{p}
     似然函数为:
    L(\mu;W;\sigma^{2}|X-\mu)=\prod_{i=1}^{n}\frac{1}{|C|^{\frac{1}{2}}}\cdot e^{-\frac{1}{2}(X-\mu)^{T}C^{-1}(X-\mu)}
     为了求导方便,我们对似然函数取对数:
    F=ln(L)=\sum_{i=1}^{n}(-\frac{1}{2}ln(|C|){-\frac{1}{2}(X_{i}-\mu)^{T}C^{-1}(X_{i}-\mu)})
     我们先估计\mu;
    \frac{dF}{d\mu}=\sum_{i=1}^{n}C^{-1}(X_{i}-\mu)=0

    n\mu=\sum_{i=1}^{n}X_{i}

    \mu=\frac{1}{n}\sum_{i=1}^{n}X_{i}
    将这个结果带入对数似然函数F中:
    F=ln(L)=\sum_{i=1}^{n}(-\frac{1}{2}ln(|C|){-\frac{1}{2}(X_{i}-\frac{1}{n}\sum_{i=1}^{n}X_{i})^{T}C^{-1}(X_{i}-\frac{1}{n}\sum_{i=1}^{n}X_{i})})\\ =-\frac{n}{2}ln(|C|)-\frac{1}{2}tr((X_{i}-\frac{1}{n}\sum_{i=1}^{n}X_{i})^{T}C^{-1}(X_{i}-\frac{1}{n}\sum_{i=1}^{n}X_{i}))\\ =-\frac{n}{2}ln(|C|)-\frac{1}{2}tr(C^{-1}(X_{i}-\frac{1}{n}\sum_{i=1}^{n}X_{i})(X_{i}-\frac{1}{n}\sum_{i=1}^{n}X_{i})^{T})\\
     由于后面一项是一个数,我们直接对数引入迹,对于迹来说tr(ABC)=tr(BCA)=tr(CAB)

     这样操作之后,我们惊讶的发现
    (X_{i}-\frac{1}{n}\sum_{i=1}^{n}X_{i})(X_{i}-\frac{1}{n}\sum_{i=1}^{n}X_{i})^{T}=S
     我们得出的其中一项是协方差矩阵,所以可以得出我们的似然函数是:

    F=ln(L)=-\frac{n}{2}ln(|C|)-\frac{1}{2}tr(C^{-1}(X_{i}-\frac{1}{n}\sum_{i=1}^{n}X_{i})(X_{i}-\frac{1}{n}\sum_{i=1}^{n}X_{i})^{T})\\ =-\frac{n}{2}ln(|C|)-\frac{1}{2}tr(C^{-1}S)\\

     在对W,\sigma^{2}进行参数估计之前,我们可以先对C求导,因为C里同时包含了两个参数,通过对C和两个参数之间的关系,能直接得出两个参数的统计估计量:
     似然函数中涉及C的行列式,我们知道对行列式求导的公式为:
    d|C|=tr(|C|C^{-1}dC))

    \frac{d|C|}{dC}=|C|C^{-1}

    d(ln|C|)=\frac{d(ln|C|)}{d(|C|)}\cdot \frac{d(|C|)}{dC}\\ =\frac{1}{|C|}\cdot |C|C^{-1}=C^{-1}
     所以对于原似然函数求导:
    dF_{(C)}=-\frac{n}{2}tr(C^{-1}(dC))-\frac{n}{2}tr((dC^{-1})S)
     我们的dC^{-1}可以通过下式得来:
     因为:C^{-1}C=I所以:(dC^{-1})C+C^{-1}(dC)=0
    dC^{-1}=-C^{-1}(dC)C^{-1}

     代入原式中有:

    dF_{(C)}=-\frac{n}{2}tr(C^{-1}(dC))-\frac{n}{2}tr(-C^{-1}(dC)C^{-1}S)\\ =-\frac{n}{2}(tr(C^{-1}dC)-tr(C^{-1}SC^{-1}dC))

     首先我们对W进行参数估计:
     因为:
    C=WW^{T}+\sigma^{2}I_{p}
     所以:
    dC=(dW)\cdot W^{T}+W\cdot d(W^{T})
     代入似然函数原式中:
    dF_{(W)}=-\frac{n}{2}(tr(C^{-1}dC)-tr(C^{-1}SC^{-1}dC))\\= -\frac{n}{2}(tr(C^{-1}(dW)\cdot W^{T}+C^{-1}W\cdot d(W^{T}))-tr(C^{-1}SC^{-1}(dW)\cdot W^{T}+C^{-1}SC^{-1}W\cdot d(W^{T})))\\ =-ntr(C^{-1}W\cdot d(W^{T})-C^{-1}SC^{-1}W\cdot d(W^{T}))\\ =-ntr([C^{-1}W-C^{-1}SC^{-1}W]d(W^{T}))\\ =-n(C^{-1}W-C^{-1}SC^{-1}W)=0
     得出:
    SC^{-1}W=W
     即:
    S(WW^{T}+\sigma^{2}I_{p})^{-1}W=W
    在进行下一步计算前,我们将给出下面等式并予以证明:

    (WW^{T}+\sigma^{2}I_{p})^{-1}W=W(W^{T}W+\sigma^{2}I_{q})^{-1}

    证明:
    要证:
    (WW^{T}+\sigma^{2}I_{p})^{-1}W=W(W^{T}W+\sigma^{2}I_{q})^{-1}
    即证:
    W(W^{T}W+\sigma^{2}I_{q})=(WW^{T}+\sigma^{2}I_{p})W
    即证明:
    WW^{T}W+\sigma^{2}W=WW^{T}W+\sigma^{2}W
    上式恒成立,原式成立,证毕。
    根据该等式,有:
    W=S(WW^{T}+\sigma^{2}I_{p})^{-1}W=SW(W^{T}W+\sigma^{2}I_{q})^{-1}
     由于W^{T}Wq\times q的实对称矩阵,所以对其进行特征分解:
    W^{T}W=V\Lambda V^{T}
    代入:
    W=SW(V\Lambda V+\sigma^{2}I_{q})^{-1}

    WV(\Lambda+\sigma^{2}I_{q})V^{T}=SW

    [WV](\Lambda+\sigma^{2}I_{q})=S[WV]
     这里我们可以看出WV还不是单位化的特征向量,因为:
    V^{T}W^{T}WV=V^{T}V\Lambda V^{T}V=\Lambda \not= I
     因此我们在两边都乘\Lambda^{-\frac{1}{2}}得:
    [WV\Lambda^{-\frac{1}{2}}](\Lambda+\sigma^{2}I_{q})=S[WV\Lambda^{-\frac{1}{2}}]
     从上式中,我们得出WV\Lambda^{-\frac{1}{2}}是样本协方差矩阵S的特征向量,而\Lambda+\sigma^{2}I_{q}是它的特征值构成的对角矩阵。
     由于样本协方差矩阵S也是一个实对称的半正定矩阵,我们也可以对其进行特征分解:
    S=\Phi \Gamma_{p} \Phi^{T}
     解得
    \Phi_{q}=WV\Lambda^{-\frac{1}{2}};\\\Gamma_{q}=\Lambda+\sigma^{2}I_{q};
     所以:
    \Lambda=\Gamma_{q}-\sigma^{2}I_{q}
    \Phi_{q}=WV(\Gamma_{q}-\sigma^{2}I_{q})^{-\frac{1}{2}}
     到这里我们得到W的参数估计:

    W=\Phi(\Gamma-\sigma^{2}I_{q})^{\frac{1}{2}}V^{T}

     但是这个式子里仍有未知参数\sigma^{2},现估计\sigma^{2}:
    dC=(d\sigma)I
     代入对C求导的似然函数中:
    dF_{(\sigma^{2})}=-\frac{n}{2}(tr(C^{-1}(d\sigma))-tr(C^{-1}SC^{-1}(d\sigma)))\\ =-\frac{n}{2}(d\sigma)(tr(C^{-1})-tr(C^{-1}SC^{-1}))
     所以:\frac{dF}{d(\sigma^{2})}=tr(C^{-1}-C^{-1}SC^{-1})=0
     根据Sherman-Morrison-Woodburg等式(这个博客开头有个地方UV符号反了)

    (A+UKV)^{-1}=A^{-1}-A^{-1}U(K^{-1}-VA^{-1}U)^{-1}VA^{-1};\\其中,A,K均为非奇异矩阵

     利用上述不等式,我们继续计算:
    C^{-1}=(WW^{T}+\sigma^{2} I)^{-1}\\=(\sigma^{2})^{-1}I_{p}^{-1}-(\sigma^{2})^{-1}I_{p}^{-1}W(I_{q}^{-1}+W^{T}(\sigma^{2})^{-1}I_{p}^{-1}W)^{-1}W^{T}(\sigma^{2})^{-1}I_{p}^{-1}\\ =(\sigma^{2})^{-1}(I_{p}-(W(\sigma^{2} I_{q}+W^{T}W)^{-1}W^{T})\\ =(\sigma^{2})^{-1}(I_{p}-(( \sigma^{2}I_{p}+WW^{T})^{-1}WW^{T})\\
     由于CS都是实对称矩阵:
    SC^{-1}=(C^{-1}S)^{T}=(\sigma^{2})^{-1}S-(\sigma^{2})^{-1}S( I_{p}+WW^{T})^{-1}WW^{T}=(\sigma^{2})^{-1}S-(\sigma^{2})^{-1}SC^{-1}WW^{T}
     由于上面我们已经得到:SC^{-1}W=W所以:SC^{-1}=(\sigma^{2})^{-1}S-(\sigma^{2})^{-1}WW^{T}
     将这个结论代入C^{-1}-C^{-1}SC^{-1}
    C^{-1}-C^{-1}SC^{-1}=C^{-1}(I_{p}-SC^{-1})\\=C^{-1}(I_{p}-(\sigma^{2})^{-1}S+(\sigma^{2})^{-1}WW^{T})\\=(\sigma^{2})^{-1}C^{-1}(\sigma^{2}I_{p}-S+WW^{T})\\=(\sigma^{2})^{-1}C^{-1}(C-S)\\=(\sigma^{2})^{-1}I_{p}-(\sigma^{2})^{-1}C^{-1}S
     所以:
    tr(C^{-1}-C^{-1}SC^{-1})\\=tr((\sigma^{2})^{-1}I_{p}-(\sigma^{2})^{-1}C^{-1}S)\\=(\sigma^{2})^{-1}tr(I_{p}-(\sigma^{2})^{-1}S+(\sigma^{2})^{-1}WW^{T})\\=(\sigma^{2})^{-2}[tr(V\Lambda V^{T})-tr(\Phi \Gamma_{p} \Phi^{T} )+\sigma^{2}tr(I_{p})]\\=(\sigma^{2})^{-2}[tr(\Lambda V^{T}V)-tr( \Gamma_{p} \Phi^{T}\Phi )+\sigma^{2}tr(I_{p})] \\=(\sigma^{2})^{-2}[tr(\Lambda)-tr(\Gamma_{p} )+\sigma^{2}tr(I_{p})]
     因为\Lambda_{q}=\Gamma_{q}-\sigma^{2}I_{q}:
     因为tr(C^{-1}-C^{-1}SC^{-1})=(\sigma^{2})^{-2}[tr(\Gamma_{q}-\sigma^{2}I_{q})-tr(\Gamma_{p} )+\sigma^{2}tr(I_{p})]=0:
     即:
    \sigma^{2}[tr(I_{p})-tr(I_{q})]=tr(\Gamma_{p})-tr(\Gamma_{q})

    \sigma^{2}=\frac{1}{p-q}\sum_{i=p-q+1}^{p}(\lambda_{i})

     至此,\sigma^{2}也估计出来了,那么估计的W:

    W=\Phi(\Gamma_{q}-(\frac{1}{p-q}\sum_{i=p-q+1}^{p}\lambda_{i})I_{q})^{\frac{1}{2}}V^{T}

    有了这些:

    E(Z|X-\mu)=(W^{T}W+\sigma^{2}I_{q})^{-1}W^{T}(X-\mu)

    剩下就是代入的问题了。
    展示代码如下:

    3.代码

    # #            ** Statistical Learning **
    # #            File Name:     Probability Principle Component Analysis
    # #            Author:        Pan
    # #            Description:   a kind of dimension reduction based on Factor Analysis.
    # #            Date:          2020/8/3
    # #            **      --Start--      **
    import numpy as np
    class PPCA:
        def __init__(self,X,q):
            self.X=X
            self.mu=np.array([np.average(self.X,axis=0)]).T
            self.n=np.shape(self.X)[0]
            self.p=np.shape(self.X)[1]
            self.q=q
            self.H=np.identity(self.n)-(1/self.n)*np.ones([self.n,1]).dot(np.ones([self.n,1]).T)
            self.S=self.X.T.dot(self.H).dot(self.X)
        def dimensionality_reduction(self):
            self.eigenvalues,self.eigenvectors=np.linalg.eig(self.S)
            self.ranking=np.argsort(self.eigenvalues)
            self.eigenvalues_q=self.eigenvalues[np.where(self.ranking<self.q)]
            self.eigenvectors_q=self.eigenvectors[np.where(self.ranking<self.q)]
            self.Gamma=np.diag(self.eigenvalues)
            self.Gamma_q=np.diag(self.eigenvalues_q)
            self.sigma_square=(1/(self.p-self.q))*(np.sum(self.eigenvectors)-np.sum(self.eigenvectors_q))
            self.Lambda=self.Gamma_q-self.sigma_square*np.identity(self.q)
            self.W=self.eigenvectors_q.T.dot(self.Lambda**(1/2))
            self.Z=np.linalg.inv(self.W.T.dot(self.W)+self.sigma_square*np.identity(self.q)).dot(self.W.T).dot(self.X.T-self.mu)
            return self.Z.T
    if __name__ == '__main__':
        import seaborn as sns
        import matplotlib.pyplot as plt
        from sklearn.datasets import load_diabetes
        def plot(dfData):
            plt.subplots(figsize=(9, 9))
            sns.heatmap(dfData, annot=True, vmax=1, square=True, cmap="Blues")
            plt.show()
        data=load_diabetes()
        X=data["data"]
        PPCA_Algorithm=PPCA(X,4)
        Z=PPCA_Algorithm.dimensionality_reduction()
        plot(np.corrcoef(X.T))
        plot(np.corrcoef(Z.T))
    

    结果展示
    1.降维前:

    降维前
    2.降维后:
    降维后

    4.核概率PCA

     因为S=\Phi \Gamma \Phi^{T};\Phi=WV\Lambda^{-\frac{1}{2}};V=I,这里忘记说了,之所以V可以取单位矩阵是因为,V是W^{T}W特征分解出来的,而W是未知的,只要求V是正交矩阵都行,为了方便,直接就取单位矩阵。这样我们就可以得出S:
    S=W\Lambda^{-\frac{1}{2}}\Gamma \Lambda^{-\frac{1}{2}}W =W\Lambda^{-\frac{1}{2}}\Gamma^{\frac{1}{2}}\Gamma^{\frac{1}{2}} \Lambda^{-\frac{1}{2}}W^{T}
     令:T=\Gamma^{\frac{1}{2}} \Lambda^{-\frac{1}{2}}W^{T}W\Lambda^{-\frac{1}{2}}\Gamma^{\frac{1}{2}}
     将T进行特征分解可得T=MGM^{T}
    T\cdot \vec{m}=\lambda \cdot \vec{m}

    \Gamma^{\frac{1}{2}} \Lambda^{-\frac{1}{2}}W^{T}W\Lambda^{-\frac{1}{2}}\Gamma^{\frac{1}{2}}\cdot \vec{m}=\lambda \cdot \vec{m}
    W\Lambda^{-\frac{1}{2}}\Gamma^{\frac{1}{2}}\cdot \Gamma^{\frac{1}{2}} \Lambda^{-\frac{1}{2}}W^{T}W\Lambda^{-\frac{1}{2}}\Gamma^{\frac{1}{2}}\cdot \vec{m}=\lambda W\Lambda^{-\frac{1}{2}}\Gamma^{\frac{1}{2}}\cdot \vec{m}
    S(W\Lambda^{-\frac{1}{2}}\Gamma^{\frac{1}{2}}\cdot \vec{m})=\lambda\cdot W\Lambda^{-\frac{1}{2}}\Gamma^{\frac{1}{2}}\cdot \vec{m}
     从中可以得出W\Lambda^{-\frac{1}{2}}\Gamma^{\frac{1}{2}}\cdot M就是协方差矩阵特征向量构成的正交矩阵,即:
    \Phi=W\Lambda^{-\frac{1}{2}}\Gamma^{\frac{1}{2}}\cdot M

    W=\Phi M^{T}\Gamma^{-\frac{1}{2}}\Lambda^{\frac{1}{2}}
     引入核:W^{T}W\to<g(W),g(W)>=K其中映射g属于再生核希尔伯特空间。
    T=\Gamma^{\frac{1}{2}} \Lambda^{-\frac{1}{2}}K\Lambda^{-\frac{1}{2}}\Gamma^{\frac{1}{2}}
     将结果带入概率PCA的最后公式:
    E(Z|X-\mu)=(X-\mu)W(W^{T}W+\sigma^{2}I_{q})^{-1}\\ =HX\Phi M^{T}\Gamma^{-\frac{1}{2}}\Lambda^{\frac{1}{2}}(K+(\frac{1}{p-q}\sum_{i=p-q+1}^{p}\lambda_{i})I_{q})^{-1};其中:\Lambda=\Gamma_{q}-(\frac{1}{p-q}\sum_{i=p-q+1}^{p}\lambda_{i})I_{q}
    上代码:

    import numpy as np
    class PPCA:
        def __init__(self,X,q):
            self.X=X
            self.mu=np.array([np.average(self.X,axis=0)]).T
            self.n=np.shape(self.X)[0]
            self.p=np.shape(self.X)[1]
            self.q=q
            self.H=np.identity(self.n)-(1/self.n)*np.ones([self.n,1]).dot(np.ones([self.n,1]).T)
            self.S=self.X.T.dot(self.H).dot(self.X)
        def Guass_Kernal(self,sigma):
            self.sigma=sigma
            E_minus_w_square = (np.repeat(np.exp(-1 * (np.sum(self.W.T * self.W.T, axis=1))), self.q) / self.sigma).reshape(
                self.q, self.q)
            E_w_wT = np.exp(self.W.T.dot(self.W) / self.sigma)
            return E_minus_w_square*E_w_wT*E_minus_w_square.T
        def Multinomial_Kernel(self,M_n,alpha):
            return (self.W.T.dot(self.W)+alpha)**M_n
        def dimensionality_reduction(self,):
            self.eigenvalues,self.eigenvectors=np.linalg.eig(self.S)
            self.ranking=np.argsort(self.eigenvalues)
            self.eigenvalues_q=self.eigenvalues[np.where(self.ranking<self.q)]
            self.eigenvectors_q=self.eigenvectors[np.where(self.ranking<self.q)]
            self.Gamma=np.diag(self.eigenvalues)
            self.Gamma_q=np.diag(self.eigenvalues_q)
            self.sigma_square=(1/(self.p-self.q))*(np.sum(self.eigenvectors)-np.sum(self.eigenvectors_q))
            self.Lambda=self.Gamma_q-self.sigma_square*np.identity(self.q)
            self.inv_lambda=np.linalg.inv(self.Lambda)
            self.W=self.eigenvectors_q.T.dot(self.Lambda**(1/2))
            self.T=(self.Gamma_q**(1/2)).dot(self.inv_lambda**(1/2)).dot(self.Guass_Kernal(0.01)).dot(self.inv_lambda**(1/2)).dot(self.Gamma_q**(1/2))
            _, self.M=np.linalg.eig(self.T)
            self.Z=self.H.dot(self.X).dot(self.eigenvectors_q.T).dot(self.M.T).dot(np.linalg.inv(self.Gamma_q)**(1/2)).dot(self.Lambda**(1/2)).dot(np.linalg.inv(self.Guass_Kernal(0.01)+self.sigma_square*np.identity(self.q)))
            return self.Z
    if __name__ == '__main__':
        import seaborn as sns
        import matplotlib.pyplot as plt
        from sklearn.datasets import load_diabetes
        def plot(dfData):
            plt.subplots(figsize=(9, 9))
            sns.heatmap(dfData, annot=True, vmax=1, square=True, cmap="Reds")
            plt.show()
        data=load_diabetes()
        X=data["data"]
        print(X.shape)
        PPCA_Algorithm=PPCA(X,4)
        Z=PPCA_Algorithm.dimensionality_reduction()
        plot(np.corrcoef(X.T))
        plot(np.corrcoef(Z.T))
    

    事实上,我使用了高斯核和多项式核,发现与没有引入之前相比,在数据集diabetes上并没有多大差别。有时候特征分解还有复数出现,不知道如何处理,希望以后能解决吧。
    结果:


    KPPCA.png

    (OVER)

    相关文章

      网友评论

        本文标题:(九) 概率PCA推导&&核概率PCA

        本文链接:https://www.haomeiwen.com/subject/rgrurktx.html