Kernel PCA 原理和演示

主成份(Principal Component Analysis)分析是降维(Dimension Reduction)的重要手段。每一个主成分都是数据在某一个方向上的投影,在不同的方向上这些数据方差Variance的大小由其特征值(eigenvalue)决定。一般我们会选取最大的几个特征值所在的特征向量(eigenvector),这些方向上的信息丰富,一般认为包含了更多我们所感兴趣的信息。当然,这里面有较强的假设:(1)特征根的大小决定了我们感兴趣信息的多少。即小特征根往往代表了噪声,但实际上,向小一点的特征根方向投影也有可能包括我们感兴趣的数据; (2)特征向量的方向是互相正交(orthogonal)的,这种正交性使得PCA容易受到Outlier的影响,例如在【1】中提到的例子(3)难于解释结果。例如在建立线性回归模型(Linear Regression Model)分析因变量(response)和第一个主成份的关系时,我们得到的回归系数(Coefficiency)不是某一个自变量(covariate)的贡献,而是对所有自变量的某个线性组合(Linear Combination)的贡献。

在Kernel PCA分析之中,我们同样需要这些假设,但不同的地方是我们认为原有数据有更高的维数,我们可以在更高维的空间(Hilbert Space)中做PCA分析(即在更高维空间里,把原始数据向不同的方向投影)。这样做的优点有:对于在通常线性空间难于线性分类的数据点,我们有可能再更高维度上找到合适的高维线性分类平面。我们第二部分的例子就说明了这一点。

本文写作的动机是因为作者没有找到一篇好的文章(看了wikipedia和若干google结果后)深层次介绍PCA和Kernel PCA之间的联系,以及如何以公式形式来解释如何利用Kernel PCA来做投影,特别有些图片的例子只是展示了结果和一些公式,这里面具体的过程并没有涉及。希望这篇文章能做出较好的解答。

1. Kernel Principal Component Analysis 的矩阵基础

我们从解决这几个问题入手:传统的PCA如何做?在高维空间里的PCA应该如何做?如何用Kernel Trick在高维空间做PCA?如何在主成分方向上投影?如何Centering 高维空间的数据?

1.1 传统的PCA如何做?

让我先定义如下变量: X=[x1,x2,…,xN] 是一个d×N矩阵,代表输入的数据有N 个,每个sample的维数是d。我们做降维,就是想用k维的数据来表示原始的d维数据(k≤d)。
当我们使用centered的数据(即∑ixi=0)时,可定义协方差矩阵C为:

C=1NxixTi=1NXXT

做特征值分解,我们可以得到:

CU=UΛ⇒C=UΛUT=∑aλauauTa

注意这里的C,U,Λ的维数都是d×d, 且U=[u1,u2,…,ud], Λ=diag(λ1,λ2,…,λd)。
当我们做降维时,可以利用前k个特征向量Uk=[u1,u2,…,uk]。则将一个d维的xi向k维的主成分的方向投影后的yi=UTkxi (这里的每一个ui都是d维的,代表是一个投影方向,且uTiui=1,表示这是一个旋转变量)

1.2 在高维空间里的PCA应该如何做?

高维空间中,我们定义一个映射Φ:Xd→F,这里F表示Hilbert泛函空间。
现在我们的输入数据是Φ(xi),i=1,2,…n, 他们的维数可以说是无穷维的(泛函空间)。
在这个新的空间中,假设协方差矩阵同样是centered,我们的协方差矩阵为:

C¯=1NΦ(xi)Φ(xi)T=1NΦ(X)Φ(X)T

这里有一个陷阱,我跳进去过:
在对Kernel trick一知半解的时候,我们常常从形式上认为C¯可以用Ki,j=K(xi,xj)来代替,
因此对K=(Kij)做特征值分解,然后得到K=UΛUT,并且对原有数据降维的时候,定义Yi=UTkXi。
但这个错误的方法有两个问题:一是我们不知道矩阵C¯的维数;二是UTkXi从形式上看不出是从高维空间的Φ(Xi)投影,并且当有新的数据时,我们无法从理论上理解UTkXnew是从高维空间的投影。
如果应用这种错误的方法,我们有可能得到看起来差不多正确的结果,但本质上这是错误的。
正确的方法是通过Kernel trick将PCA投影的过程通过内积的形式表达出来,详细见1.3

1.3 如何用Kernel Trick在高维空间做PCA?

在1.1节中,通过PCA,我们得到了U矩阵。这里将介绍如何仅利用内积的概念来计算传统的PCA。
首先我们证明U可以由x1,x2,…,xN展开(span):

Cua=λaua
ua=1λaCu=1λa(∑ixixTi)u=1λa∑ixi(xTiu)=1λa∑i(xTiu)xi=∑ixTiuλaxi=∑iαaixi

这里定义αai=xTiuλa。
因为xTiu 是一个标量(scala),所以αai也是一个标量,因此ui 是可以由xi张成。

