线性映射
线性映射同构于矩阵乘。线性空间的一组基 α = ( α 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
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Σ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),它满足:
- 不同特征值对应的特征向量彼此正交
- 若特征值 λ \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} A∈Rm×n,有
特征值分解:
- 计算协方差矩阵 C = 1 n − 1 A T A ∈ R n × n C = \frac{1}{n-1} A^T A \in R^{n \times n} C=n−11ATA∈Rn×n(无偏估计,不除以 n − 1 n-1 n−1或者除以 n n n都不影响特征值和特征向量)
- 协方差矩阵 C C C是 n n n阶实对称方阵,因此可以对角化: C = W Σ W T C = W \Sigma W^T C=WΣWT
奇异值分解(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
PCA
主成分分析(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过大
方法一:
- 去中心化,将各特征(如 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} n−11∑j=1nAij),得到矩阵 X ∈ R m × n X \in R^{m \times n} X∈Rm×n
- 计算协方差矩阵 C = 1 n − 1 X T X ∈ R n × n C = \frac{1}{n-1} X^T X \in R^{n \times n} C=n−11XTX∈Rn×n
- 做特征值分解, C = W Σ W T C = W \Sigma W^T C=WΣWT
- 选取最大的 k k k个特征值,将 W W W截取最左边的 k k k个特征向量,按行组合成矩阵 P P P
- 做线性变换, Y = P A ∈ R k × n Y = PA \in R^{k \times n} Y=PA∈Rk×n,这是 k ≪ n k \ll n k≪n维空间中的 n n n个数据点
方法二:
- 去中心化,将各特征(如 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} n−11∑j=1nAij),得到矩阵 X ∈ R m × n X \in R^{m \times n} X∈Rm×n
- 做奇异值分解, X = U Σ V T X = U \Sigma V^T X=UΣVT
- 选取最大的 k k k个奇异值,将 U U U截取最左边的 k k k个特征向量,按行组合成矩阵 P P P
- 做线性变换, Y = P A ∈ R k × n Y = PA \in R^{k \times n} Y=PA∈Rk×n,这是 k ≪ n k \ll n k≪n维空间中的 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} 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 #(投影,误差)