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

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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348