PCA——主成分分析

介绍

主成分分析是一种降维算法,它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,其能反映出原始数据的大部分信息。一般来说,当研究的问题涉及到多变量且变量之间存在很强的相关性时,我们可考虑使用主成分分析的方法来对数据进行简化

例子

某人做一件上衣要测量很多尺寸,如身长,袖长,胸围,腰围,肩宽,肩厚等十几项指标,但某服装厂要生产一批新型服装绝不可能把尺寸的型号分得过多,而是从多种指标中综合成几个少数的综合指标,作为分类的型号,利用主成分分析将十几项指标综合成3项指标,一项是反映长度的指标,一项是反映胖瘦的指标,一项是反映特殊体型的指标。

思想

假设有 n n n个样本, p p p个指标,则可构成大小为 n × p n\times p n×p的样本矩阵 x x x:
x = ∣ x 11 x 12 ⋯ x 1 p x 21 x 22 ⋯ x 2 p ⋮ ⋮ ⋮ ⋮ x n 1 x n 2 ⋯ x n p ∣ x=\left| \begin{matrix} x_{11} &x_{12}& \cdots & x_{1p}\\ x_{21} & x_{22} & \cdots & x_{2p}\\ \vdots & \vdots & \vdots & \vdots\\ x_{n1} & x_{n2} & \cdots & x_{np} \end{matrix} \right| x= x11x21xn1x12x22xn2x1px2pxnp
假设我们想找到新的一组变量 z 1 , z 2 , ⋯   , z m ( m ≤ p ) z_1,z_2,\cdots,z_m(m \leq p) z1,z2,,zm(mp),且它们满足:
{ z 1 = l 11 x 1 + l 12 x 2 + ⋯ + l 1 p x p z 2 = l 21 x 1 + l 21 x 2 + ⋯ + l 2 p x p ⋮ z m = l m l x 1 + l m 2 x 2 + ⋯ + l m p x p \begin{cases} z_1=l_{11}x_1+l_{12}x_2+\cdots+l_{1p}x_p\\ z_2=l_{21}x_1+l_{21}x_2+\cdots+l_{2p}x_p\\ \vdots \\ z_m=l_{ml}x_1+l_{m2}x_2+\cdots+l_{mp}x_p \end{cases} z1=l11x1+l12x2++l1pxpz2=l21x1+l21x2++l2pxpzm=lmlx1+lm2x2++lmpxp
系数l_{ij}的确定原则:
(1) z i z_i zi z j ( i ≠ j , j = 1 , 2 , ⋯   , m ) z_j(i \neq j,j=1,2,\cdots,m) zj(i=j,j=1,2,,m)相互无关;
(2) z 1 z_1 z1 x 1 , x 2 , ⋯   , x p x_1,x_2,\cdots,x_p x1,x2,,xp的一切线性组合中方差最大者;
(3) z 2 z_2 z2是与 z 1 z_1 z1不相关的 x 1 , x 2 , ⋯   , x p x_1,x_2,\cdots,x_p x1,x2,,xp的所有线性组合中方差最大者;
(4)依次类推, z m z_m zm是与 z 1 , z 2 , ⋯   , z m − 1 z_1,z_2,\cdots,z_{m-1} z1,z2,,zm1不相关的 x 1 , x 2 , ⋯   , x p x_1,x_2,\cdots,x_p x1,x2,,xp的所有线性组合中方差最大者;
(5)新变量指标 z 1 , z 2 , ⋯   , z m z_1,z_2,\cdots,z_m z1,z2,,zm分别称为原变量指标 x 1 , x 2 , ⋯   , x p x_1,x_2,\cdots,x_p x1,x2,,xp的第一,第二,…,第m主成分

计算步骤

标准化处理

按列计算均值 x ‾ = 1 n ∑ i = 1 n x i j \overline{x}=\frac{1}{n} \sum_{i=1}^n x_{ij} x=n1i=1nxij和标准差 S j = ∑ i − 1 n ( x i j − x j ‾ ) n − 1 S_j=\sqrt{\frac{\sum_{i-1}^n(x_{ij}-\overline{x_j})}{n-1}} Sj=n1i1n(xijxj) 计算得标准化数据 X i j = x i j − x j ‾ S j X_{ij}=\frac{x_{ij}-\overline{x_j}}{S_j} Xij=Sjxijxj,原始样本矩阵经过标准化变为
X = ∣ X 11 X 12 ⋯ X 1 p X 21 X 22 ⋯ X 2 p ⋮ ⋮ ⋮ ⋮ X n 1 X n 2 ⋯ X n p ∣ = ( X 1 , X 2 , ⋯   , X p ) X=\left| \begin{matrix} X_{11} &X_{12}& \cdots & X_{1p}\\ X_{21} & X_{22} & \cdots & X_{2p}\\ \vdots & \vdots & \vdots & \vdots\\ X_{n1} & X_{n2} & \cdots & X_{np} \end{matrix} \right|=(X_1,X_2,\cdots,X_p) X= X11X21Xn1X12X22Xn2X1pX2pXnp =(X1,X2,,Xp)

计算标准化样本的协方差矩阵

R = ∣ r 11 r 12 ⋯ r 1 p r 21 r 22 ⋯ r 2 p ⋮ ⋮ ⋮ ⋮ r p 1 r p 2 ⋯ r p p ∣ R=\left| \begin{matrix} r_{11} &r_{12}& \cdots & r_{1p}\\ r_{21} & r_{22} & \cdots & r_{2p}\\ \vdots & \vdots & \vdots & \vdots\\ r_{p1} & r_{p2} & \cdots & r_{pp} \end{matrix} \right| R= r11r21rp1r12r22rp2r1pr2prpp
其中 r i j = 1 n − 1 ∑ k = 1 n ( X k i − X i ‾ ) ( X k j − X j ‾ ) = 1 n − 1 ∑ k = 1 n X k i X k j r_{ij}=\frac{1}{n-1}\sum_{k=1}^n(X_{ki}-\overline{X_i})(X_{kj}-\overline{X_j})=\frac{1}{n-1}\sum_{k=1}^nX_{ki}X_{kj} rij=n11k=1n(XkiXi)(XkjXj)=n11k=1nXkiXkj
注意:上面12两步可直接合并为一步:直接计算x矩阵的样本相关系数矩阵)
R = ∑ k = 1 n ( x k i − x i ‾ ) ( x k j − x j ‾ ) ∑ k = 1 n ( x k i − x i ‾ ) 2 ∑ k = 1 n ( x k j − x j ‾ ) 2 R=\frac{\sum_{k=1}^n(x_{ki}-\overline{x_i})(x_{kj}-\overline{x_j})}{\sum_{k=1}^n(x_{ki}-\overline{x_i})^2\sum_{k=1}^n(x_{kj}-\overline{x_j})^2} R=k=1n(xkixi)2k=1n(xkjxj)2k=1n(xkixi)(xkjxj)

