使用R的统计学习:算法和实践(二):PCA(2)主曲线
使用R的统计学习(二): PCA(2)主曲线
这一篇讨论非线性主成分。
1.线性主成分的一些缺陷
作为一种线性的维数缩减技术,线性主成分对类似多元正态分布的椭圆分布数据效果明显,但对一般的非线性数据结构的效果比较差,比如二次,三次或高次多项式的数据;同时,线性主成分受随机扰动的影响也比较大。
例,考虑一个满足二次多项式的二元观测数据结构
x<-seq(-1.5,.5,by=.01)
y<-4*x^2+4*x+2
p<-cbind(x,y)
p.pca <- prcomp( p)
这样得到的主成分,分别对应y轴和x轴,这个结果在应用上是很糟糕的。
2.主曲线(principal curve)
(1)主曲线是第一线性主成分的一般化,由Hastie于1984年提出,使用一条光滑曲线来近似数据集。
先对随机变量X定义主曲线。设f (λ) = (f1(λ), • • • , fr(λ))是具有r个坐标的向量函数,每一个为单个参数λ的光滑函数。参数λ是可选择的,比如,可以是从某个固定点开始的曲线弧长。考虑r维点X,把它投影到曲线f(λ)最接近它的点上(在欧氏距离意义下)。
记投影指标(projection index)为
这产生一个最接近X的点所对应的最大的λ值(这样避免了X投影到多个点的情况)。
如果f (λ)满足:
称f (λ)为X的主曲线或称为自相容的(self-consistent)。所以,主曲线可视为所有投影其上的点的平均(即,对主曲线上任何一点,f (λ)是投影到这个点上的X值的平均)。
形象地说,寻找通过数据分布“中央”的主曲线,使它能真实地反映数据的形态。即曲线是数据集合的“骨架”,数据集合是这个曲线的“云”。
主曲线可以最小化重构误差(reconstruction error):
(2)估计主曲线的算法称为投影期望算法。
利用X的点,估计主曲线,使得重构误差最小化:
使用的算法,交替进行下面两个步骤:
投影步:假设固定f,估计λ
期望步:假设固定λ,寻找f
算法以第一线性主成分作为初始的主曲线f,把X的n个值X[i]投影到这条线上,利用投影指标得到n个λ[i](1),然后,利用自相容性质,更新主曲线,得f(1)
迭代执行这两步直到收敛。在迭代过程中,曲线f的估计采用散点图光滑子(scatterplot smoother ,如核,三次样条或者 locally weighted running-line smoother)实现。收敛准则可由重构误差给出,比如使两次迭代的重构误差值的差异比例小于一个阈值(如0.001)。
(3)主曲面
主曲面是主成分的更一般的扩展,提供二维或更高维的曲线流形近似。
(4)主曲线的一些应用
上面介绍的是主曲线的基本算法。在将近30年的时间里,主曲线方法得到很大的扩展。
具体的应用也很多,大多和图像识别和手写体识别有关。
(5)相关R包
princurve包,拟合任意维度的主曲线,基于Hastie的S语言相关函数完成。其中拟合主曲线的函数是principal.curve(),默认的光滑方法是光滑样条(smooth.spline),也可以选择"lowess" 和"periodic.lowess",后两者可用来拟合封闭曲线。
LPCM包,局部主曲线方法,采用[2]当中所用的技术并有扩展。
cems包,计算主曲线和主曲面的条件期望流形方法。方法参考[3]
主曲线示例:
100个随机的一维点x,变量y和x满足二次多项式,且有来自正态分布的随机扰动
比较线性主成分和主曲线
library(princurve)
x <- runif(100,-1,1)
p<- cbind(x, x ^ 2 + rnorm(100, sd = 0.1))
p.cov <- cov(p)
p.ed <- eigen(p.cov)
plot(p,col='red',pch=19)
abline(a=0,b=p.ed$vec[2,1]/p.ed$vec[1,1],col='blue')#画出第一线性主成分
fit1 <- principal.curve(p, plot = TRUE)#拟合主曲线
lines(fit1,col='blue')
points(fit1,col='black',pch=19)
points(p,pch=19,col='red')#画出主曲线
proj <- function(from, to)
segments(from[, 1], from[, 2], to[, 1], to[, 2])
proj(p, fit1$s) #画出投影
fit2 <- principal.curve(p, plot = TRUE, smoother = "lowess")#换一种拟合方法
参考:
[1] Hastie, T. and Stuetzle,W. , Principal Curves 1989, JASA
[2] Einbeck, J., Tutz, G., & Evers, L. (2005): Local principal curves, Statistics and Computing 15,301-313.
[3] Samuel Gerber and Ross Whitaker, Conditional Expectation Curves, Submitted 2011
[4] Modern Multivariate Statistical Techniques(第16章)
http://book.douban.com/subject/3649744/
[5] The Elements of Statistical Learning(2nd)(14.5节)
http://book.douban.com/subject/3294335/
这一篇讨论非线性主成分。
1.线性主成分的一些缺陷
作为一种线性的维数缩减技术,线性主成分对类似多元正态分布的椭圆分布数据效果明显,但对一般的非线性数据结构的效果比较差,比如二次,三次或高次多项式的数据;同时,线性主成分受随机扰动的影响也比较大。
例,考虑一个满足二次多项式的二元观测数据结构
x<-seq(-1.5,.5,by=.01)
y<-4*x^2+4*x+2
p<-cbind(x,y)
p.pca <- prcomp( p)
这样得到的主成分,分别对应y轴和x轴,这个结果在应用上是很糟糕的。
2.主曲线(principal curve)
(1)主曲线是第一线性主成分的一般化,由Hastie于1984年提出,使用一条光滑曲线来近似数据集。
先对随机变量X定义主曲线。设f (λ) = (f1(λ), • • • , fr(λ))是具有r个坐标的向量函数,每一个为单个参数λ的光滑函数。参数λ是可选择的,比如,可以是从某个固定点开始的曲线弧长。考虑r维点X,把它投影到曲线f(λ)最接近它的点上(在欧氏距离意义下)。
记投影指标(projection index)为
![]() |
这产生一个最接近X的点所对应的最大的λ值(这样避免了X投影到多个点的情况)。
如果f (λ)满足:
![]() |
称f (λ)为X的主曲线或称为自相容的(self-consistent)。所以,主曲线可视为所有投影其上的点的平均(即,对主曲线上任何一点,f (λ)是投影到这个点上的X值的平均)。
形象地说,寻找通过数据分布“中央”的主曲线,使它能真实地反映数据的形态。即曲线是数据集合的“骨架”,数据集合是这个曲线的“云”。
主曲线可以最小化重构误差(reconstruction error):
![]() |
(2)估计主曲线的算法称为投影期望算法。
利用X的点,估计主曲线,使得重构误差最小化:
![]() |
使用的算法,交替进行下面两个步骤:
投影步:假设固定f,估计λ
期望步:假设固定λ,寻找f
算法以第一线性主成分作为初始的主曲线f,把X的n个值X[i]投影到这条线上,利用投影指标得到n个λ[i](1),然后,利用自相容性质,更新主曲线,得f(1)
![]() |
迭代执行这两步直到收敛。在迭代过程中,曲线f的估计采用散点图光滑子(scatterplot smoother ,如核,三次样条或者 locally weighted running-line smoother)实现。收敛准则可由重构误差给出,比如使两次迭代的重构误差值的差异比例小于一个阈值(如0.001)。
(3)主曲面
主曲面是主成分的更一般的扩展,提供二维或更高维的曲线流形近似。
(4)主曲线的一些应用
上面介绍的是主曲线的基本算法。在将近30年的时间里,主曲线方法得到很大的扩展。
具体的应用也很多,大多和图像识别和手写体识别有关。
(5)相关R包
princurve包,拟合任意维度的主曲线,基于Hastie的S语言相关函数完成。其中拟合主曲线的函数是principal.curve(),默认的光滑方法是光滑样条(smooth.spline),也可以选择"lowess" 和"periodic.lowess",后两者可用来拟合封闭曲线。
LPCM包,局部主曲线方法,采用[2]当中所用的技术并有扩展。
cems包,计算主曲线和主曲面的条件期望流形方法。方法参考[3]
主曲线示例:
100个随机的一维点x,变量y和x满足二次多项式,且有来自正态分布的随机扰动
比较线性主成分和主曲线
library(princurve)
x <- runif(100,-1,1)
p<- cbind(x, x ^ 2 + rnorm(100, sd = 0.1))
p.cov <- cov(p)
p.ed <- eigen(p.cov)
plot(p,col='red',pch=19)
abline(a=0,b=p.ed$vec[2,1]/p.ed$vec[1,1],col='blue')#画出第一线性主成分
![]() |
fit1 <- principal.curve(p, plot = TRUE)#拟合主曲线
lines(fit1,col='blue')
points(fit1,col='black',pch=19)
points(p,pch=19,col='red')#画出主曲线
![]() |
图中黑色的点就是对应观测X(红色点)在主曲线上的投影点 |
proj <- function(from, to)
segments(from[, 1], from[, 2], to[, 1], to[, 2])
proj(p, fit1$s) #画出投影
![]() |
fit2 <- principal.curve(p, plot = TRUE, smoother = "lowess")#换一种拟合方法
![]() |
参考:
[1] Hastie, T. and Stuetzle,W. , Principal Curves 1989, JASA
[2] Einbeck, J., Tutz, G., & Evers, L. (2005): Local principal curves, Statistics and Computing 15,301-313.
[3] Samuel Gerber and Ross Whitaker, Conditional Expectation Curves, Submitted 2011
[4] Modern Multivariate Statistical Techniques(第16章)
http://book.douban.com/subject/3649744/
[5] The Elements of Statistical Learning(2nd)(14.5节)
http://book.douban.com/subject/3294335/
> 我来回应