进而我们显示PCA投影可以用内积运算表示,例如我们把xi向任意一个主成分分量ua进行投影,得到的是uTaxi,也就是xTiua 。作者猜测写成这种形式是为了能抽出xTixj=<xi,xj>的内积形式。

xTiCuaxTi1N∑jxjxTj∑kαakxk∑jαak∑k(xTixj)(xTjxk)=λaxTiua=λaxTi∑kαakxk=Nλa∑kαak(xTixk)

当我们定义Kij=xTixj时,上式可以写为K2α=NλaKαa
(这里αa定义为[αa1,αa2,…,αaN]T.)
进一步,我们得到解为:

Kα=λ~aαwithλ~a=Nλa

K矩阵包含特征值λ~和αa,我们可以通过α可以计算得到ua,
注意特征值分解时Eigendecomposition,αa只代表一个方向,它的长度一般为1,但在此处不为1。
这里计算出αa的长度(下面将要用到):
因为ua的长度是1,我们有:

1=uTaua=(∑iαaixi)T(∑jαajxj)=∑i∑jαaiαajxTixTj=(αa)TKαa=(αa)T(Nλaαa)=Nλa(αaTαa)⇒∥αa∥=1/Nλa−−−−√=1/λ~a−−√

在上面的分析过程中,我们只使用了内积。因此当我们把Kij=xTixj推广为Kij=<Φ(xi),Φ(xj>=Φ(xi)TΦ(xj)时,上面的分析结果并不会改变。

1.4 如何在主成分方向上投影?

投影时,只需要使用U矩阵,假设我们得到的新数据为t,那么t在ua方向的投影是:

uTat=∑iαaixTit=∑iαai(xTit)

对于高维空间的数据Φ(xi),Φ(t),我们可以用Kernel trick,用K(xi,t)来带入上式:

uTat=∑iαaiK(xi,t)

1.5 如何Centering 高维空间的数据?

在我们的分析中,协方差矩阵的定义需要centered data。在高维空间中,显式的将Φ(xi)居中并不简单,
因为我们并不知道Φ的显示表达。但从上面两节可以看出,所有的计算只和K矩阵有关。具体计算如下:
令Φi=Φ(xi),居中ΦCi=Φi–1N∑kΦk

KCij=<ΦCiΦCj>=(Φi–1N∑kΦk)T(Φj–1N∑lΦl)=ΦTiΦj–1N∑lΦTiΦl–1N∑kΦTkΦj+1N2∑k∑lΦTkΦl=Kij–1N∑lKil–1N∑kKkj+1N2∑k∑lKkl

不难看出,

KC=K–1NK–K1N+1NK1N

其中1N 为N×N的矩阵,其中每一个元素都是1/N
对于新的数据,我们同样可以

K(xi,t)C=<ΦCiΦCt>=(Φi–1N∑kΦk)T(Φt–1N∑lΦl)=ΦTiΦt–1N∑lΦTiΦl–1N∑kΦTkΦt+1N2∑k∑lΦTkΦl=K(xi,t)–1N∑lKil–1N∑kK(xk,t)+1N2∑k∑lKkl

2. 演示 (R code)

首先我们应该注意输入数据的格式,一般在统计中,我们要求X矩阵是N×d的,但在我们的推导中,X矩阵是d×N。
这与统计上的概念并不矛盾:在前面的定义下协方差矩阵为XTX,而在后面的定义中是XXT。另外这里的协方差矩阵是样本(Sample)的协方差矩阵,我们的认为大写的X代表矩阵,而不是代表一个随机变量。
另外,在下面的结果中,Gaussian 核函数(kernel function)的标准差(sd)为2。在其他取值条件下,所得到的图像是不同的。

KPCA图片:

R 源代码(Source Code):链接到完整的代码 KernelPCA

Kernel PCA部分代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Kernel PCA
# Polynomial Kernel
# k(x,y) = t(x) %*% y + 1
k1 = function (x,y) { (x[1] * y[1] + x[2] * y[2] + 1)^2 }
K = matrix(0, ncol = N_total, nrow = N_total)
for (i in 1:N_total) {
  for (j in 1:N_total) {
    K[i,j] = k1(X[i,], X[j,])
}}
ones = 1/N_total* matrix(1, N_total, N_total)
K_norm = K - ones %*% K - K %*% ones + ones %*% K %*% ones
res = eigen(K_norm)
 
V = res$vectors
D = diag(res$values)
 
rank = 0
for (i in 1:N_total) {
    if (D[i,i] < 1e-6) { break }
      V[,i] = V[,i] / sqrt (D[i,i])
    rank = rank + 1
}
Y = K_norm %*%  V[,1:rank]
plot(Y[,1], Y[,2], col = rainbow(3)[label], main = "Kernel PCA (Poly)"
, xlab="First component", ylab="Second component")

3. 主要参考资料

 

【1】A Tutorial on Principal Component Analysis ,Jonathon Shlens, Shlens03

【2】Wikipedia: http://en.wikipedia.org/wiki/Kernel_principal_component_analysis

【3】 Original KPCA Paper:Kernel principal component analysis,Bernhard Schölkopf, Alexander Smola and Klaus-Robert Müller http://www.springerlink.com/content/w0t1756772h41872/fulltext.pdf

【4】Max Wellings’s classes notes for machine learning Kernel Principal Component Analaysis http://www.ics.uci.edu/~welling/classnotes/papers_class/Kernel-PCA.pdf

No related posts.

 

Kernel PCA 原理和演示的更多相关文章

  1. Kernel Methods (5) Kernel PCA

    先看一眼PCA与KPCA的可视化区别: 在PCA算法是怎么跟协方差矩阵/特征值/特征向量勾搭起来的?里已经推导过PCA算法的小半部分原理. 本文假设你已经知道了PCA算法的基本原理和步骤. 从原始输入 ...

  2. 主成分分析法PCA原理

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  3. PCA原理(转)

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  4. PCA 原理

      PCA的数学原理(转) 1 年前 PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取 ...

  5. 主成分分析(PCA)原理与实现

    主成分分析原理与实现   主成分分析是一种矩阵的压缩算法,在减少矩阵维数的同时尽可能的保留原矩阵的信息,简单来说就是将 \(n×m\)的矩阵转换成\(n×k\)的矩阵,仅保留矩阵中所存在的主要特性,从 ...

  6. 机器学习之主成分分析PCA原理笔记

    1.    相关背景 在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律.多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的 ...

  7. 降维算法----PCA原理推导

    1.从几何的角度去理解PCA降维 以平面坐标系为例,点的坐标是怎么来的? 图1                                                             ...

  8. 【模式识别与机器学习】——PCA与Kernel PCA介绍与对比

    PCA与Kernel PCA介绍与对比 1. 理论介绍 PCA:是常用的提取数据的手段,其功能为提取主成分(主要信息),摒弃冗余信息(次要信息),从而得到压缩后的数据,实现维度的下降.其设想通过投影矩 ...

  9. Probabilistic PCA、Kernel PCA以及t-SNE

    Probabilistic PCA 在之前的文章PCA与LDA介绍中介绍了PCA的基本原理,这一部分主要在此基础上进行扩展,在PCA中引入概率的元素,具体思路是对每个数据$\vec{x}_i$,假设$ ...

随机推荐

  1. docker-compose 工具安装

    centos 7 安装 之前测试过相关安装方法 pip python 安装不行 还是用下面这个办法搞定 curl -L https://github.com/docker/compose/releas ...

  2. 内部开发环境 git代码托管说明

    前言 随着员工的增加 代码的开发版本管理 提上了日程.初步计划: 1 一台机器 192.168.1.240 git代码版本管理 2 运行环境 192.168.1.241 内部开发运行环境 软件工程师 ...

  3. 为什么我选择使用 Blocks(块)

    扯淡:到了新公司接手新框架之后,发现大量的使用Blocks,之前很多时候都是使用代理,突然面对这个陌生的语法,特地科普总结了一番. 什么是Blocks 一句话概括就是,带有局部变量的匿名函数(即不带名 ...

  4. Android热门网络框架Volley详解

    .Volley简介 volley的英文意思为‘群发’.‘迸发’.Volley是2013年谷歌官方发布的一款Android平台上的网络通信库.Volley非常适合一些数据量不大,但需要频繁通信的网络操作 ...

  5. Java 406

    项目改名之后, 项目上传后,报错,406,可是项目本地是可以跑起来的, 联系管理员,管理员改了个/etc/httpd/conf/workers2.properties 里面,将本次的项目加入进去就OK ...

  6. U3D 背景音效和事件触发音效

    首先,想要在一个游戏添加背景音乐其实很简单,就是利用一个组件 就能够实现音频的播放,不过要实现通过某一个事件,来进行声音的播放,比如跳跃啊什么的: public AudioClip jumpclips ...

  7. 浅谈angular框架

    最近新接触了一个js框架angular,这个框架有着诸多特性,最为核心的是:MVVM.模块化.自动化双向数据绑定.语义化标签.依赖注入,以上这些全部都是属于angular特性,虽然说它的功能十分的强大 ...

  8. 从零开始学java(猜数字游戏)

    练练手不喜勿喷,看到什么学习什么第一次发博客格式就见见谅.....                                            2016-07-21 19:55:02 imp ...

  9. 序列数据挖掘[ZZ]

    一.时间序列数据挖掘 时间序列是数据存在的特殊形式,序列的过去值会影响到将来值,这种影响的大小以及影响的方式可由时间序列中的趋势周期及非平稳等行为来刻画.一般来讲,时间序列数据都具有躁声.不稳定.随机 ...

  10. SGU 164.Airline(结论题)

    时间限制:0.25s 空间限制:4M 题意: 在n(1<=n<=200)个点的无向完全图中,有m种不同的边.现在从中选择不超过(m+1)/2种边,使得任意两点可以通过不超过3条边互相到达. ...