前段时间回顾PCA算法时,发现存在三种不同的求解形式。一种是直接通过求解中心化后的样本数据 X c e n t e r X_{center} Xcenter的SVD分解得到映射向量;一种是先求出 X c e n t e r X_{center} Xcenter的协方差矩阵 C C C,然后计算对称矩阵 C C C的特征分解,最后得到映射向量;最后一种(也是常用的一种)也是先求出 X c e n t e r X_{center} Xcenter的协方差矩阵 C C C,然后计算对称矩阵 C C C的SVD分解,最后得到映射向量。当时很困惑到底应该用哪种,哪种是最正确的做法,因此对相关的知识点进行了梳理,也就有了这篇笔记。
根据牵涉到的知识点,这篇笔记将先介绍随机变量的数字特征(期望、方差等)以及数理统计中常用的统计量(样本均值、样本方差),接着介绍特征值、特征向量和特征分解,然后介绍SVD分解,最后分析PCA的三种求解形式之间的关系。
设 X , Y X,Y X,Y都是一维随机变量。
数学期望: E [ X ] E[X] E[X]
方差: D [ X ] = V a r [ X ] = E [ ( X − E [ X ] ) 2 ] = E [ X 2 ] − ( E [ X ] ) 2 D[X]=Var[X]=E[(X-E[X])^2]=E[X^2]-(E[X])^2 D[X]=Var[X]=E[(X−E[X])2]=E[X2]−(E[X])2
协方差: C o v ( X , Y ) = E [ ( X − E [ X ] ) ( Y − E [ Y ] ) ] = E [ X Y ] − E [ X ] E [ Y ] Cov(X,Y)=E[(X-E[X])(Y-E[Y])]=E[XY]-E[X]E[Y] Cov(X,Y)=E[(X−E[X])(Y−E[Y])]=E[XY]−E[X]E[Y]. 反应 X X X与 Y Y Y相互间关系。
相关系数: ρ X Y = C o v ( X , Y ) D [ X ] ⋅ D [ Y ] \rho_{XY}=\frac{Cov(X,Y)}{\sqrt{D[X]\cdot \sqrt{D[Y]}}} ρXY=D[X]⋅D[Y]Cov(X,Y)
协方差矩阵(对称阵):
C = [ C o v ( X , X ) C o v ( X , Y ) C o v ( Y , X ) C o v ( Y , X ) ] C= \left[ \begin{matrix} Cov(X,X) & Cov(X,Y) \\ Cov(Y,X) & Cov(Y,X) \\ \end{matrix} \right] C=[Cov(X,X)Cov(Y,X)Cov(X,Y)Cov(Y,X)]
设 X i , Y i X_i, Y_i Xi,Yi都是一维数据,即 X i X_i Xi只有一个特征。
样本均值: X ‾ = 1 N ∑ i = 1 N X i \overline{X}=\frac{1}{N}\sum_{i=1}^{N}X_i X=N1∑i=1NXi
样本方差: S 2 = 1 N − 1 ∑ i = 1 N ( X i − X ‾ ) 2 S^2=\frac{1}{N-1}\sum_{i=1}^{N}(X_i-\overline{X})^2 S2=N−11∑i=1N(Xi−X)2
协方差: C o v ( X , Y ) = 1 N − 1 ∑ i = 1 N ( X i − X ‾ ) ( Y i − Y ‾ ) Cov(X,Y)=\frac{1}{N-1}\sum_{i=1}^{N}(X_i-\overline{X})(Y_i-\overline{Y}) Cov(X,Y)=N−11∑i=1N(Xi−X)(Yi−Y)
协方差矩阵的计算类似。
上述公式也是机器学习中计算 μ , σ 2 \mu,\sigma^2 μ,σ2的基本公式。
对多维样本(样本具有多个特征),令 X X X为包含 m m m个 n n n维样本 x ( i ) x^{(i)} x(i)的样本集。则:
X = [ x ( 1 ) T x ( 2 ) T ⋮ x ( m ) T ] = [ x 1 ( 1 ) x 2 ( 1 ) … x n ( 1 ) x 1 ( 2 ) x 2 ( 2 ) … x n ( 2 ) ⋮ ⋮ … ⋮ x 1 ( m ) x 2 ( m ) … x n ( m ) ] X= \left[ \begin{matrix} {x^{(1)}}^T \\ {x^{(2)}}^T \\ \vdots \\ {x^{(m)}}^T \\ \end{matrix} \right]= \left[ \begin{matrix} x^{(1)}_1 & x^{(1)}_2 & \dots & x^{(1)}_n\\ x^{(2)}_1 & x^{(2)}_2 & \dots & x^{(2)}_n \\ \vdots & \vdots & \dots & \vdots \\ x^{(m)}_1 & x^{(m)}_2 & \dots & x^{(m)}_n \\ \end{matrix} \right] X=⎣⎢⎢⎢⎢⎡x(1)Tx(2)T⋮x(m)T⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡x1(1)x1(2)⋮x1(m)x2(1)x2(2)⋮x2(m)…………xn(1)xn(2)⋮xn(m)⎦⎥⎥⎥⎥⎤
均值、方差的计算都是每个维度独立进行的。
X = μ j = x ‾ j = 1 m ∑ i = 1 m x j ( i ) μ = [ μ 1 , μ 2 , … , μ n ] X=\mu_j=\overline{x}_j=\frac{1}{m}\sum_{i=1}^{m}x^{(i)}_j \\ \mu=[\mu_1, \mu_2, \dots, \mu_n] X=μj=xj=m1i=1∑mxj(i)μ=[μ1,μ2,…,μn]
% matlab代码:
mu = mean(X);
协方差 C o v ( x i , x j ) Cov(x_i,x_j) Cov(xi,xj):
C o v ( x i , x j ) = C o v ( x j , x i ) = 1 m − 1 ∑ k = 1 m ( x i ( k ) − x ‾ i ) ( x j ( k ) − x ‾ j ) Cov(x_i,x_j)=Cov(x_j,x_i)=\frac{1}{m-1}\sum_{k=1}^{m}(x^{(k)}_i-\overline{x}_i)(x^{(k)}_j-\overline{x}_j) Cov(xi,xj)=Cov(xj,xi)=m−11k=1∑m(xi(k)−xi)(xj(k)−xj)
协方差矩阵 C C C( n × n n\times n n×n对称矩阵):
C = [ C o v ( x 1 , x 1 ) C o v ( x 1 , x 2 ) … C o v ( x 1 , x n ) C o v ( x 2 , x 1 ) C o v ( x 2 , x 2 ) … C o v ( x 2 , x n ) ⋮ ⋮ … ⋮ C o v ( x n , x 1 ) C o v ( x n , x 2 ) … C o v ( x n , x n ) ] C= \left[ \begin{matrix} Cov(x_1,x_1) & Cov(x_1,x_2) & \dots & Cov(x_1,x_n) \\ Cov(x_2,x_1) & Cov(x_2,x_2) & \dots & Cov(x_2,x_n) \\ \vdots & \vdots & \dots & \vdots \\ Cov(x_n,x_1) & Cov(x_n,x_2) & \dots & Cov(x_n,x_n) \\ \end{matrix} \right] C=⎣⎢⎢⎢⎡Cov(x1,x1)Cov(x2,x1)⋮Cov(xn,x1)Cov(x1,x2)Cov(x2,x2)⋮Cov(xn,x2)…………Cov(x1,xn)Cov(x2,xn)⋮Cov(xn,xn)⎦⎥⎥⎥⎤
%% matlab代码:
C = cov(X)
% X_center = bsxfun(@minus, mu, X);
% C = cov(C_center);
% C = 1/(m-1)*X_center'*X_center;
定义:设 A A A为 n n n阶方阵, λ \lambda λ为变量,把 ∣ λ E − A ∣ = 0 |\lambda E-A|=0 ∣λE−A∣=0的根称为 A A A的特征值,其中 ∣ λ E − A ∣ = 0 |\lambda E-A|=0 ∣λE−A∣=0称为 A A A的特征多项式。设 λ i \lambda_i λi为 A A A的特征值,则齐次线性方程组 ( λ i E − A ) x = 0 (\lambda_iE-A)x=0 (λiE−A)x=0的非零解向量称为A对应于 λ i \lambda_i λi的特征向量。
A p = λ p , p ̸ = 0 Ap=\lambda p, p\not=0 Ap=λp,p̸=0, λ \lambda λ为特征值, p p p为特征向量。
只要是方阵,就有特征值和特征向量。
特征值和特征向量的性质:
1.n阶方程有且只有n个特征值(k重特征值看做k个)
2. λ 1 + λ 2 + ⋯ + λ n = t r ( A ) \lambda_1+\lambda_2+\dots+\lambda_n=tr(A) λ1+λ2+⋯+λn=tr(A)
3. λ 1 ⋅ λ 2 ⋯ λ n = ∣ A ∣ \lambda_1 \cdot \lambda_2 \cdots\lambda_n=|A| λ1⋅λ2⋯λn=∣A∣
4.若 λ \lambda λ为 A A A的特征值, p p p为对应的特征向量, k k k为正整数,则 λ k \lambda^k λk为 A k A^k Ak的特征值, p p p仍是对应的特征向量。即,如果 A p = λ p 且 p ̸ = 0 Ap=\lambda p且p\not=0 Ap=λp且p̸=0,那么有 A k p = λ k p A^kp=\lambda^kp Akp=λkp.
相似变换: 设 A , B A, B A,B为 n n n阶方阵,如果存在 n n n阶可逆矩阵 P ( ∣ P ∣ ̸ = 0 ) P(|P|\not=0) P(∣P∤=0),使得 P − 1 A P = B P^{-1}AP=B P−1AP=B则称 A A A与 B B B相似; P − 1 A P P^{-1}AP P−1AP称为对 A A A进行相似变换; P P P称为相似变换矩阵。
向量的正交: a T b = 0 a^Tb=0 aTb=0
正交矩阵:实方阵 A A A满足 A T A = E A^TA=E ATA=E
如果相似变换矩阵 P P P为正交矩阵,则称 A A A与 B B B正交相似; P − 1 A P P^{-1}AP P−1AP称为对 A A A进行正交相似变换。
相似对角化: 若方阵 A A A能与对角阵 Λ \Lambda Λ相似,则称 A A A可相似对角化。即 P − 1 A P = Λ P^{-1}AP=\Lambda P−1AP=Λ,其中 Λ \Lambda Λ称为 A A A的相似标准形。
Λ \Lambda Λ的所有对角元为 A A A的全部特征值: Λ = d i a g ( λ 1 , λ 2 , … , λ n ) \Lambda=diag(\lambda_1, \lambda_2, \dots, \lambda_n) Λ=diag(λ1,λ2,…,λn)。
不是所有的方阵都可相似对角化。
n n n阶方阵 A A A可相似对角化的充要条件: A A A有 n n n个线性无关的特征向量。
用来把 A A A相似对角化的相似变换矩阵 P P P是以 A A A的 n n n个线性无关的特征向量为列所构成的矩阵,所化为的对角矩阵 Λ \Lambda Λ的对角元恰好为 n n n个特征向量,并且特征值在 Λ \Lambda Λ中的排列顺序与特征向量在 P P P中的排列顺序相对应。
只有可相似对角化的方阵,才能进行特征分解。
特征分解: n n n阶方阵 A = P Λ P − 1 A=P\Lambda P^{-1} A=PΛP−1. ⇒ A P = Λ P \Rightarrow AP=\Lambda P ⇒AP=ΛP
其中 P P P是 n × n n\times n n×n方阵,第 i i i列为 A A A的特征向量 p i p_i pi. Λ \Lambda Λ是对角阵, Λ i i \Lambda_{ii} Λii为 p i p_i pi对应的特征值。
%% matlab代码:
[P, Lambda]=eig(A);
可以看做特征分解在任意矩阵上的推广。
针对任意大小的矩阵 A m × n A_{m\times n} Am×n:
A = U Σ V H = { U : m × m 矩 阵 Σ : m × n 对 角 阵 V : n × n 矩 阵 , V H 为 V 的 共 轭 转 置 ( 对 实 矩 阵 V H = V T ) A=U\Sigma V^H= \left\{ \begin{array}{l} U: m\times m矩阵 \\ \Sigma: m\times n对角阵 \\ V:n\times n矩阵,V^H为V的共轭转置(对实矩阵V^H=V^T) \end{array} \right. A=UΣVH=⎩⎨⎧U:m×m矩阵Σ:m×n对角阵V:n×n矩阵,VH为V的共轭转置(对实矩阵VH=VT)
U U U的列向量(左奇异向量)为 A A H AA^H AAH的特征向量。
Σ \Sigma Σ非零对角元为 A A H AA^H AAH(或 A H A A^HA AHA)的特征值平方根。
V V V的列向量(右奇异向量)为 A H A A^HA AHA的特征向量。
%% matlab代码:
[U, S, V] = svd(A);
% eig()返回的结果中,对角元并不是按从大到小的顺序排列.
[P1, Lambda1] = eig(A'*A); [data,idx]= sort(diag(Lambda1),'descend'); P1= P1(:,idx); Lambda1= diag(data);
[P2, Lambda2] = eig(A*A'); [data,idx]= sort(diag(Lambda2),'descend'); P2= P2(:,idx); Lambda2= diag(data);
% U和P2相等. V和P1相等. S和sqrt(Lambda2)相等, 和sqrt(Lambda1)不完全相等。
由于PCA中涉及协方差矩阵的特征分解或者SVD分解,而协方差矩阵为实对称矩阵,因此有必要针对实对称矩阵具体分析其特征分解和SVD分解的特性。
1.实对称矩阵 A A A的特征值都是实数。
2.实对称矩阵 A A A中互异特征值 λ , μ \lambda,\mu λ,μ对应的特征向量 p , q p,q p,q一定正交( p T q = 0 p^Tq=0 pTq=0)。对一般方阵, p , q p,q p,q只是线性无关。
3.实对称矩阵 A A A一定可相似对角化 P − 1 A P = d i a g ( λ 1 , λ 2 , … , λ n ) P^{-1}AP=diag(\lambda_1, \lambda_2, \dots, \lambda_n) P−1AP=diag(λ1,λ2,…,λn),并且可以用正交相似变化进行相似对角化 Q − 1 A Q = d i a g ( λ 1 , λ 2 , … , λ n ) Q^{-1}AQ=diag(\lambda_1, \lambda_2, \dots, \lambda_n) Q−1AQ=diag(λ1,λ2,…,λn)。
其中 Q Q Q的第 i i i列是 P P P中 p i p_i pi的正交单位化,即 Q Q Q为正交阵( Q − 1 = Q T Q^{-1}=Q^T Q−1=QT)。
4.对实对称矩阵 A A A,有 A H A = A T A = A A T = A A H = A 2 A^HA=A^TA=AA^T=AA^H=A^2 AHA=ATA=AAT=AAH=A2
5.实对称矩阵 A A A的SVD分解:
A = U Σ V T 其 中 Σ 对 角 元 是 A T A ( 或 A A T ) 的 特 征 值 平 方 根 令 A 的 特 征 值 和 特 性 向 量 为 λ , p 则 有 , A T A = A 2 的 特 征 值 和 特 征 向 量 分 别 为 λ 2 , p ( → V ) 同 理 , A A T = A 2 的 特 征 值 和 特 征 向 量 分 别 为 λ 2 , p ( → U ) A=U\Sigma V^T \\ \begin{array}{l} 其中\Sigma对角元是A^TA(或AA^T)的特征值平方根\\ 令A的特征值和特性向量为\lambda,p \\ 则有,A^TA=A^2的特征值和特征向量分别为\lambda^2,p(\rightarrow V)\\ 同理,AA^T=A^2的特征值和特征向量分别为\lambda^2,p(\rightarrow U) \end{array} A=UΣVT其中Σ对角元是ATA(或AAT)的特征值平方根令A的特征值和特性向量为λ,p则有,ATA=A2的特征值和特征向量分别为λ2,p(→V)同理,AAT=A2的特征值和特征向量分别为λ2,p(→U)
因此,对实对称矩阵 A A A,其特征分解和SVD分解的结果相同:
%% matlab代码
[U, S, V] = svd(A);
[P, lambda] = eig(A); [data,idx]= sort(diag(lambda),'descend'); P= P(:,idx); lambda= diag(data);
% S和lambda相等. U,V,P之间两两相等(向量方向可能不同).
对多维样本(样本具有多个特征),令 X X X为包含 m m m个 n n n维样本 x ( i ) x^{(i)} x(i)的样本集:
X = [ x ( 1 ) T x ( 2 ) T ⋮ x ( m ) T ] = [ x 1 ( 1 ) x 2 ( 1 ) … x n ( 1 ) x 1 ( 2 ) x 2 ( 2 ) … x n ( 2 ) ⋮ ⋮ … ⋮ x 1 ( m ) x 2 ( m ) … x n ( m ) ] X= \left[ \begin{matrix} {x^{(1)}}^T \\ {x^{(2)}}^T \\ \vdots \\ {x^{(m)}}^T \\ \end{matrix} \right]= \left[ \begin{matrix} x^{(1)}_1 & x^{(1)}_2 & \dots & x^{(1)}_n\\ x^{(2)}_1 & x^{(2)}_2 & \dots & x^{(2)}_n \\ \vdots & \vdots & \dots & \vdots \\ x^{(m)}_1 & x^{(m)}_2 & \dots & x^{(m)}_n \\ \end{matrix} \right] X=⎣⎢⎢⎢⎢⎡x(1)Tx(2)T⋮x(m)T⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡x1(1)x1(2)⋮x1(m)x2(1)x2(2)⋮x2(m)…………xn(1)xn(2)⋮xn(m)⎦⎥⎥⎥⎥⎤
PCA降维需要求解 X T X X^TX XTX的特征向量。由于 X T X X^TX XTX为对称矩阵,因此有三种求解方法:
其中(3)是最为常用的求解方法。