十八.降维之主成分分析(PCA)原理和sklearn实现

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=1mxi=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=1m(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} XRm×n,WRn×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λ(1wiTwi)
其中, 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 wiRn×1,XRn×m,J(wi)R
要求 ∂ J ( w i ) ∂ w i \frac{\partial J(\mathbf{w}_{i})}{\partial \mathbf{w}_{i}} wiJ(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 wiJ(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} XRn×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=1mxixi=xix
(2)求协方差矩阵 X X T \mathbf{XX^{T}} XXT的所有特征值和特征向量。
(3)选择最大的 k k k个特征值,按照从大到小排列成矩阵 P ∈ R k × n \mathbf{P}\in R^{k\times n} PRk×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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值