使用R的统计学习:算法和实践(二):PCA(3)核主成分
这一篇讨论非线性PCA的另一种方法:kernel PCA(核主成分)。这是主成分分析引入核方法的结果((Scholkopf, Smola, and Muller, 1996)[1]。
1. 核技巧
核方法是机器学习最常用的方法之一。关于核方法,会在(或许很久很久…)之后的某篇专门讨论。
所谓核技巧(kernel trick)是通过一个非线性变换把(观测点所在的)输入空间的非线性问题转化为特征空间(是一个希尔伯特空间(#名词可以忽略))的线性问题来解决。使用核技巧是在学习问题的解决过程中,只定义核函数,而不显示地定义非线性变换函数,而对核函数的计算相对比较容易。(我觉得核技巧称为“核戏法”要更贴切)
2.kernel PCA的原理和算法
(1)kernel PCA可以视为如下的一个两步的过程
(a)r维空间R[r](称为输入空间)的点X[i],到N[H]维空间(称为特征空间, N[H]>r)的点Ф(X[i])的非线性映射(称特征映射):
其中每一个Ф[i]都是非线性映射。
(b)设特征空间点的协方差阵满足中心化,对其求解线性PCA。(注意此时维数比输入空间更高),在这其中,会使用核技巧。
(2)从PCA到kernel PCA:基本思想
主成分分析的基本解法特征值分解,即对协方差矩阵C求解其特征值λ[k]和与特征值对应单位正交的特征向量u[k]。满足Cλ[k]= λ[k] u[k]
如果从一个中心化的协方差矩阵C入手,我们可以得到所求的特征向量u[k]可以表示为输入特征(观测点)X[1] … X[n ]的展开(span)。我们把观测X[i]向u[k]投影(得到的是X[i]的第k主成分得分):
X[i]’ u[k]
这个就是常用的主成分分析。
那么,核函数形式如何引入呢?
对Cλ[k]= λ[k] u[k]两边左乘X[i]’,利用刚才得到的u[k]的展开式
可以得到下面这个包含内积的结果:
这样就转化为一个Gram矩阵(http://en.wikipedia.org/wiki/Gramian_matrix)K的特征值和特征向量的求解。
当我们把X[i]映射到Ф(X[i])时,在相应的协方差阵中心化的设定下,上面的推导都成立。
就是此时K的元素为
把它取为核函数,这个“核戏法”就变成了。
这个推导涉及矩阵和内积的计算,稍后附上。书里边([2],[3])都是从Ф(X[i])出发作的推导,我觉得直接从主成分出发或许更容易理解PCA和kernel PCA的联系。
(3)算法
给定观测阵X和核函数k( , )
(a)求Gram矩阵K
(b)求K的特征值及特征向量v[k],并对v[k]归一化
(c)求Ф(X[i])在v[k]上的投影,得到kernel PCA的第k个主成分得分。
3.R函数
R包kernlab是R当中核方法的基本包,其中函数kpca()求解核主成分。
另外R包semisupKernelPCA提供了一种半监督的核主成分方法,参考[4]
4.例子
例,考虑PCA篇中食品营养的例子,6个变量,961个观测。
数据整理部分略
food.clean<-as.matrix(food.clean)#把整理之后的数据做成矩阵
library(kernlab)
par(mfrow=c(2,2))
#随参数sigma变化的情况
for (i in c(0.005,0.01,0.1,0.5))
{kpc<-kpca(food.clean,kernel="rbfdot",kpar=list(sigma=i),features=2)
a<-eig(kpc)#特征值
print(a)
plot(rotated(kpc),col='red',pch=19,xlab="1st Principal Component",ylab="2nd Principal Component")
out<-c(125,318,357,441,837)
text(((rotated(kpc)[out,c(1,2)])+.3),labels=out,cex=1.2)}
#其中的rotated(kpc)为主成分得分
我们来看这个结果,分析所用的核函数是高斯核(rbfdot ,Radial Basis kernel function)
),对参数sigma取了4个不同的值。随着参数值的增加,对应的特征值也在增大,相应的主成分得分也在变化,并表现出明显的非线性曲线的形式。为说明这个变化,图中显示了(125,318,357,441,837)这几个观测位置的变化,它们分别对应六个营养成分取最大值时的观测(441是重叠的最大值)。
5.模型和参数选择
关于核主成分的模型和参数选择,似乎还是一个正在研究中的问题。看过的一些关于核主成分的文章,都是就具体问题进行的讨论。
是否有比较普遍适用的方法,求教方家指点。
6.和多维标度法的关系
在Metric MDS中,距离计算可以由内积形式表示,距离矩阵可以看作观测点自输入空间映射到特征空间的结果。kernel PCA 也可以看作MDS的核版本,输入空间的内积被Gram矩阵的核运算替代。
参考
[1] Sch¨olkopf, B., Smola, A.J., and Muller, K.-R. (1998). Nonlinear
component analysis as a kernel eigenvalue problem, Neural Computation,
10, 1299–1319.
[2] Modern Multivariate Statistical Techniques(第16章)
http://book.douban.com/subject/3649744/
[3] Machine Learning:A Probabilistic Perspective(第14章)
http://book.douban.com/subject/10758624/
[4]Bruneau, P. and Otjacques,B. (2012) Including semi-supervision in a kernel matrix, with a view to interactive visualclustering. Tech Report hal-00751407, CRP Gabriel Lippmann.
1. 核技巧
核方法是机器学习最常用的方法之一。关于核方法,会在(或许很久很久…)之后的某篇专门讨论。
所谓核技巧(kernel trick)是通过一个非线性变换把(观测点所在的)输入空间的非线性问题转化为特征空间(是一个希尔伯特空间(#名词可以忽略))的线性问题来解决。使用核技巧是在学习问题的解决过程中,只定义核函数,而不显示地定义非线性变换函数,而对核函数的计算相对比较容易。(我觉得核技巧称为“核戏法”要更贴切)
2.kernel PCA的原理和算法
(1)kernel PCA可以视为如下的一个两步的过程
(a)r维空间R[r](称为输入空间)的点X[i],到N[H]维空间(称为特征空间, N[H]>r)的点Ф(X[i])的非线性映射(称特征映射):
![]() |
其中每一个Ф[i]都是非线性映射。
(b)设特征空间点的协方差阵满足中心化,对其求解线性PCA。(注意此时维数比输入空间更高),在这其中,会使用核技巧。
(2)从PCA到kernel PCA:基本思想
主成分分析的基本解法特征值分解,即对协方差矩阵C求解其特征值λ[k]和与特征值对应单位正交的特征向量u[k]。满足Cλ[k]= λ[k] u[k]
如果从一个中心化的协方差矩阵C入手,我们可以得到所求的特征向量u[k]可以表示为输入特征(观测点)X[1] … X[n ]的展开(span)。我们把观测X[i]向u[k]投影(得到的是X[i]的第k主成分得分):
X[i]’ u[k]
这个就是常用的主成分分析。
那么,核函数形式如何引入呢?
对Cλ[k]= λ[k] u[k]两边左乘X[i]’,利用刚才得到的u[k]的展开式
可以得到下面这个包含内积的结果:
![]() |
这样就转化为一个Gram矩阵(http://en.wikipedia.org/wiki/Gramian_matrix)K的特征值和特征向量的求解。
当我们把X[i]映射到Ф(X[i])时,在相应的协方差阵中心化的设定下,上面的推导都成立。
就是此时K的元素为
![]() |
把它取为核函数,这个“核戏法”就变成了。
这个推导涉及矩阵和内积的计算,稍后附上。书里边([2],[3])都是从Ф(X[i])出发作的推导,我觉得直接从主成分出发或许更容易理解PCA和kernel PCA的联系。
(3)算法
给定观测阵X和核函数k( , )
(a)求Gram矩阵K
(b)求K的特征值及特征向量v[k],并对v[k]归一化
(c)求Ф(X[i])在v[k]上的投影,得到kernel PCA的第k个主成分得分。
3.R函数
R包kernlab是R当中核方法的基本包,其中函数kpca()求解核主成分。
另外R包semisupKernelPCA提供了一种半监督的核主成分方法,参考[4]
4.例子
例,考虑PCA篇中食品营养的例子,6个变量,961个观测。
数据整理部分略
food.clean<-as.matrix(food.clean)#把整理之后的数据做成矩阵
library(kernlab)
par(mfrow=c(2,2))
#随参数sigma变化的情况
for (i in c(0.005,0.01,0.1,0.5))
{kpc<-kpca(food.clean,kernel="rbfdot",kpar=list(sigma=i),features=2)
a<-eig(kpc)#特征值
print(a)
plot(rotated(kpc),col='red',pch=19,xlab="1st Principal Component",ylab="2nd Principal Component")
out<-c(125,318,357,441,837)
text(((rotated(kpc)[out,c(1,2)])+.3),labels=out,cex=1.2)}
#其中的rotated(kpc)为主成分得分
![]() |
我们来看这个结果,分析所用的核函数是高斯核(rbfdot ,Radial Basis kernel function)
),对参数sigma取了4个不同的值。随着参数值的增加,对应的特征值也在增大,相应的主成分得分也在变化,并表现出明显的非线性曲线的形式。为说明这个变化,图中显示了(125,318,357,441,837)这几个观测位置的变化,它们分别对应六个营养成分取最大值时的观测(441是重叠的最大值)。
![]() |
上图右下角,对应sigma=0.5的情况 |
5.模型和参数选择
关于核主成分的模型和参数选择,似乎还是一个正在研究中的问题。看过的一些关于核主成分的文章,都是就具体问题进行的讨论。
是否有比较普遍适用的方法,求教方家指点。
6.和多维标度法的关系
在Metric MDS中,距离计算可以由内积形式表示,距离矩阵可以看作观测点自输入空间映射到特征空间的结果。kernel PCA 也可以看作MDS的核版本,输入空间的内积被Gram矩阵的核运算替代。
参考
[1] Sch¨olkopf, B., Smola, A.J., and Muller, K.-R. (1998). Nonlinear
component analysis as a kernel eigenvalue problem, Neural Computation,
10, 1299–1319.
[2] Modern Multivariate Statistical Techniques(第16章)
http://book.douban.com/subject/3649744/
[3] Machine Learning:A Probabilistic Perspective(第14章)
http://book.douban.com/subject/10758624/
[4]Bruneau, P. and Otjacques,B. (2012) Including semi-supervision in a kernel matrix, with a view to interactive visualclustering. Tech Report hal-00751407, CRP Gabriel Lippmann.
> 我来回应