奇异值分解(SVD)与 主成分分析(PCA)

线性映射

线性映射同构于矩阵乘。线性空间的一组基 α = ( α 1 , ⋯   , α n ) \alpha=(\alpha_1, \cdots, \alpha_n) α=(α1,,αn),一个点的坐标为 x = ( x 1 , ⋯   , x n ) x=(x_1,\cdots,x_n) x=(x1,,xn),那么点可以记做两者内积 α ⋅ x = ∑ i = 1 n x i α i \alpha \cdot x = \sum_{i=1}^{n} x_i\alpha_i αx=i=1nxiαi。注意,基不一定是向量,可以是任何线性无关的对象(比如,三角函数)。

线性映射 A : U → V \mathscr A :\mathbb U \rightarrow \mathbb V A:UV,在空间 U U U下的基 ( α 1 , ⋯   , α n ) (\alpha_1, \cdots, \alpha_n) (α1,,αn)下和空间 V V V下的基 ( β 1 , ⋯   , β m ) (\beta_1, \cdots, \beta_m) (β1,,βm)的矩阵是 A A A,在空间 U U U下的基 ( α ~ 1 , ⋯   , α ~ n ) (\tilde \alpha_1, \cdots, \tilde \alpha_n) (α~1,,α~n)下和空间 V V V下的基 ( β ~ 1 , ⋯   , β ~ m ) (\tilde \beta_1, \cdots, \tilde \beta_m) (β~1,,β~m)的矩阵是 B B B,即
A ( α 1 , ⋯   , α n ) = ( β 1 , ⋯   , β m ) A A ( α ~ 1 , ⋯   , α ~ n ) = ( β ~ 1 , ⋯   , β ~ m ) B \mathscr A(\alpha_1, \cdots, \alpha_n) = (\beta_1, \cdots, \beta_m)A\\ \mathscr A(\tilde \alpha_1, \cdots, \tilde \alpha_n) = (\tilde \beta_1, \cdots, \tilde \beta_m)B\\ A(α1,,αn)=(β1,,βm)AA(α~1,,α~n)=(β~1,,β~m)B
假设 ( α 1 , ⋯   , α n ) (\alpha_1, \cdots, \alpha_n) (α1,,αn) ( α ~ 1 , ⋯   , α ~ n ) (\tilde \alpha_1, \cdots, \tilde \alpha_n) (α~1,,α~n)的过渡矩阵为 P P P ( β 1 , ⋯   , β m ) (\beta_1, \cdots, \beta_m) (β1,,βm) ( β ~ 1 , ⋯   , β ~ m ) (\tilde \beta_1, \cdots, \tilde \beta_m) (β~1,,β~m)的过渡矩阵为 Q Q Q,即
( α 1 , ⋯   , α n ) P = ( α ~ 1 , ⋯   , α ~ n ) ( β 1 , ⋯   , β m ) Q = ( β ~ 1 , ⋯   , β ~ m ) (\alpha_1, \cdots, \alpha_n)P=(\tilde \alpha_1, \cdots, \tilde \alpha_n)\\ (\beta_1, \cdots, \beta_m)Q=(\tilde \beta_1, \cdots, \tilde \beta_m) (α1,,αn)P=(α~1,,α~n)(β1,,βm)Q=(β~1,,β~m)
那么 B = Q A P B=QAP B=QAP相抵),相抵矩阵代表相同的线性映射。对于基 α \alpha α下坐标为 x x x的点 P 1 ∈ U P_1 \in \mathbb U P1U,映射到了 P 2 = A ( α ⋅ x ) = A ( α ) ⋅ x = ( β 1 , ⋯   , β m ) A x P_2 = \mathscr A(\alpha \cdot x) = \mathscr A(\alpha) \cdot x = (\beta_1, \cdots, \beta_m)Ax P2=A(αx)=A(α)x=(β1,,βm)Ax,在基 β \beta β下点 P 2 ∈ V P_2 \in \mathbb V P2V的坐标为 y = A x y=Ax y=Ax

线性变换 A : V → V \mathscr A :\mathbb V \rightarrow \mathbb V A:VV,空间 V V V的两组基 ( α 1 , ⋯   , α n ) , ( α ~ 1 , ⋯   , α ~ n ) (\alpha_1, \cdots, \alpha_n),(\tilde \alpha_1, \cdots, \tilde \alpha_n) (α1,,αn),(α~1,,α~n),若
A ( α 1 , ⋯   , α n ) = ( α 1 , ⋯   , α n ) A A ( α ~ 1 , ⋯   , α ~ n ) = ( α ~ 1 , ⋯   , α ~ n ) B \mathscr A(\alpha_1, \cdots, \alpha_n) = (\alpha_1, \cdots, \alpha_n)A\\ \mathscr A(\tilde \alpha_1, \cdots, \tilde \alpha_n)= (\tilde \alpha_1, \cdots, \tilde \alpha_n)B\\ A(α1,,αn)=(α1,,αn)AA(α~1,,α~n)=(α~1,,α~n)B
假设从基 α \alpha α到基 α ~ \tilde \alpha α~的过渡矩阵为可逆方阵 P P P,即
( α 1 , ⋯   , α n ) P = ( α ~ 1 , ⋯   , α ~ n ) (\alpha_1, \cdots, \alpha_n)P=(\tilde \alpha_1, \cdots, \tilde \alpha_n) (α1,,αn)P=(α~1,,α~n)
那么 B = P − 1 A P B=P^{-1}AP B=P1AP相似),相似矩阵代表相同的线性变换。对于基 α \alpha α下坐标为 x x x的点 P 1 ∈ V P_1\in \mathbb V P1V,映射到了 P 2 = A ( α ⋅ x ) = A ( α ) ⋅ x = ( α 1 , ⋯   , α n ) A x P_2 = \mathscr A(\alpha \cdot x) = \mathscr A(\alpha) \cdot x = (\alpha_1, \cdots, \alpha_n)Ax P2=A(αx)=A(α)x=(α1,,αn)Ax,在基 α \alpha α下点 P 2 ∈ V P_2\in \mathbb V P2V的坐标为 y = A x y=Ax y=Ax

