线性映射同构于矩阵乘。线性空间的一组基 α = ( α 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:U→V,在空间 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 P1∈U,映射到了 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 P2∈V的坐标为 y = A x y=Ax y=Ax
线性变换 A : V → V \mathscr A :\mathbb V \rightarrow \mathbb V A:V→V,空间 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=P−1AP(相似),相似矩阵代表相同的线性变换。对于基 α \alpha α下坐标为 x x x的点 P 1 ∈ V P_1\in \mathbb V P1∈V,映射到了 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 P2∈V的坐标为 y = A x y=Ax y=Ax
对角化:对于 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ΣW−1,其中 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=AT∈Rn×n),它满足:
因此,一个 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} A∈Rm×n,有
特征值分解:
奇异值分解(Singular Value Decomposition,SVD):
对于矩阵 A T A ∈ R n × n A^T A \in R^{n \times n} ATA∈Rn×n,计算 n n n个单位正交的特征向量(右奇异向量 v i v_i vi),按列组合成酉矩阵 V ∈ R n × n V \in R^{n \times n} V∈Rn×n,对应的特征值为 λ i \lambda_i λi
对于矩阵 A A T ∈ R m × m A A^T \in R^{m \times m} AAT∈Rm×m,计算 m m m个单位正交的特征向量(左奇异向量 u i u_i ui),按列组合成酉矩阵 U ∈ R m × m U \in R^{m \times m} U∈Rm×m,对应的特征值为 λ ~ i \tilde \lambda_i λ~i
根据 σ 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,它的对角线是对应的奇异值
最终得到 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ΣTUT⋅UΣ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ΣVT⋅VΣ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
主成分分析(Principal Component Analysis,PCA)是非常经典的降维算法。
对于 A ∈ R m × n A \in R^{m \times n} A∈Rm×n,它表示 m m m维特征空间中的 n n n个数据点,但特征的维度 m m m过大
方法一:
方法二:
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} P∈Rk×m是从 m m m维空间到 k k k维子空间的线性变换。我们认为这 k k k维子空间上的投影是消息本身,而另外 m − k m-k m−k维补空间内的投影则是噪音。
选取合适的主成分个数 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 1−∑i=1nΣii∑i=1kΣii≤t
这里的 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 #(投影,误差)