1.PCA原理
PCA的目的是找出数据中最主要的方面,用数据最主要的方面来代替原始数据。
于PCA的原理有两种解释,一种为最小投影距离,另一种为最大投影方差。
这里从最大投影方差来推理PCA:
(1)
m
m
m个
n
n
n维样本,将数据中心化后满足:
∑
i
=
1
m
x
i
=
0
\sum _{i=1}^{m}x^{i}=0
i=1∑mxi=0
(2)投影基坐标
W
=
(
w
1
,
w
2
,
w
3
,
.
.
.
,
w
k
)
\mathbf{W}=(\mathbf{w}_{1},\mathbf{w}_{2},\mathbf{w}_{3},...,\mathbf{w}_{k})
W=(w1,w2,w3,...,wk),为标准正交基,
k
k
k为要降到的维数,即:
w
i
T
w
i
=
1
,
w
i
w
j
=
0
\mathbf{w}^{T}_{i}\mathbf{w}_{i}=1,\mathbf{w}_{i}\mathbf{w}_{j}=0
wiTwi=1,wiwj=0
(3)投影后第
i
i
i个样本
x
i
\mathbf{x_{i}}
xi在新坐标系中的坐标为
x
i
T
W
\mathbf{x_{i}}^{T}\mathbf{W}
xiTW,则协方差矩阵为:
∑
i
=
1
m
(
x
i
T
W
)
T
x
i
T
W
=
W
T
X
X
T
W
\sum_{i=1}^{m}(\mathbf{x_{i}}^{T}\mathbf{W})^{T}\mathbf{x_{i}}^{T}\mathbf{W}=\mathbf{W^{T}XX^{T}W}
i=1∑m(xiTW)TxiTW=WTXXTW
其中,
X
∈
R
m
×
n
,
W
∈
R
n
×
k
\mathbf{X}\in R^{m\times n},\mathbf{W}\in R^{n\times k}
X∈Rm×n,W∈Rn×k。
最大化投影方差等价于:
arg
max
W
W
T
X
X
T
W
s
.
t
.
W
T
W
=
E
\arg \max_{\mathbf{W}}\mathbf{W^{T}XX^{T}W}\\ s.t. \mathbf{W^{T}W}=E
argWmaxWTXXTWs.t.WTW=E
针对每个基坐标
w
i
\mathbf{w}_{i}
wi:
arg
max
w
i
w
i
T
X
X
T
w
i
s
.
t
.
w
i
T
w
i
=
1
\arg \max_{\mathbf{w}_{i}}\mathbf{w^{T}_{i}XX^{T}w_{i}}\\ s.t. \mathbf{w^{T}_{i}w_{i}}=1
argwimaxwiTXXTwis.t.wiTwi=1
2.参数学习
带约束的最优化问题,使用拉格朗日乘子法:
J
(
w
i
)
=
w
i
T
X
X
T
w
i
−
λ
(
1
−
w
i
T
w
i
)
J(\mathbf{w}_{i})=\mathbf{w^{T}_{i}XX^{T}w_{i}}-\lambda(1-\mathbf{w^{T}_{i}w_{i}})
J(wi)=wiTXXTwi−λ(1−wiTwi)
其中,
w
i
∈
R
n
×
1
,
X
∈
R
n
×
m
,
J
(
w
i
)
∈
R
\mathbf{w}_{i}\in R^{n\times 1},\mathbf{X}\in R^{n\times m},J(\mathbf{w}_{i})\in R
wi∈Rn×1,X∈Rn×m,J(wi)∈R。
要求
∂
J
(
w
i
)
∂
w
i
\frac{\partial J(\mathbf{w}_{i})}{\partial \mathbf{w}_{i}}
∂wi∂J(wi),标量对向量求导,使用矩阵微分:
d
J
=
t
r
[
d
J
]
=
t
r
[
d
(
w
i
T
)
X
X
T
w
i
+
w
i
T
X
X
T
d
(
w
i
)
+
λ
d
(
w
T
)
i
w
i
+
λ
w
i
T
d
(
w
i
)
]
=
t
r
[
2
(
w
i
T
X
X
T
+
λ
w
i
T
)
d
(
w
i
)
]
\begin{aligned} dJ&= tr[dJ]\\ &=tr[d(\mathbf{w^{T}_{i})XX^{T}w_{i}}+\mathbf{w^{T}_{i}XX^{T}}d(\mathbf{w_{i}})+\lambda d(\mathbf{w^{T})_{i}w_{i}}+\lambda \mathbf{w^{T}_{i}}d(\mathbf{w_{i}})]\\ &=tr[2(\mathbf{w^{T}_{i}XX^{T}}+\lambda \mathbf{w^{T}_{i}})d(\mathbf{w_{i}})] \end{aligned}
dJ=tr[dJ]=tr[d(wiT)XXTwi+wiTXXTd(wi)+λd(wT)iwi+λwiTd(wi)]=tr[2(wiTXXT+λwiT)d(wi)]
最终求得梯度向量:
∂
J
(
w
i
)
∂
w
i
=
(
w
i
T
X
X
T
+
λ
w
i
T
)
T
=
X
X
T
w
i
+
λ
w
i
=
0
\frac{\partial J(\mathbf{w}_{i})}{\partial \mathbf{w}_{i}}=(\mathbf{w^{T}_{i}XX^{T}}+\lambda \mathbf{w^{T}_{i}})^{T}=\mathbf{XX^{T}w_{i}}+\lambda \mathbf{w_{i}}=0
∂wi∂J(wi)=(wiTXXT+λwiT)T=XXTwi+λwi=0
从而得到:
X
X
T
w
i
=
−
λ
w
i
\mathbf{XX^{T}w_{i}}=-\lambda \mathbf{w_{i}}
XXTwi=−λwi
求极值问题转变为求样本协方差矩阵的特征值和特征向量。
3.PCA流程
输入:样本集
X
∈
R
n
×
m
\mathbf{X} \in R^{n\times m}
X∈Rn×m,要降到的维度数
k
k
k。
输出:降维后的数据集
Y
\mathbf{Y}
Y。
(1)零均质化所有样本:
x
‾
=
1
m
∑
i
=
1
m
x
i
x
i
=
x
i
−
x
‾
\overline{\mathbf{x}}=\frac{1}{m}\sum_{i=1}^{m}\mathbf{x}^{i}\\ \mathbf{x}^{i}=\mathbf{x}^{i}-\overline{\mathbf{x}}
x=m1i=1∑mxixi=xi−x
(2)求协方差矩阵
X
X
T
\mathbf{XX^{T}}
XXT的所有特征值和特征向量。
(3)选择最大的
k
k
k个特征值,按照从大到小排列成矩阵
P
∈
R
k
×
n
\mathbf{P}\in R^{k\times n}
P∈Rk×n。
(4)进行降维:
Y
=
P
X
\mathbf{Y}=\mathbf{PX}
Y=PX
4.核主成分分析
有时候,数据不是线性可分的,即不存在一个线性超平面使其直接投影进行PCA降维,因此,需要将数据先投影到较高的维度上,使其在高维线性可分,然后再投影到要降到的维度。
5.sklearn实现PCA
(1)数据集
生成数据。1000个样本,每个样本有3个维度,中心点分别为,[0,0,0],[1,1,1],[2,2,2],[3,3,3],标准差分别为,[0.2, 0.1, 0.2, 0.2],随机种子为1。
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x,y=make_blobs(n_samples=1000,n_features=3,centers=[[0,0,0],[1,1,1],[2,2,2],[3,3,3]],
cluster_std=[0.2, 0.1, 0.2, 0.2],random_state=1)
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
plt.scatter(x[:,0],x[:,1],x[:,2])
plt.show()
(2)模型训练
训练模型。
参数n_components:可以设置为整数,表示所有降到的维度;也可以设置为(0,1]之间的一个数,此时表示主成分的方差和所占的最小比例阈值;也可以设置为’mle’,此时PCA类会用MLE算法根据特征的方差分布情况自己去选择一定数量的主成分特征来降维。
自主选择降维维度:
from sklearn.decomposition import PCA
model1 = PCA(n_components='mle')
x1 = model1.fit_transform(x)
print(x1.shape)
输出:
(1000, 1)
设置维度为2:
model2=PCA(n_components=2)
x2 = model2.fit_transform(x)
print(x2.shape)
输出:
(1000, 2)