线性映射
线性映射同构于矩阵乘。线性空间的一组基
α
=
(
α
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=1n?xi?α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?11?ATA∈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 = 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))
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)
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=1n?Aij?),得到矩阵
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?11?XTX∈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=1n?Aij?),得到矩阵
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)
tmp = 0
for i in range(k):
tmp += S[i]
t = 1 - tmp/np.sum(S)
P = U[:,:k].T
return P@X, t
|