计算R的特征值和特征向量

特征值: λ 1 ≥ λ 2 ≥ ⋯ ≥ λ p ≥ 0 ( R \lambda_1\geq\lambda_2\geq\cdots\geq\lambda_p\geq0(R λ1λ2λp0(R是半正定矩阵,且 t r ( R ) = ∑ k = 1 p λ k = p ) tr(R)=\sum_{k=1}^p\lambda_k=p) tr(R)=k=1pλk=p)
特征向量:
a 1 = ∣ a 11 a 21 ⋮ a p 1 ∣ , a 2 = ∣ a 12 a 22 ⋮ a p 2 ∣ , ⋯   , a p = ∣ a 1 p a 2 p ⋮ a p p ∣ a_1=\left| \begin{matrix} a_{11}\\ a_{21}\\ \vdots\\ a_{p1} \end{matrix} \right|, a_2=\left| \begin{matrix} a_{12}\\ a_{22}\\ \vdots\\ a_{p2} \end{matrix} \right|, \cdots, a_p=\left| \begin{matrix} a_{1p}\\ a_{2p}\\ \vdots\\ a_{pp} \end{matrix} \right| a1= a11a21ap1 ,a2= a12a22ap2 ,,ap= a1pa2papp

计算主成分贡献率以及累计贡献率

贡献率= λ i ∑ k = 1 p λ k ( i = 1 , 2 , ⋯   , p ) \frac{\lambda_i}{\sum_{k=1}^p\lambda_k}(i=1,2,\cdots,p) k=1pλkλi(i=1,2,,p)
累计贡献率= ∑ k = 1 i λ k ∑ k = 1 p λ k ( i = 1 , 2 , ⋯   , p ) \frac{\sum_{k=1}^i\lambda_k}{\sum_{k=1}^p\lambda_k}(i=1,2,\cdots,p) k=1pλkk=1iλk(i=1,2,,p)

写出主成分

