核PCA(Kernel PCA)学习笔记

 感谢大佬们的文章

1、(46条消息) Gram矩阵_wangyang20170901的博客-CSDN博客_gram矩阵

 2、数据降维: 核主成分分析(Kernel PCA)原理解析 - 知乎

--------------------------------------------------KPCA应用解释----------------------------------------------------------

如果理解PCA的基础上去理解KPCA,简直就是相反的操作。PCA是有损降维,将多维数据降到低维且最大的保留重要的信息量,而KPCA是将低维往高维升,在低维中无法划分开的数据在高维却十分的容易简单,来张图片就能理解了。

图1是二维通过核为高斯核变成的三维图2。还有很多核等等再说,这里就将在二维不容易分离的数据点在三维就很容易分离开了。 

 打波广告不太理解PCA的可以看这篇:PCA(主成分分析法)的理解笔记及算法的实现_CMaking的博客-CSDN博客

-----------------------------------------------------KPCA总结步骤--------------------------------------------------------

废话不多先上步骤

 1、选择核函数,组合成Gram matrix K=k(xi,xj)

2、标准化K,即\tilde{K}=K-2I_{\frac{1}{N}}K+I_{\frac{1}{N}}KI_{\frac{1}{N}},其中I_{\frac{1}{N}}是nxn维的全是\frac{1}{N}的矩阵

 3、解出特征值核特征向量,即\tilde{K}\alpha _{r}=\lambda _{r}\alpha _{r}

4、标准化\alpha _{r}\alpha _{r}^{T}\alpha _{r}=\frac{1}{\lambda _{r}},模为\frac{1}{\lambda _{r}}

5、最后就可以把任何一个数据点投影到主成分向量上了

 

 是投影后的数据点。

 ----------------------------------------------------------------------------------------------------------------------

刚刚说了KPCA和PCA一堆塑料兄弟,在PCA中求协方差矩阵C=\frac{1}{m}XX^{T}的特征值和特征向量,那么我们现在推广到高维的\Phi (x_{i}),这个\Phi是低维映射到高维空间的函数,简单理解为低维空间的点通过加工操作变成了高维空间的数据点就好了。

1、我们假设均值为0,即\frac{1}{N}\sum_{i=1}^{N}\Phi (x_{i})=0,注意这里我们是假设的均值为0,等等后面要操作的。

2、我们计算高维协方差矩阵:\tilde{H}=\frac{1}{N}\sum_{i=1}^{N}\Phi (x_{i})\Phi^{T} (x_{i}),\tilde{H}是代表高维协方差矩阵的意思不是平均值。

3、求\bar{H}的特征值和特征向量。

就这样,但是\bar{H}是个高维的非常非常的高,高维处理起来就非常的麻烦,那么我们接下来针对这个问题进行下面的推导。

首先根据特征向量的定义:

                                                ​​​​​​​        

\tilde{z}是非零的特征向量

我们把带入到高维协方差矩阵中\bar{H}=\frac{1}{N}\sum_{i=1}^{N}\Phi (x_{i})\Phi^{T} (x_{i}),即得到:

                                             \tilde{H}=\frac{1}{N}\sum_{i=1}^{N}\Phi (x_{i})\Phi^{T} (x_{i})\tilde{z}=\tilde{\lambda }\tilde{z}​​​​​​​

其中\Phi^{T} (x_{i})\tilde{z}内积是个常数再乘以一个\frac{1}{N}把他们合并起来,就可以得到

                                             \tilde{z}=\sum_{j=1}^{N}\alpha _{j}\Phi (x_{j})\alpha _{j}=\frac{1}{N}\Phi^{T} (x_{i})\tilde{z}

这样就把刚刚要找的\tilde{z}转化成找一些系数\alpha,只要能找到这个系数就能找到这个向量了。

------------------------------------------------------------------------------------------------------------------------------

我们接下来将\tilde{z}=\sum_{j=1}^{N}\alpha _{j}\Phi (x_{j})带入到中就会得到

