机器学习(八)——PCA
8.1 PCA概述
主成分分析(PCA)是一种常用的数据降维方法,它通过线性变换将原始数据变换为一组各维度线性无关的表示,通常用于高维数据的处理和可视化。
8.1.1 特征维度约简
特征约减的目的是将高维特征向量映射到低维子空间中
给定n个样本(每个样本维度为p维)
{
x
1
,
x
2
,
…
…
x
n
}
\left \{ x_1,x_2,……x_n \right \}
{x1,x2,……xn}
通过特征变换/投影矩阵实现特征空间的压缩:
G
∈
R
p
×
d
:
x
∈
R
p
→
y
=
G
T
x
∈
R
d
(
d
<
<
p
)
G \in R^ {p\times d} :x \in R^ {p} \rightarrow y= G^ {T} x \in R^ {d} (d<<p )
G∈Rp×d:x∈Rp→y=GTx∈Rd(d<<p)
大多数机器学习算法在高维空间中表现不够鲁棒,查询速度与精度随着维度增加而降低.有价值的维度往往很少
8.1.2 协方差矩阵
在统计学中,方差是用来度量单个随机变量的离散程度,而协方差则一般用来刻画两个随机变量的相似程度
方差:
σ
x
2
=
1
n
−
1
∑
i
=
1
n
(
x
i
−
x
‾
)
2
\sigma _ {x}^ {2}= \frac {1}{n-1} \sum _ {i=1}^ {n} (x_ {i}-\overline {x})^ {2}
σx2=n−11i=1∑n(xi−x)2
协方差:
σ ( x , y ) = 1 n − 1 ∑ i = 1 n ( x i − x ‾ ) 2 ( y i − y ‾ ) 2 \sigma(x,y)= \frac {1}{n-1} \sum _ {i=1}^ {n} (x_ {i}-\overline {x})^ {2} (y_ {i}-\overline {y})^ {2} σ(x,y)=n−11i=1∑n(xi−x)2(yi−y)2
例:如果观测N个人的体重w和身高h,这样会形成
R
2
R^2
R2的样本空间,观测向量
X
j
(
X
j
⊆
R
2
)
{\mathrm{X_j(X_j}}\subseteq\mathbb{R}^2)
Xj(Xj⊆R2)表示第j个人体重和身高,观测矩阵可以表示为:
[
w
1
w
1
⋯
w
N
h
1
h
2
…
h
N
]
\begin{bmatrix}\mathrm{w}_1&&\mathrm{w}_1&&\cdots&&\mathrm{w}_\mathrm{N}\\\mathrm{h}_1&&\mathrm{h}_2&&\ldots&&\mathrm{h}_\mathrm{N}\end{bmatrix}
[w1h1w1h2⋯…wNhN]
X
1
=
[
w
1
h
1
]
,
X
2
=
[
w
2
h
2
]
,
X
N
=
[
w
N
h
N
]
\mathrm X_1=\begin{bmatrix}\mathrm w_1\\\mathrm h_1\end{bmatrix},\mathrm X_2=\begin{bmatrix}\mathrm w_2\\\mathrm h_2\end{bmatrix},\mathrm X_\mathrm N=\begin{bmatrix}\mathrm w_\mathrm N\\\mathrm h_\mathrm N\end{bmatrix}
X1=[w1h1],X2=[w2h2],XN=[wNhN]
这些是观测序列
协方差矩阵是一个p*p的矩阵S,满足 S = 1 N − 1 B B T \mathrm{S=\frac1{N-1}BB^T} S=N−11BBT
由于任何具有
B
B
T
BB^T
BBT矩阵都是半正定的(如果B是m x n 的矩阵,那么
B
B
T
BB^T
BBT是半正定的),所以S也是半正定的。
注:协方差矩阵也常记作Σ
例:从一个总体中随机抽取4个样本做3次测量,每个样本的观测向量为:
X
1
=
[
1
2
1
]
,
X
2
=
[
4
2
13
]
,
X
3
=
[
7
8
1
]
,
X
4
=
[
8
4
5
]
\mathrm{X}_1=\begin{bmatrix}1\\2\\1\end{bmatrix},\mathrm{X}_2=\begin{bmatrix}4\\2\\13\end{bmatrix},\mathrm{X}_3=\begin{bmatrix}7\\8\\1\end{bmatrix},\mathrm{X}_4=\begin{bmatrix}8\\4\\5\end{bmatrix}
X1=
121
,X2=
4213
,X3=
781
,X4=
845
求样本均值及协方差矩阵。
样本均值:
M
=
1
4
(
[
1
2
1
]
+
[
4
2
13
]
+
[
7
8
1
]
+
[
8
4
5
]
)
=
1
4
[
20
16
20
]
=
[
5
4
5
]
\mathrm M=\dfrac14(\begin{bmatrix}1\\2\\1\end{bmatrix}+\begin{bmatrix}4\\2\\13\end{bmatrix}+\begin{bmatrix}7\\8\\1\end{bmatrix}+\begin{bmatrix}8\\4\\5\end{bmatrix})=\dfrac14\begin{bmatrix}20\\16\\20\end{bmatrix}=\begin{bmatrix}5\\4\\5\end{bmatrix}
M=41(
121
+
4213
+
781
+
845
)=41
201620
=
545
去中心化(减去均值):
X
1
^
=
[
−
4
−
2
−
4
]
,
X
2
^
=
[
−
1
−
2
8
]
,
X
3
^
=
[
2
4
−
4
]
,
X
4
^
=
[
3
0
0
]
\hat{\mathrm X_1}=\begin{bmatrix}-4\\-2\\-4\end{bmatrix},\hat{\mathrm X_2}=\begin{bmatrix}-1\\-2\\8\end{bmatrix},\hat{\mathrm X_3}=\begin{bmatrix}2\\4\\-4\end{bmatrix},\hat{\mathrm X_4}=\begin{bmatrix}3\\0\\0\end{bmatrix}
X1^=
−4−2−4
,X2^=
−1−28
,X3^=
24−4
,X4^=
300
得到矩阵B
B
=
[
−
4
−
1
2
3
−
2
−
2
4
0
−
4
8
−
4
0
]
\mathrm{B}=\begin{bmatrix}-4&-1&2&3\\-2&-2&4&0\\-4&8&-4&0\end{bmatrix}
B=
−4−2−4−1−2824−4300
所以,样本的协方差矩阵S为:
S
=
1
N
−
1
B
B
T
=
1
4
−
1
[
−
4
−
1
2
3
−
2
−
2
4
0
−
4
8
−
4
0
]
[
−
4
−
2
−
4
−
1
−
2
8
2
4
−
4
3
0
0
]
=
1
3
[
30
18
0
18
24
−
24
0
−
24
96
]
=
[
10
6
0
6
8
−
8
0
−
8
32
]
\begin{aligned}&\mathrm{S=\frac1{N-1}~BB^T=\frac1{4-1}~\begin{bmatrix}-4&-1&2&3\\-2&-2&4&0\\-4&8&-4&0\end{bmatrix}~\begin{bmatrix}-4&-2&-4\\-1&-2&8\\2&4&-4\\3&0&0\end{bmatrix}=\frac13~\begin{bmatrix}30&18&0\\18&24&-24\\0&-24&96\end{bmatrix}= {\begin{bmatrix}10&6&0\\6&8&-8\\0&-8&32\end{bmatrix}}}\end{aligned}
S=N−11 BBT=4−11
−4−2−4−1−2824−4300
−4−123−2−240−48−40
=31
301801824−240−2496
=
106068−80−832
8.1.3 传统人脸识别流程
应用:
8.1.4 PCA的推导
将矩阵图片转换为高维的向量导致维度过高,如果我们能将维度降低,将提高精度和效率,因此引入PCA。
如何进行降维呢?假设我们有一个10304 * 400 的图片矩阵X,如何转换成120 * 40 的向量Y呢?
答案是通过矩阵乘法实现,我们引入一个矩阵P大小为120*10304即可实现
那么矩阵降维可视化可以理解为将二维坐标系中的点集投影到直线方向成为向量
为了让损失的信息尽量少,我们希望矩阵的协方差值尽量大
(同维方差大,不同维尽量为0)
即
C
Y
=
[
δ
11
0
⋯
0
0
δ
22
⋯
0
.
.
.
.
.
.
.
.
.
.
.
.
0
0
.
.
.
δ
120
]
C_Y=\begin{bmatrix}\delta_{11}&0&\cdots&0\\0&\delta_{22}&\cdots&0\\...&...&...&...\\0&0&...&\delta_{120}\end{bmatrix}
CY=
δ110...00δ22...0⋯⋯......00...δ120
由于
C
Y
=
1
m
Y
Y
T
=
1
m
(
P
X
)
(
P
X
)
T
=
1
m
P
X
X
T
P
T
=
P
(
1
m
X
X
T
)
P
T
=
P
C
X
P
T
C_Y=\frac1mYY^T=\frac1m(PX)(PX)^T=\frac1mPXX^TP^T=P\left(\frac1mXX^T\right)P^T=PC_XP^T
CY=m1YYT=m1(PX)(PX)T=m1PXXTPT=P(m1XXT)PT=PCXPT
则
max
t
r
(
C
Y
)
=
max
t
r
(
P
C
X
P
T
)
\max tr(C_Y)=\max tr(PC_XP^T)
maxtr(CY)=maxtr(PCXPT)
s
.
t
.
,
P
P
T
=
I
s.t.,PP^T=I
s.t.,PPT=I
转化为(
W
=
P
T
W=P^T
W=PT)
max
t
r
(
W
T
C
X
W
)
s
.
t
.
,
W
T
W
=
I
\begin{aligned}\max tr(W^TC_XW)\\\\s.t.,W^TW&=I\end{aligned}
maxtr(WTCXW)s.t.,WTW=I
引入拉格朗日算子J(W):
J
(
W
)
=
−
t
r
(
W
T
C
X
W
)
+
λ
(
W
T
W
−
I
)
\quad J(W)=-tr(W^TC_XW)+\lambda(W^TW-I)
J(W)=−tr(WTCXW)+λ(WTW−I)
∂ J ( W ) ∂ W = − C X W + λ W \frac{\partial J(W)}{\partial W}=-C_XW+\lambda W ∂W∂J(W)=−CXW+λW
令 ∂ J ( W ) ∂ W = 0 得, C X W − λ W = 0 ,即 C X W = λ W \text{令}\frac{\partial J(W)}{\partial W}=0\text{得,}C_XW-\lambda W=0\quad\text{,即}C_XW=\lambda W 令∂W∂J(W)=0得,CXW−λW=0,即CXW=λW
C
Y
=
P
C
X
P
T
=
W
T
C
X
W
=
W
T
λ
W
=
λ
I
C_Y=PC_XP^T=W^TC_XW=W^T\lambda W=\lambda I
CY=PCXPT=WTCXW=WTλW=λI
即,想要的最大方差,就是原始协方差矩阵最大的特征值,最佳投影方向就是最大特征值所对应特征向量
步骤为:
(1) 原始数据去中心化
(2) 计算原始数据的协方差矩阵
(3) 求出协方差矩阵特征值和特征向量
(4) 降为d维,则选择最大d个特征值对应特征向量组成矩阵
(5) 计算投影之后的数据
8.2 实现
8.2.1 数据集介绍
ORL Dataset 是剑桥大学 AT&T 实验室制作的人脸数据集,其包含从 1992 年 4 月到 1994 年 4 月期间实验室成员的人脸图像。
该数据集的图像分为 40 个不同主题,其中每个主题包含 10 幅图像。
8.2.2 实现
pca_compress:这个函数用于执行PCA压缩,将高维数据降到低维。
计算数据的均值并从数据中移除均值。计算协方差矩阵。计算协方差矩阵的特征值和特征向量。根据特征值的大小排序特征向量,选择前k个。将原始数据转换到新的低维空间。
def pca_compress(data_mat, k=9999999):
mean_vals = np.mean(data_mat, axis=0)
mean_removed = data_mat - mean_vals
cov_mat = np.cov(mean_removed, rowvar=1)
eig_vals, eig_vects = np.linalg.eig(np.mat(cov_mat))
eig_val_idx = np.argsort(eig_vals)
eig_val_idx = eig_val_idx[:-(k + 1):-1]
re_eig_vects = eig_vects[:, eig_val_idx]
low_dim_data = re_eig_vects.T * mean_removed
return low_dim_data, mean_vals, re_eig_vects
test_img:用于测试一个新的图像,并将其投影到通过PCA获得的数据的子空间。通过减去均值,然后乘以低维数据转换矩阵的转置来将测试图像转换到低维空间。
def test_img(img, mean_vals, low_dim_data):
mean_removed = img - mean_vals
return mean_removed * low_dim_data.T
compute_distance:计算两个向量之间的欧氏距离
def compute_distance(vector1, vector2):
return np.linalg.norm(np.array(vector1)[0] - np.array(vector2)[0])
compute_distance_:计算两个向量之间的余弦距离
def compute_distance_(vector1, vector2):
return np.dot(np.array(vector1)[0], np.array(vector2)[0]) / (np.linalg.norm(np.array(vector1)[0]) * (np.linalg.norm(np.array(vector2)[0])))
main函数:
加载训练数据,每个人的1到9号图像,对数据进行PCA压缩。
测试,加载每个人的10号图像,并计算其与训练数据的低维表示之间的余弦距离。
if __name__ == '__main__':
# 1. use num 1- 9 image of each person to train
data = []
for i in range(1, 41):
for j in range(1, 10):
img = cv.imread('orl_faces/s' + str(i) + '/' + str(j) + '.pgm', 0)
width, height = img.shape
img = img.reshape((img.shape[0] * img.shape[1]))
data.append(img)
low_dim_data, mean_vals, re_eig_vects = pca_compress(data, 90)
# 2. use num 10 image of each person to test
correct = 0
for k in range(1, 41):
img = cv.imread('orl_faces/s' + str(k) + '/10.pgm', 0)
img = img.reshape((img.shape[0] * img.shape[1]))
distance = test_img(img, mean_vals, low_dim_data)
distance_mat = []
for i in range(1, 41):
for j in range(1, 10):
distance_mat.append(compute_distance_(re_eig_vects[(i - 1) * 9 + j - 1], distance.reshape((1, -1))))
num_ = np.argmax(distance_mat)
class_ = int(np.argmax(distance_mat) / 9) + 1
if class_ == k:
correct += 1
print('s' + str(k) + '/10.pgm is the most similar to s' +
str(class_) + '/' + str(num_ % 9 + 1) + '.pgm')
print("accuracy: %lf" % (correct / 40))
8.2.3 结果
8.3 总结
8.3.1 优点
降低维度:PCA可以减少数据的维度,减少数据量,简化模型或可视化。
去除噪声:PCA可以去除数据中的噪声和冗余信息,提高数据质量。
数据压缩:通过保留主要成分,可以实现对原始数据的压缩,减少存储和计算成本。
提高效率:去除冗余信息后,模型的训练和预测效率会得到提高。
8.3.2 缺点
可能会损失信息:由于PCA是通过保留主要成分来降低维度,所以可能会丢失一些次要的但有用的信息。
对异常值敏感:PCA受到异常值的影响较大,因为它的目标是最小化所有数据点的距离,所以异常值会对主成分的方向产生较大影响。
不保证最优:PCA虽然能够找到方差最大的方向,但并不一定能找到数据的最优低维表示。
难以解释:PCA的变换矩阵通常是难以解释的,尤其是在非线性数据中。
8.3.3 LDA
目标:
寻找一个投影矩阵W,使得投影之后数据样本同类的接近,而不同类的远离
类间远: D ( S 1 , S 2 ) = ∥ W T ( u 1 − u 2 ) ∥ F 2 D(S_1,S_2)=\|W^T(u_1-u_2)\|_F^2 D(S1,S2)=∥WT(u1−u2)∥F2
类内近:
V a r ( S 1 n e w ) = ∥ W T ( S 1 − u 1 ) ∥ F 2 V a r ( S 2 n e w ) = ∥ W T ( S 2 − u 2 ) ∥ F 2 \begin{aligned}Var(S_1^{new})&=\|W^T(S_1-u_1)\|_F^2\\\\Var(S_2^{new})&=\|W^T(S_2-u_2)\|_F^2\end{aligned} Var(S1new)Var(S2new)=∥WT(S1−u1)∥F2=∥WT(S2−u2)∥F2
组合一下即求
a r g max J ( W ) = D ( S 1 , S 2 ) V a r ( S 1 n e w ) + V a r ( S 2 n e w ) arg\max J\left(W\right)=\frac{D\left(S_{1},S_{2}\right)}{Var(S_{1}^{new})+Var(S_{2}^{new})} argmaxJ(W)=Var(S1new)+Var(S2new)D(S1,S2)
类间散度: s b = ∑ i = 1 C ( u i − u ) ( u i − u ) T s_b=\sum_{i=1}^C(u_i-u)(u_i-u)^T sb=∑i=1C(ui−u)(ui−u)T
类内散度: s W = ∑ i = 1 C ∑ x ∈ S i ( x − u i ) ( x − u i ) T s_W=\sum_{i=1}^C\sum_{x\in S_i}(x-u_i)(x-u_i)^T sW=∑i=1C∑x∈Si(x−ui)(x−ui)T
原公式可以化为:
max
J
(
W
)
=
W
T
s
b
W
W
T
s
W
W
\max J\left(W\right)=\frac{W^Ts_bW}{W^Ts_WW}
maxJ(W)=WTsWWWTsbW
min − W T s b W s . t . , W T s W W = 1 \begin{aligned}\min-&W^Ts_bW\\s.t.,&W^Ts_WW=1\end{aligned} min−s.t.,WTsbWWTsWW=1
J
(
W
)
=
W
T
s
b
W
−
λ
(
W
T
s
W
W
−
1
)
J(W)=W^Ts_bW-\lambda(W^Ts_WW-1)
J(W)=WTsbW−λ(WTsWW−1)
J
(
W
)
W
=
2
s
b
W
−
2
λ
s
W
W
=
0
\frac{J(W)}W=2s_bW-2\lambda s_WW=0
WJ(W)=2sbW−2λsWW=0
s
W
−
1
s
b
W
=
λ
W
s_W^{-1}s_bW=\lambda W
sW−1sbW=λW
(1) 计算类内散度矩阵S w _\mathrm{w} w和类间散度矩阵S
(2) 求出S w − 1 S b ^{-1}_wS_b w−1Sb的特征值和特征向量
(3) 降为d维,则选择最大d个特征值对应特征向量组成矩阵
(4) 计算投影之后的数据