一般取累计贡献率超过 80 80 80%的特征值所对应的第一、第二、…、第 m ( m ≤ p ) m(m \leq p) m(mp)个主成分,第i主成分: F i = a 1 i X 1 + a 2 i X 2 + ⋯ + a p i X p ( i = 1 , 2 , ⋯   , m ) F_i=a_{1i}X_1+a_{2i}X_2+\cdots+a_{pi}X_p(i=1,2,\cdots,m) Fi=a1iX1+a2iX2++apiXp(i=1,2,,m)

根据系数分析主成分代表的意义

对于某个主成分而言,指标前面的系数越大,代表该指标对于该主成分的影响越大

利用主成分的结果进行后续的分析

(1)主成分得分:可用于评价类模型吗?(千万别用!!!)
(2)主成分可用于聚类分析(方便画图)
(3)主成分可用于回归分析

例题

PCA——主成分分析_第1张图片
PCA——主成分分析_第2张图片
F 1 = 0.469 X 1 + 0.404 X 2 + 0.394 X 3 + 0.408 X 4 + 0.337 X 5 + 0.427 X 6 F_1=0.469X_1+0.404X_2+0.394X_3+0.408X_4+0.337X_5+0.427X_6 F1=0.469X1+0.404X2+0.394X3+0.408X4+0.337X5+0.427X6
F 2 = − 0.365 X 1 − 0.397 X 2 + 0.397 X 3 − 0.365 X 4 + 0.569 X 5 + 0.308 X 6 F_2=-0.365X_1-0.397X_2+0.397X_3-0.365X_4+0.569X_5+0.308X_6 F2=0.365X10.397X2+0.397X30.365X4+0.569X5+0.308X6
F 3 = 0.092 X 1 + 0.613 X 2 − 0.279 X 3 − 0.705 X 4 + 0.164 X 5 + 0.119 X 6 F_3=0.092X_1+0.613X_2-0.279X_3-0.705X_4+0.164X_5+0.119X_6 F3=0.092X1+0.613X20.279X30.705X4+0.164X5+0.119X6
X i X_i Xi均是标准化后的指标, x i x_i xi:身高、坐高、胸围、手臂长、肋围和腰围
第一主成分 F 1 F_1 F1对所有(标准化)原始变量都有近似相等的正载荷,故称第一主成分为(身材)大小成分
第二主成分 F 2 F_2 F2 X 3 , X 5 , X 6 X_3,X_5,X_6 X3,X5,X6上有中等程度的正载荷,而在 X 1 , X 2 , X 4 X_1,X_2,X_4 X1,X2,X4上有中等程度的负载荷,称第二主成分为形状成分(或胖瘦成分)。
第三主成分 F 3 F_3 F3 X 2 X_2 X2上有大的正载荷,在 X 4 X_4 X4上有大的负载荷,而在其余变量上的载荷都较小,可称第三主成分为臂长成分
注:由于第三主成分的贡献率不高(7.65%)且实际意义也不太重要,因此我们也可以考虑只取前两个主成分进行分析

主成分分析的说明

在主成分分析中,我们首先应保证所提取的前几个主成分的累计贡献率达到一个较高的水平,其次对这些被提取的主成分必须都能够给出符合实际背景和意义的解释
PCA——主成分分析_第3张图片
主成分分析时变量降维的一种重要、常用的方法,简单的说,该方法要应用得成功,一是靠原始变量的合理选取,二是靠“运气”

代码

%% 第一步:对数据x标准化为X
X=zscore(x);
%% 第二步:计算样本协方差矩阵
R=cov(X);
%% 注意:以上两步可合并为下面一步:直接计算样本相关系数矩阵
%% R=corrcoef(x);
%% 第三步:计算R的特征值和特征向量
[V,D]=eig(R); % V特征向量矩阵,D特征值构成的对角矩阵
%% 第四步:计算主成分贡献率和累计贡献率
lambda=diag(D); % diag函数用于得到一个矩阵的主对角线元素值(返回的是列向量)
lambda=lambda(end:-1:1);% 因为lambda向量是从小到大排序的,我们将其调个头
% 计算贡献率
contribution_rate=lambda/sum(lambda);
% 计算累计贡献率 cumsum是求累加值的函数
cum_contribution_rate=cumsum(lambda)/sum(lambda);
% 注意:这里的特征向量要和特征值一一对应,之前特征值相当于颠倒过来了,因此特征向量的各列需要颠倒过来
% rot90函数可以使一个矩阵逆时针旋转90度,然后再转置,就可以实现将矩阵的列颠倒的效果
V=rot90(V)';

你可能感兴趣的:(数学建模,算法,matlab)