SVD

对角化:对于 n n n维方阵 A A A,如果存在 n n n个线性无关的特征向量 w 1 , ⋯   , w n w_1,\cdots,w_n w1,,wn,以及对应的特征值 λ 1 ≤ ⋯ ≤ λ n \lambda_1 \le \cdots \le \lambda_n λ1λn,那么可以表示为: A = W Σ W − 1 A=W \Sigma W^{-1} A=WΣW1,其中 W = [ w 1 , ⋯   , w n ] W=[w_1,\cdots,w_n] W=[w1,,wn] Σ = d i a g ( λ 1 , ⋯   , λ n ) \Sigma=diag(\lambda_1,\cdots,\lambda_n) Σ=diag(λ1,,λn)

一个实对称矩阵 A = A T ∈ R n × n A=A^T \in R^{n\times n} A=ATRn×n),它满足:

  1. 不同特征值对应的特征向量彼此正交
  2. 若特征值 λ \lambda λ的重数为 r r r,那么就存在 r r r个线性无关的特征向量 λ \lambda λ(几何重数=代数重数)

因此,一个 n n n阶实对称方阵中一定可以找到 n n n单位正交特征向量!或者说,存在 W T W = I W^TW=I WTW=I(酉矩阵,这里是共轭转置)

对于长矩阵 A ∈ R m × n A \in R^{m \times n} ARm×n,有

特征值分解

  1. 计算协方差矩阵 C = 1 n − 1 A T A ∈ R n × n C = \frac{1}{n-1} A^T A \in R^{n \times n} C=n11ATARn×n(无偏估计,不除以 n − 1 n-1 n1或者除以 n n n都不影响特征值和特征向量)
  2. 协方差矩阵 C C C n n n阶实对称方阵,因此可以对角化: C = W Σ W T C = W \Sigma W^T C=WΣWT

