说明:下文中,粗斜体字母均表示矩阵(如
A);为不引起歧义,列向量也均加箭头表示(如
a
)
概述
PCA的目的
假设现在有这样一个情景:现在要统计并可视化分析男大学生体测成绩,如果只参考立定跳远和1000m成绩两项指标,我们可以以立定跳远成绩作为
x轴,1000m成绩作为
y轴做出散点图,每个点代表一个学生;若统计三项指标,我们也可以在三维空间中做出散点图;但如果要统计四项乃至更多的指标,我们就无法再以此方法进行数据的可视化。
而主成分分析(Principal Component Analysis,PCA)的方法,可以将具有多个观测变量的高维数据集降维,使人们可以从事物之间错综复杂的关系中找出一些主要的方面,从而能更加有效地利用大量统计数据进行定量分析,并可以更好地进行可视化、回归等后续处理。
PCA的几何意义
先将问题简化为二维情形。有
N个样品,具有两个观测变量
X1, X2,做出散点图(如下图中的蓝色点),这样,在由
X1, X2组成的坐标空间中,
N个样品的分布情况如带状。现在问:如果现在要将两个观测变量缩减为一个,应该如何选取?
可以直观地看出,这
N个样品无论沿
X1轴还是沿
X2轴方向,均有较大的离散性(其离散程度可以分别用观测变量
X1的方差和
X2的方差定量表示),也就是说,只考虑
X1, X2的其中一个,原始数据均会有较大损失。
现在考虑以下线性组合,变换坐标空间:
{T1=X1cosθ+X2sinθT2=−X1sinθ+X2cosθ
即
[T1T2]=[X1X2][cosθsinθ−sinθcosθ]=[X1X2]W(1)
式中
W为旋转变换矩阵,有如下性质:
-
W的第
i列组成的列向量(也就是后面将要提到的特征向量),代表的就是新坐标空间的基底
Ti在原坐标空间中的坐标,且其为单位向量;
-
W为正交阵,即满足:
WTW=I。
经过旋转,
N个数据点在
T1轴上的离散程度最大,因而变量
T1代表了原始数据的绝大部分信息,这样,即使不考虑变量
T2也不会损失太多数据信息。这个
T1即为第一主成分(Principal Component 1,PC1),如图中箭头所示。若将所有数据点投影到
T1轴上(图中橙色点),就得到了降维后的数据。若有多个主成分,则:
- 这些主成分之间相互独立,即没有重叠的信息,亦即这些特征向量之间正交,
cov(Ti,Tj)=0,i=j;
- 主成分的方差依次递减,
var(T1)≥var(T2)≥⋯
也就是说,PCA并不会对原有数据做任何的改变,而只是将“观看”原有数据的视角转换了,即,在原有数据空间中的数据的相对位置,与在主成分空间(Principal Component Space)中的相对位置是完全相同的,相当于只是更换了原有数据的基底。
原理与步骤简述
算法一:特征分解(Eigen Decomposition)
假设有一
n×m维的数据矩阵
A=⎣⎢⎢⎢⎡a
1Ta
2T⋮a
nT⎦⎥⎥⎥⎤,其中
n为样本量,
m为观测变量的数量。PCA的步骤如下:
-
先对
A进行中心化(整体平移数据,使数据中心在
(0,0)):
- 对
A求列上的平均值:
a
T=n1∑i=1na
iT(结果为一行向量);
- 记
Aˉ=⎣⎢⎢⎢⎡11⋮1⎦⎥⎥⎥⎤a
T=⎣⎢⎢⎢⎡a
Ta
T⋮a
T⎦⎥⎥⎥⎤;
- 中心化后的数据矩阵
X=A−Aˉ(
n×m维)。
-
计算
X的协方差矩阵
C:
C=XTX(2)
-
对
X做特征分解,即求解特征方程
∣C−λI∣=0(3)
可得到
m个特征值(Eigenvalues)
λi。再解方程
(C−λiI)w
i=0(4)
其中
w
i=⎣⎢⎢⎢⎡w1iw2i⋮wmi⎦⎥⎥⎥⎤,i=1,2,⋯,m,得到
m个特征向量(Eigenvectors)
w
i,将它们组成矩阵
W。可以验证,
∑j=1mwji=1。
-
将特征值降序排列,其对应的特征向量也排列到对应位置(调换
W的列)。我们这样做的原因是,
var(Ti)=λi。
进行特征还原:
T=XW(5)
其中:
-
T,
n×m维,称为主成分得分(principal component scores),即为新坐标空间中的数据点
-
W,
m×m维,为特征向量组成的矩阵(称为loadings)
-
我们可以只取
W的前
r列,即将
m×m维矩阵缩减为
m×r维矩阵,记作
Wr,则有:
Tr=XWr(6)
Tr同样为
T从
n×m维缩减为
n×r维的结果,相当于将原有的
m个观测变量缩减为最主要的
r个,即达到了我们的目的——降维。
算法二:奇异值分解(Singular Value Decomposition,SVD)
对矩阵
X进行奇异值分解:
X=UΣV∗=UΣVT
其中:
-
U(
n×n 维),
V(
m×m 维)分别称为左奇异向量和右奇异向量;
-
V∗表示矩阵
V的共轭转置矩阵,因为
X为实数矩阵,所以可写为
V∗=VT;
-
Σ为一矩形对角矩阵(
n×m维),其对角线元素称为奇异值(singular value)。
在PCA的问题中恒有:
W=V。与
W相似,
V具有以下性质:
-
Σ的对角线元素也满足
σ1>σ2>⋯,即,也是降序排列的;
-
U和
V的第
i列,对应于
Σ的第
i个元素(第
i大元素)
σi;
-
U和
V满足:
U∗U=I,
V∗V=I。
故,公式
(5)可写为:
T=XW=XV=UΣV∗V=UΣ
即:
T=UΣ(7)
我们同样可以对
Σ只取第一个
r×r的块,记作
Σr,相应地
U也只取前
r列,记作
Ur,则有
Tr=UrΣr(8)
r的选取标准
计算方差的累积贡献率:
f(k)=∑i=1mλi∑i=1iλk,k=1,2,⋯(9)
作出其图像。因为
λ1>λ2>⋯,故
f(k)为一单调递增的函数,且其递增速度随着
k增加逐渐降低。
一般地,我们可以取使得
f(r)≥某一阈值(如
95%)的最小的
r,这样最多只会损失掉5%的方差。
对于SVD法,将公式
(9)中的
λ换为
σ即可。
两种算法的比较
在采用特征分解法时,我们无法避免计算
XTX,而在观测变量数
m非常大时,这一算法的劣势将被无限放大(协方差矩阵为
m×m维)。
而采用SVD算法,则只需要计算
Tr=UrΣr,而
Σr为对角阵,显然这一算法的计算量要小很多(这一点类似于DFT与FFT之间的比较)。默认情况下,MATLAB中的pca
函数也会使用SVD算法。
MATLAB的实现方法
我们先载入MATLAB自带的数据集fisheriris
(该数据集统计了三种鸢尾花的花萼长、花萼宽、花瓣长、花瓣宽),然后进行中心化处理,并计算协方差矩阵:
load fisheriris;
X = meas; % n = 150, m = 4
% 中心化
meanX = ones(size(X,1), 1) * mean(X);
centredX = X - meanX;
C = cov(centredX); % 直接调用cov直接计算协方差矩阵即可
特征分解法:利用eig
函数
[W, Lambda] = eig(C); % W是特征向量组成的矩阵(4×4),Lambda是特征值组成的对角矩阵
ev = (diag(Lambda))'; % 提取特征值
ev = ev(:, end:-1:1); % eig计算出的特征值是升序的,这里手动倒序(W同理)
W = W(:, end:-1:1);
sum(W.*W, 1) % 可以验证每个特征向量各元素的平方和均为1
Wr = W(:, 1:2); % 提取前两个主成分的特征向量
Tr = centredX * Wr; % 新坐标空间的数据点
% 作图
figure;
stairs(cumsum(ev)/sum(ev), 'LineWidth',1.5);
axis([1 4 0 1]);
xlabel('$ k $', 'Interpreter', 'latex');
ylabel('$ f(k)=\frac{\sum _{i=1}^i \lambda_k}{\sum_{i=1}^m \lambda_i} $',...
'Interpreter', 'latex');
hold on;
plot([1 4], [0.95 0.95], '--'); % 从图中可以看出,取r = 2即可
figure;
scatter(Tr(:,1), Tr(:,2), 130, categorical(species), '.');
colormap(winter);
xlabel('Principal Component 1');
ylabel('Principal Component 2');
SVD法:利用svd
函数
[U, Sigma, V] = svd(X); % 可以检验,W和V完全相同(向量的正负号不影响)
Vr = V(:, 1:2); % 提取前两个主成分的特征向量
Tr = X * Vr; % 新坐标空间的数据点
% 画图部分同上,略
利用pca
函数
pca
的常用调用格式如下:
[loadings, scores] = pca(X, 'NumComponents', r);
其中:
loadings
为
Wr矩阵(
m×r维),即主成分系数;
scores
为
Tr矩阵(
n×r维);
eigenvalues
为所有特征值组成的列向量。
且默认情况下,pca
会自动将数据X
中心化。
在本例中,我们可以略去中心化的步骤,直接调用该函数:
[Wr, Tr, ev] = pca(X, 'NumComponents',2);
% 画图部分略
应用
聚类分析
如上面鸢尾花的例子中,降维后的数据仍可以清晰地分为三类。这样,当我们拿到一种鸢尾花,计算相应的
T1和
T2,将结果画在散点图中,我们就可以判断出其属于哪一种鸢尾花。
例如,我们在电商平台浏览并购买商品时,平台就会收集你的年龄、性别、购买商品平均价格、购买频率、最初浏览商品直到最终购买之间的时间间隔等等大量、多维度的信息,然后进行降维,将你归于“大学生”“白领”“一家三口”等类别,然后定向为你推送促销商品的通知。
图像压缩
假设有一张
n×m的图片
X,根据
(6)式,我们可以利用矩阵
Wr将其降至
n×r维。如果我们只传输
Tr和
Wr,就可以反推还原出
X,而压缩比可达
r(n+m)nm≤2rnm
人脸检测与匹配
假设有
n个人脸训练样本,每个样本共
m个像素,每个样本由其像素灰度值展开组成一个行向量,按列组成矩阵
X。
同样先求其平均向量(称为“平均脸”),中心化后求协方差矩阵,并进行特征分解。任何一幅人脸图像都可以变换到主成分空间,得到“特征脸”(Eigenfaces)。
这样,若将待识别的人脸做同样的变换,遍历已有的特征脸中,寻找最为接近的特征脸,即完成了匹配。