matlab中利用princomp实现PCA降维
在matlab中有函数princomp可以实现数据的降维,本文主要说明该函数的用法。
PCA的作用:
PCA(主成分分析法),主要用来对数据进行降维,比如在机器学习中,我们提取了大量的特征,并针对这些特征进行分类,这些特征的维度很高,在利用SVM进行分类的时候会消耗大量的时间,PCA降维是将这些特征映射到另一个空间里面,并且去除数据冗余。
假设有样本m个。每个样本提取n维特征,构成一个m*n维的矩阵X,降维之后的矩阵为Y, 在降维的过程中需要满足以下两个条件:
(a) Y的维度小于X的维度;
(b) Y的各个维度之间的差异越大越好(差异越大,表示数据的冗余越小,这也是可以降维的基本条件);
PCA原理
- 首先衡量
X(m*n)
中各维特征之间的相关性,通过计算X中各列之间的协方差构成协方差矩阵D(n*n)=X'X,其中X'是X的转置,注意这里的X是零均值化之后的X
,为了实现数据的降维,我们希望数据之间的相关性越小越好,也就是去掉那些相关性较高的冗余数据,换个角度也就是说希望协方差矩阵D
是一个对角阵; - 现在假设有一个转换矩阵
P
,将X
映射到另一个空间得到Y
,即Y=XP
,使得转换之后的Y
的协方差矩阵D1是一个对角阵,即:
D1=Y'Y=(XP)'(XP)=P'X'XP=P'DP
- 1
也就是已知D1
是对角阵,D
是X
的协方差矩阵,PCA问题就转换成一个实对称矩阵的对角化问题,利用相关的矩阵知识可以求解得到P。其实P就是由D的特征向量组成。
PCA降维的步骤
还是假设有m个样本,每个样本的特征用n维表示,生成矩阵A(m*n)
1. 将A的每一列进行零均值化,即用每一列的数据减去该列的均值得到矩阵X
;
2. 计算协方差矩阵D=X'X
;
3. 计算协方差矩阵D
的特征值与特征向量;
4. 将特征向量按照对应特征值的大小按列排列生成矩阵P’;
5. 假设我们要将n
维的向量降维成k
维,只需要取P’的前k列构成矩阵P;
6. 求解降维后的数据Y=XP
;
princomp的用法
- 函数声明:
[COEFF,SCORE] = princomp(X)
[COEFF,SCORE,latent] = princomp(X)
[COEFF,SCORE,latent,tsquare] = princomp(X)
[...] = princomp(X,'econ')
- 1
- 2
- 3
- 4
- 参数说明
- X
X是m*n的矩阵,其中m是样本个数,n是特征维数 - COEFF
COEFF是n*n矩阵,由X的协方差矩阵的特征向量构成,其中的特征向量是按照特征向量对应的特征值递减的顺序排列。 - SCORE
SCORE是m*n的矩阵,其大小与X相同,是原矩阵在主成分空间的表达 - Latent
X的协方差矩阵D的特征值构成的n维向量,其中元素是按照特征值的大小进行排列的,其实就是上面分析中提到的P矩阵 - tsquare
不懂,如下是matlab中关于该返回参数的说明:
[COEFF,SCORE,latent,tsquare] = princomp(X) returns tsquare, which contains Hotelling's T2 statistic for each data point.
- 1
- 举例说明
matlab命令行输入:
>>X =
1 2 3 5 1
4 5 6 5 1
1 8 7 10 2
2 4 6 15 3
>>[pc,sco,lat]=princomp(X)
pc =
-0.0633 0.1379 0.9173 -0.3321 -0.1588
0.1902 0.8279 -0.2886 -0.3985 -0.1906
0.2114 0.4770 0.2679 0.7307 0.3494
0.9381 -0.2558 0.0577 -0.0176 -0.2258
0.1876 -0.0512 0.0115 -0.4435 0.8748
sco =
-4.6466 -2.6095 -1.0183 0 0
-3.6317 1.7189 1.6715 0 0
2.2178 2.9357 -1.3785 0 0
6.0605 -2.0451 0.7254 0 0
lat =
25.4760
7.5216
2.0857
0
0
%%如下是验证返回值score确实是X在主成分空间的表示
>> pc1=pc(:,1:3)%%后两列的特征值为0,说明是冗余
pc1 =
-0.0633 0.1379 0.9173
0.1902 0.8279 -0.2886
0.2114 0.4770 0.2679
0.9381 -0.2558 0.0577
0.1876 -0.0512 0.0115
>> sco2=A*pc1
sco2 =
5.8292 1.8946 1.4437
6.8441 6.2230 4.1335
12.6936 7.4399 1.0835
16.5362 2.4591 3.1874
%%显然sco2与sco是一致的,从这个例子也能看出,X中各列之间是有线性相关的,通过PCA降维,可以将X转化到另外的空间,并且消除冗余。
- 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
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 如何降维?
利用princomp函数可以得到原始数据X的协方差矩阵D按特征递减排序的特征向量构成的矩阵COEFF,并且能得到特征值排序构成的向量Latent,假设我们在降维之后要保留90%的信息,只需要累加按从大到小的顺序累加latent中的元素,当前k个元素和占比整个latent元素和的90%以上时候停止,取COEFF前k列构成投影矩阵P,利用公式Y=XP就可以得到X降维之后的结果。
- 测试集如何降维?
训练集降维的时候,可以采用上述方法实现,测试集的降维与训练集不一样,因为我们对于模型来说,是在训练集上进行训练的,所以如果要使用这个模型对测试集进行测试,那么就需要利用相同的处理将测试集中的数据也变换到与降维后训练集数据相同的数据空间中。具体来说就是在对测试集降维的时候,在第一步数据零均值化的过程中,要减去的是训练集中相对应向量的均值,然后在乘以训练集的COEFF投影矩阵。