数据压缩(二)——主成分分析(步骤应用代码实现)

主成分分析是把多个变量进行数学降维组成新的彼此互不相干的代表性变量,但能代表原始变量的大部分信息。数学上采用的方法为将原来的变量做线性组合,选取方差最大的第一主成分记作F1,若F1无法代表全部的原始信息,再选取F2,以此类推。

数学模型

x = ( x 1 , x 2 , . . . , x p ) x=(x_1,x_2,...,x_p) x=(x1,x2,...,xp)
x j = ( x 1 j , x 2 j , . . . , x n j ) , j = 1 , 2 , . . . , p x_j=(x_{1j},x_{2j},...,x_{nj}),j=1,2,...,p xj=(x1j,x2j,...,xnj),j=1,2,...,p
把p个变量,变成新的p个变量
F j = a j 1 ∗ x 1 + a j 2 ∗ x 2 + . . . + a j p ∗ x p , j = 1 , 2 , . . . , p F_j=a_{j1}*x_1+a_{j2}*x_2+...+a_{jp}*x_p,j=1,2,...,p Fj=aj1x1+aj2x2+...+ajpxp,j=1,2,...,p

满足条件:

  1. F i , F j F_i,F_j Fi,Fj互不相干, i ≠ j , j = 1 , 2 , . . . , p i≠j,j=1,2,...,p i=j,j=1,2,...,p
  2. F 1 > F 2 > . . . > F p F_1>F_2>...>F_p F1>F2>...>Fp
  3. a j 1 2 + a j 2 2 + . . . + a j p 2 = 1 a_{j1}^2+a_{j2}^2+...+a_{jp}^2=1 aj12+aj22+...+ajp2=1

主成分的导出

F i , F j F_i,F_j Fi,Fj互不相干, i ≠ j , j = 1 , 2 , . . . , p i≠j,j=1,2,...,p i=j,j=1,2,...,p

  • 主成分之间的协方差阵为对角阵,
  • F = A X F=AX F=AX,
    V a r ( F ) = V a r ( A X ) = ( A X ) ( A X ) ′ = A X X ′ A ′ = [ λ 1 λ 2 . . . λ p ] Var(F)=Var(AX)=(AX)(AX)'=AXX'A'=\begin{bmatrix} λ_1&&\\ &λ_2&\\&&...&\\&&&λ_p\end{bmatrix} Var(F)=Var(AX)=(AX)(AX)=AXXA=λ1λ2...λp
  • 原始数据协方差阵➡新的协方差阵=相关矩阵,即 V = R = X X ′ V=R=XX' V=R=XX
  • A A ′ = I AA'=I AA=I
    { ( r 11 − λ 1 ) a 11 + r 12 a 12 + . . . + r 1 p a 1 p = 0 ( r 11 − λ 1 ) a 11 + r 12 a 12 + . . . + r 1 p a 1 p = 0 . . . ( r 11 − λ 1 ) a 11 + r 12 a 12 + . . . + r 1 p a 1 p = 0 \begin{cases} (r_{11}-λ_1)a_{11}+r_{12}a{12}+...+r_{1p}a_{1p}=0\\ (r_{11}-λ_1)a_{11}+r_{12}a{12}+...+r_{1p}a_{1p}=0\\ ...\\ (r_{11}-λ_1)a_{11}+r_{12}a{12}+...+r_{1p}a_{1p}=0 \end{cases} (r11λ1)a11+r12a12+...+r1pa1p=0(r11λ1)a11+r12a12+...+r1pa1p=0...(r11λ1)a11+r12a12+...+r1pa1p=0
    列系数矩阵,求齐次解
    R − λ 1 I = 0 R-λ_1I=0 Rλ1I=0
    推得相关矩阵为对角矩阵,系数矩阵 I I I为正交矩阵。

步骤

step1:对原始数据进行标准化处理
x i j ∗ = x i j − x j ^ v a r ( x j ) , i = 1 , 2 , . . . , n , j = 1 , 2 , . . . , p x_{ij}^*=\frac{x_{ij}-\hat{x_j}}{\sqrt{var(x_j)}},i=1,2,...,n ,j=1,2,...,p xij=var(xj) xijxj^,i=1,2,...,n,j=1,2,...,p其中, x j ^ = 1 n ∑ i − 1 n x i j \hat{x_j}=\frac{1}{n}\sum_{i-1}^nx_{ij} xj^=n1i1nxij, v a r ( x j ) = 1 n − 1 ∑ i − 1 n ( x i j − x j ^ ) 2 var(x_j)=\frac{1}{n-1}\sum_{i-1}^{n}(x_{ij}-\hat{x_j})^2 var(xj)=n11i1n(xijxj^)2

step2:计算样本相关系数矩阵
R = ( r 11 r 12 ⋯ r 1 p r 21 r 22 ⋯ r 2 p ⋮ ⋮ ⋱ ⋮ r n 1 r n 2 ⋯ r n p ) ⇒ r i j = 1 n − 1 ∑ t − 1 n x t i x t j R=\begin{pmatrix} r_{11}& r_{12} & \cdots & r_{1p}\\ r_{21} & r_{22} & \cdots & r_{2p} \\ \vdots & \vdots & \ddots & \vdots \\ r_{n1}& r_{n2} & \cdots & r_{np} \\ \end{pmatrix} \Rightarrow r_{ij}=\frac{1}{n-1}\sum_{t-1}^nx_{ti}x_{tj} R=r11r21rn1r12r22rn2r1pr2prnprij=n11t1nxtixtj

step3:计算相关系数矩阵的特征值和特征向量

step4:选择主成分
选择标准为 贡 献 率 = λ i ∑ i − 1 p > 85 % 贡献率=\frac{λ_i}{\sum_{i-1}^p}>85\% =i1pλi85%

代码实现(matlab)

stdr=std(x);   %求各变量的标准差  
[n,m]=size(x);   %矩阵的行与列  
sddata=x./stdr(ones(n,1),:);   %标准化变换  
[p,princ,egenvalue]=princomp(sddata);  %调用主成分  
p=p(:,1:3);  %输出前3主成分系数  
sc=princ(:,1:3);   %前3主成分量
egenvalue;   %相关系数矩阵的特征值,即各主成分所占比例per=100*egenvalue/sum(egenvalue);   %各个主成分所占百分比

你可能感兴趣的:(数据压缩作业)