是不是看到很多\phi(x)头很大,那么我们接下来就定义k(x_{i},x_{j})=\phi ^{T}(x_{i})\phi(x_{j}),将k带到上式中可以得到

       

两边继续同乘\phi^{T}(x_{k}),k=1,....,N

我们在定义一个Gram matrix,他是任意K个向量的内积所组成的矩阵。

上链接: Gram矩阵_wangyang20170901的博客-CSDN博客_gram矩阵

K\subseteqq \mathbb{R}^{N*N},K(i,j)=k(x_{i},x_{j}),k(x_{i},x_{j})=k(x_{j},x_{i}),k是对称矩阵。

上式整理一下就有了K^{2}\alpha =N\tilde{\lambda }K\alpha,两边相消K得到K\alpha =N\tilde{\lambda }\alpha,令\lambda =N\tilde{\lambda }整理得到

K\alpha =\lambda \alpha,然后解出特征值特征向量就好了。(当然没这么简单)

-------------------------------------------------------z向量标准化--------------------------------------------------------

注意的是我们在PCA中要求特征向量要单位化的即||\tilde{z}||=1才行,在KPCA也一样那么我们标准化:

上式告诉我们单位化 \tilde{z}我们只需要||\alpha _{r}||=\frac{1}{\lambda _{r}},到这里我们就结束了嘛?还没有,上式中 还有我们讨厌的\phi存在,我们就把某个数据点投影到\tilde{z}试试,即得到

 我们为什么要把他投影到\tilde{z}上?我们的目的是求主方向,那么主方向怎么求就是把一个数据点投影到主方向上,既然是这样我们就不用管\phi()的定义了反正都可以直接计算出投影后的向量了。

最后一个问题,我刚刚一开始是假设\phi是归一化后的,那么这里我们标准化好咯

 

 这里用刚刚提到的Gram matrix代替里面的k就会得到\tilde{K}=K-2I_{\frac{1}{N}}K+I_{\frac{1}{N}}KI_{\frac{1}{N}},其中I_{\frac{1}{N}}是nxn维的全是\frac{1}{N}的矩阵。这一步使得K被标准化了

-----------------------------------------------------和函数------------------------------------------------------------------

 

核的选择要去试要去做实验才知道那个效果好,除非你很了解你的数据是什么分布的,不过在现实中不太可能会知道。 

                                                                                     如果有错误欢迎留言指出,共同进步

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PCAKernel Principal Component Analysis)是一种非线性的主成分分析方法,用于降维和数据可视化。它通过将数据映射到高维空间中,并在高维空间中找到主成分,来实现降维。与传统的线性PCA不同,PCA使用函数来进行非线性映射,从而更好地捕捉数据中的非线性结构。 在Python中,我们可以使用Scikit-learn库中的KernelPCA类来实现PCA。首先,需要导入相应的模块和数据集,然后创建一个KernelPCA对象,设置函数的类型和参数,接着使用fit_transform方法对数据进行降维,最后可以使用matplotlib库来可视化降维后的数据。 以下是一个使用Scikit-learn库实现PCA的示例代码: ```python from sklearn.decomposition import KernelPCA from sklearn.datasets import make_moons import matplotlib.pyplot as plt # 创建一个半月形状的数据集 X, y = make_moons(n_samples=100, random_state=123) # 初始化一个主成分分析对象 kpca = KernelPCA(kernel='rbf', gamma=15, n_components=2) # 使用KPCA对数据进行降维 X_kpca = kpca.fit_transform(X) # 绘制降维后的数据 plt.scatter(X_kpca[y==0, 0], X_kpca[y==0, 1], color='red', marker='^', alpha=0.5) plt.scatter(X_kpca[y==1, 0], X_kpca[y==1, 1], color='blue', marker='o', alpha=0.5) plt.xlabel('PC1') plt.ylabel('PC2') plt.show() ``` 以上代码中,我们使用了高斯函数(rbf)作为函数,并设置了gamma参数为15。通过fit_transform方法对数据进行降维得到X_kpca,然后使用scatter函数将降维后的数据可视化到平面上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值