引言:特征提取是机器学习中很常用数据处理方式,一般都出现在实际搭建模型之前,以达到特征空间维度的变化(常见是降维操作)。特征提取是通过适当变换把已有样本的D个特征转换成 d(<D) d ( < D ) 个新特征。这样做的主要目的有:
前面提到特征提取就是通过适当变换将特征从现有的特征空间转换到新的空间。所以特征提取的关键任务在于寻找适当变换,最常采用的变换方法是线性变换,即若 xϵRD x ϵ R D 是 D D 为原始特征,变换后的 d d 维新特征 ξϵRd ξ ϵ R d 为:
其中, W W 是 D×d D × d 维矩阵,称作变换阵。所谓特征提取,就是寻找一个合适的矩阵 W W ,使得原有样本经过式(1)的变换后,能够保留尽可能多的原有信息。如果用类别可分性判据来作为衡量新特征的准则,这一原则可以用一个表达式来表示:
l W∗=argmaxJ(WTx){W} W ∗ = a r g m a x J ( W T x ) { W } , 其中 J(WTx) J ( W T x ) 即为基于类内类间距离的可分性判据。
本次我们先介绍喜闻乐见的主成分分析法(PCA)。
PCA是非常常用的数据降维方法。它的基本思想是从一组特征中计算出一组按照重要性的大小从大到小依次排列的新特征,它们是原有特征的线性组合,并且新特征之间不相关, 我们计算出原有特征在新特征上的映射值即为新的降维后的样本。也就是说PCA的目标是用一组正交向量来对原特征进行变换得到新特征,新特征是原有特征的线性组合。
数据说明,样本集为已经经过中心化后的数据, X={x1,x2,...,xn} X = { x 1 , x 2 , . . . , x n } ,其中 xi x i 为p维列向量,共有n个样本,满足 ∑ni=1xi=0 ∑ i = 1 n x i = 0 。
用矩阵 A A 来表示一组正交列向量,并且为了归一化,令 aTiai=1 a i T a i = 1 ,
同时有 aTiaj=0,i≠j a i T a j = 0 , i ≠ j 。
若原样本有 p p 维特征,即原向量 xi={xi1,xi2,...,xip} x i = { x 1 i , x 2 i , . . . , x p i } ,则经过变换后得到新的样本向量 ξi=ATxi ξ i = A T x i
展开即为 ξij=aTjxi=∑pt=1ajtxit ξ j i = a j T x i = ∑ t = 1 p a j t x t i 。 (2)
一. 推导矩阵 A A 的计算方法,即各向量 ai a i 的计算方法。
1. 计算 a1 a 1
我们先考虑第一个新特征上的值 ξi1=∑pj=1a1jxij ξ 1 i = ∑ j = 1 p a 1 j x j i ,这个式子表示的是将原向量 xi x i 投影到向量 a1=[a11,a12,...,a1p] a 1 = [ a 11 , a 12 , . . . , a 1 p ] 上得到值 ξi1 ξ 1 i ,即第一个特征值为原向量在第一个变换向量 a1 a 1 上的投影值。
我们的目标是使得样本集 X={x1,x2,...,xn} X = { x 1 , x 2 , . . . , x n } 在向量 a1 a 1 上的投影值 ξ1={ξ11,ξ21,...,ξn1} ξ 1 = { ξ 1 1 , ξ 1 2 , . . . , ξ 1 n } 的方差最大,也就是当将样本集 X X 投影到向量 a1 a 1 上后,不同样本间的区分度最大,使得不同样本在该向量上可分。
ξ1 ξ 1 的方差:
注:因为样本已经经过中心化,所以 E(aT1x)=aT1E(x)=0 E ( a 1 T x ) = a 1 T E ( x ) = 0
其中 ∑ ∑ 表示样本集的协方差矩阵, ∑=1nXXT ∑ = 1 n X X T 。
现在我们将问题变成了一个优化问题,即
这是一个带约束的极值问题,将其转换为拉格朗日对偶问题:
上式对 a1 a 1 求偏导,得到:
所以, a1 a 1 是协方差矩阵 ∑ ∑ 的特征向量, v1 v 1 为对应的特征值。
显然为使 var(ξ1) v a r ( ξ 1 ) 最大,我们只需要选择 v1 v 1 为协方差矩阵 ∑ ∑ 的最大特征值:
即对协方差矩阵 ∑ ∑ 的p个特征值排序, λ1≥λ2≥...≥λp λ 1 ≥ λ 2 ≥ . . . ≥ λ p
有 v1=λ1 v 1 = λ 1 ,向量 a1 a 1 为对应的特征向量。
现在 a1 a 1 已知,则根据式(2)就可以得到各个原样本 x x 在 a1 a 1 上的投影值,即对应的 ξ1 ξ 1 。
2. 计算 a2 a 2
一般来讲,我们在进行降维时不会只保留一维特征,为了得到计算变换向量 ai a i 的一般规律,我们计算 a2 a 2 ,根据 a2 a 2 就可知道原向量在该向量上的投影,从而得到原向量在第二个主成分特征上的值 ξ2 ξ 2 。
同理,为了使得样本集中所有原向量在第二个主成分上的值 ξ2={ξ12,ξ22,...,ξ2n} ξ 2 = { ξ 2 1 , ξ 2 2 , . . . , ξ n 2 } 方差最大,即可分性最大。
ξ2 ξ 2 的方差:
转换为优化问题:
转换为拉格朗日对偶问题:
f(a2) f ( a 2 ) 对 a2 a 2 求偏导:
所以,
且,
所以,为使 var(ξ2) v a r ( ξ 2 ) 最大,即使 v2 v 2 最大即可。前面已提到, v2 v 2 为协方差矩阵的特征值,
对协方差矩阵 ∑ ∑ 的p个特征值排序, λ1≥λ2≥...≥λp λ 1 ≥ λ 2 ≥ . . . ≥ λ p ,已有 v1=λ1 v 1 = λ 1 ,所以选择 v2=λ2 v 2 = λ 2 即为最优解。
到这里,我们似乎已经摸索出了某种规律。可以从理论上证明,第k个主成分方向就是协方差矩阵 ∑ ∑ 的第k大的特征值 λk λ k 对应的特征向量。
结论:协方差矩阵为 p×p p × p 维的二维矩阵,特征值不多于 p p 个,所以通过PCA方法,可以将原有的p维向量通过矩阵A映射到 k(k≤p) k ( k ≤ p ) 维空间。矩阵 A=[a1,a2,...,ak] A = [ a 1 , a 2 , . . . , a k ] , ai(i=1,2,...,k) a i ( i = 1 , 2 , . . . , k ) 为p维列向量,且若将协方差矩阵 ∑ ∑ 的p个特征值排序, λ1≥λ2≥...≥λp λ 1 ≥ λ 2 ≥ . . . ≥ λ p , ai a i 为 λi λ i 对应的特征向量。
二. PCA算法的实现流程
(假设数据未进行中心化):
输入数据 X={x1,x2,...,xn}p×n,n X = { x 1 , x 2 , . . . , x n } p × n , n 个 p p 维的列向量。
1.数据中心化: μ=1n∑ni=1xi,xi=xi−μ,i=1,2,...,n μ = 1 n ∑ i = 1 n x i , x i = x i − μ , i = 1 , 2 , . . . , n
2.计算协方差矩阵 ∑=1nXXT,(X ∑ = 1 n X X T , ( X 为中心化后的数据), ∑ ∑ 为 p×p p × p 维对称矩阵
3.对协方差矩阵 ∑ ∑ 进行特征值分解,得到特征值 λ1≥λ2≥...≥λp λ 1 ≥ λ 2 ≥ . . . ≥ λ p ,选择前 k k 个特征值所对应的特征向量,构成投影矩阵 A=[a1,a2,...,ak] A = [ a 1 , a 2 , . . . , a k ] , ai a i 为 p p 维列向量
4.将原样本投影到新的特征空间,得到新的降维样本, X′=WTX X ′ = W T X , X′ X ′ 为 p×n p × n 维矩阵。
三. 几点说明
1.如何选择k
使用降维算法我们都是希望能够将数据尽可能降到低维的空间,这样便于后续的分类等算法的实现。但是为了保证数据的主要内容不会丢失,又不可降到太低的维度。如果取前k个主成分(一个特征向量 ai a i 即为一个主成分),这k个主成分所代表的数据全部方差的比例为:
在实际通过程序选择k时,可以先设定好新特征所能代表的数据总方差的比例,比如 80% 80 % 或者 90% 90 % ,然后再选择满足条件的k值。一般来讲,数据中的大部分信息主要集中前几个较少的主成分上。
下图为一次主成分分析所得到特征值的分布,可以看到前面几个特征值较大但衰减速度很快,而到后面的特征值基本都很小,衰减也很慢。有的方法推荐选择拐点来作为k值,比如下图中选择k=3。
2.从新的特征空间回到原空间
从向量 ξ ξ 回到原空间样本(中心化),
若回到最初为中心化的原样本,
只要k < < p, 则 x^ x ^ 就一定与原来的真实值存在误差,但一般来讲误差很小。
3.主成分分析理解
最常见的主成分分析都是用来对数据降维,选择较少的主成分来表示数据,可以有效减少后续的工作量,节省计算资源。另外主成分分析也可以用来进行数据的降噪。再特征值中排列较靠后的主成分(或称次成分)往往是数据中的随机噪声。如果把 ξ ξ 中对应特征值很小的成分置0,再用式(3)或式(4)反变换回原空间,就实现了对原始数据的降噪处理。
写在最后:至此,主成分分析方法就已介绍完毕。从上面的介绍内容中,我们可以发现,整个过程没有用到样本的类别信息。所以主成分分析是一种非监督算法,而对于分类问题,仅以方差大为目标似乎并不一定总是利于后续的分类,所以就产生了另一种常用的降维算法——K-L变换,它与PCA算法很类似,但是可以针对分类的目标进行特征提取,之后我会专门来介绍这种算法。