奇异值分解(Singular Value Decomposition,SVD):

  1. 对于矩阵 A T A ∈ R n × n A^T A \in R^{n \times n} ATARn×n,计算 n n n个单位正交的特征向量(右奇异向量 v i v_i vi),按列组合成酉矩阵 V ∈ R n × n V \in R^{n \times n} VRn×n,对应的特征值为 λ i \lambda_i λi

  2. 对于矩阵 A A T ∈ R m × m A A^T \in R^{m \times m} AATRm×m,计算 m m m个单位正交的特征向量(左奇异向量 u i u_i ui),按列组合成酉矩阵 U ∈ R m × m U \in R^{m \times m} URm×m,对应的特征值为 λ ~ i \tilde \lambda_i λ~i

  3. 根据 σ i = A v i / u i \sigma_i = Av_i/u_i σi=Avi/ui或者 σ i 2 = λ i = λ ~ i \sigma_i^2=\lambda_i=\tilde \lambda_i σi2=λi=λ~i计算奇异值,组合成 Σ ∈ R m × n \Sigma \in R^{m \times n} ΣRm×n,它的对角线是对应的奇异值

  4. 最终得到 A = U Σ V T A = U \Sigma V^T A=UΣVT(易知, A V = U Σ AV = U \Sigma AV=UΣ A T A = V Σ T U T ⋅ U Σ V T = V Σ 2 V T A^T A = V \Sigma^T U^T \cdot U \Sigma V^T = V \Sigma^2 V^T ATA=VΣTUTUΣVT=VΣ2VT A A T = U Σ V T ⋅ V Σ T U T = U Σ 2 U T A A^T = U \Sigma V^T \cdot V \Sigma^T U^T = U \Sigma^2 U^T AAT=UΣVTVΣTUT=UΣ2UT

一般地,特征值分解以及奇异值分解都将 Σ \Sigma Σ中的特征值或奇异值按照从大到小的顺序排列。并且,奇异值会快速衰减(前10%甚至1%的奇异值的加和,可以占全部奇异值之和的99%以上),可用于压缩数据。

numpy计算,

import numpy as np

A = np.array([[-1, 1, 1],
              [-4, 3, 2],
              [1, 0, 3]])

#特征值、特征向量
eigenvalue, featurevector = np.linalg.eig(A)	#计算
index = list(reversed(np.argsort(eigenvalue)))	#从大到小排序
eigenvalue = eigenvalue[index]
featurevector = featurevector.T[index]
print("特征值:\n", eigenvalue)
print("特征向量:\n", featurevector)

#逆矩阵
det = np.linalg.det(W)
print("det:",det)
W_inv = np.linalg.inv(W) 
print("W_inv:\n",W_inv)

#特征值的对角阵
Sigma = np.diag(eigenvalue) 
print("Sigma:\n",Sigma)

# A2 = A
A2 = W@Sigma@W_inv
print("A2:\n",A2)

其实,更简单的

# 特征值分解
S,W = np.linalg.eig(A)
print("\nW = \n",W)
print("\nS = \n",S)
print("\nA2 = \n",(W*S)@np.linalg.inv(W))	#W * diag(S) * W.inv

A = np.array([[-1, 1, 1, 5],
              [-4, 3, 2, -2],
              [1, 0, 3, 1]])

# 奇异值分解
U, S, VT = np.linalg.svd(A)
print("\nU = \n",U)
print("\nS = \n",S)
print("\nV.T = \n",VT)
Sigma = np.zeros(A.shape)
for i,s in enumerate(S):
	Sigma[i,i]=s
print("\nA2 = \n",U@Sigma@VT)	#U * diag(S) * V.T

PCA

主成分分析(Principal Component Analysis,PCA)是非常经典的降维算法。

对于 A ∈ R m × n A \in R^{m \times n} ARm×n,它表示 m m m维特征空间中的 n n n个数据点,但特征的维度 m m m过大

方法一:

  1. 去中心化,将各特征(如 A i j A_{ij} Aij)减去它们的均值(如 1 n − 1 ∑ j = 1 n A i j \frac{1}{n-1}\sum_{j=1}^n A_{ij} n11j=1nAij),得到矩阵 X ∈ R m × n X \in R^{m \times n} XRm×n
  2. 计算协方差矩阵 C = 1 n − 1 X T X ∈ R n × n C = \frac{1}{n-1} X^T X \in R^{n \times n} C=n11XTXRn×n
  3. 特征值分解 C = W Σ W T C = W \Sigma W^T C=WΣWT
  4. 选取最大的 k k k个特征值,将 W W W截取最左边的 k k k个特征向量,按行组合成矩阵 P P P
  5. 做线性变换, Y = P A ∈ R k × n Y = PA \in R^{k \times n} Y=PARk×n,这是 k ≪ n k \ll n kn维空间中的 n n n个数据点

方法二:

  1. 去中心化,将各特征(如 A i j A_{ij} Aij)减去它们的均值(如 1 n − 1 ∑ j = 1 n A i j \frac{1}{n-1}\sum_{j=1}^n A_{ij} n11j=1nAij),得到矩阵 X ∈ R m × n X \in R^{m \times n} XRm×n
  2. 奇异值分解 X = U Σ V T X = U \Sigma V^T X=UΣVT
  3. 选取最大的 k k k个奇异值,将 U U U截取最左边的 k k k个特征向量,按行组合成矩阵 P P P
  4. 做线性变换, Y = P A ∈ R k × n Y = PA \in R^{k \times n} Y=PARk×n,这是 k ≪ n k \ll n kn维空间中的 n n n个数据点

PCA的含义:由于截取的 k k k个特征值较大,这意味着,在对应的特征向量的方向上的方差较大。由于 P P P是由特征向量按行组合的,且这些特征向量彼此单位正交,所以 Y = P A Y = PA Y=PA其实就是将 m m m维空间中的 n n n个数据点,正交投影到这些特征向量张成的 k k k维子空间中(内积就是投影系数),矩阵 P ∈ R k × m P \in R^{k \times m} PRk×m是从 m m m维空间到 k k k维子空间的线性变换。我们认为这 k k k维子空间上的投影是消息本身,而另外 m − k m-k mk维补空间内的投影则是噪音

选取合适的主成分个数 k k k
1 − ∑ i = 1 k Σ i i ∑ i = 1 n Σ i i ≤ t 1 - \frac{\sum_{i=1}^k \Sigma_{ii}}{\sum_{i=1}^n \Sigma_{ii}} \le t 1i=1nΣiii=1kΣiit
这里的 t t t是误差大小,选取 t = 0.01 t=0.01 t=0.01表示主成分保留了至少 99 % 99\% 99%的原始信息。

代码实现,

def PCA(X,k):
	'X是m*n长矩阵,m维空间中的n个数据点'
	X_mean = np.mean(X,1)			#每一行的均值
	X2 = np.array(X,dtype=float)
	for i,x in enumerate(X2):		#去中心化
		X2[i] = x-X_mean[i]
	U, S, VT = np.linalg.svd(X2)	#SVD
	tmp = 0
	for i in range(k):
		tmp += S[i]
	t = 1 - tmp/np.sum(S)			#误差大小
	P = U[:,:k].T
	return P@X, t					#(投影,误差)

你可能感兴趣的:(数学,代码,算法,数学,线性代数,数据分析,机器学习)