无监督学习 | PCA 主成分分析原理及Sklearn实现


相关文章:

机器学习 | 目录

无监督学习 | PCA 主成分分析之客户分类

1. 降维

假设你在使用一组数据来预测房价,你的数据包含以下特征:

  1. 房子面积

  2. 房间数量

  3. 附近学校排名

  4. 社区安全

但是可以看出,1、2 在于描述房子的大小,而 3、4 在描述周边环境。因此我们可以用两个新的特征来预测房价:1. 房子大小;2. 周边环境,我们称之为潜在变量。现在可能我们有很多可测量的特征,但或许只有少量的潜在特征,其中包含大部分的信息。

在本文中,我们主要讨论的是如何将维度降低,降低维度的方法有两种:1.特征选择,2. 特征提取

特征选择指的是从已有变量中选择较少的变量,如用“房子面积”来描述“房子大小”,用“社区安全”来描述“周边环境”,如逐步回归,在 Sklearn 中用 SelectKBest 选择K个最合适的特征,或用 SelectPercentile 选取前百分比的特征。

特征提取则是对同一类的变量进行融合,假设现在有很多特征可以使用,但只有一分布特征在驱动这个数据模式。因此我们希望找出一个组合特征(omposite feature,又称为主成分 principle component),从而将一大堆特征缩减至几个特征。如将“房子面积”和“房间数量”融合为“房子大小”,将“附近学校排名”和“社会安全”融合为“周边环境”,这就是降维,将维数从 4 降到了 2。

主成分分析(Principal Component Analysis, PCA)是最常用的一种降维方法,除此之外还有增量主成分分析(IPCA)、核主成分分析(KPCA)、局部线性嵌入(LLE)、多维缩放(SDA)、等度量映射(Isomap)、t-分布随机近邻嵌入(t-SNE)和线性判别(LDA)。[1]

2. PCA

假设下面是房子面积和房间数量的散点图,X 轴为房子面积,Y 轴为房间数量:

图1 房子面积与房间数量散点图

首先我们可以画出他们的主成分,如下所示:

图2 房子面积与房间数量的主成分

这看起来像个回归问题,但并不是这样的。在回归中,我们的目的是预测与输入值对应的输出值,在这里,我们并不是要预测任何值,而是算出数据的大致方向,使得我们的数据能够在尽量少地损失信息的同时映射在该方向上。

当我们找到了数据的主成分后,也就是向量的方向后,我们可以对数据进行一个映射,如下所示,我们的原始数据是二维的,但是,当我们把映射到主成分上之后,它就变成一维数据了。

图3 数据映射

下面,我将介绍如何确定主成分。

2.1 最大化方差和最小化损失

对于我们的数据,可以用一个椭圆,这个椭圆可以用两个参数来表示:短轴的距离和长轴的距离,可以看到,在长轴上,数据更加的分散,即方差更大。我们要做的就是找到方差最大的方向。

图4 方差最大化

为什么我们要找出具有最大方差的方向呢。换而言之,当我们在进行映射时,为什么要将所有数据点映射到方差最大的方向上呢?这是因为当我们沿着方差最大的方向进行映射时,它能够在最大程度上保留原有数据中所含信息。

当我们对数据进行映射时,就会造成信息损失,信息的损失量就等于某个特定的点与它在这条线上的新位置之间的距离

图5 信息损失

可以看到,对于图 5 的右图而言,此时数据在该方向上映射的方差最小,但信息损失也就最大。因此当我们将方差最大化的同时,实际上是将点与其在该线上的投影之间的距离最小化,即最小化信息损失。

2.2 坐标轴旋转

PCA 实际上是先对坐标轴进行旋转,通过计算数据映射在每个方向上的后的方差,选取前 K 个方差最大的特征。

3. PCA 推导

3.1 PCA 算法推导

假设输入样本为 Z = { Z 1 , Z 2 , . . . , Z m } Z=\{Z_1,Z_2,...,Z_m\} Z={Z1,Z2,...,Zm},我们要通过 PCA 从 m m m 维降至 k k k 维,首先对样本进行中心化,即对每个属性减去其对应的均值:

X = { Z 1 − Z 1 ˉ , Z 2 − Z 2 ˉ , . . . , Z m − Z m ˉ } = { X 1 , X 2 , . . . , X m } (1) \begin{aligned} X & = \{Z_1-\bar{Z_1}, Z_2-\bar{Z_2}, ...,Z_m-\bar{Z_m} \} \\ & = \{X_1,X_2,...,X_m\}\\ \end{aligned}\tag{1} X={Z1Z1ˉ,Z2Z2ˉ,...,ZmZmˉ}={X1,X2,...,Xm}(1)

假设经过旋转后新的坐标为 X T ⋅ W X^T \cdot W XTW,其中 W W W 为单位正交基向量矩阵( W T ⋅ W = E W^T \cdot W =E WTW=E),因此要最大化投影间隔,即最大化其方差 W T X X T W W^T X X^T W WTXXTW(中心化后均值为 0):

max ⁡ W { W T X X T W } s . t . W T W = E (2) \begin{aligned} & \max \limits_{W} \{W^T X X^T W\} \\ & s.t. W^T W =E \\ \end{aligned}\tag{2} Wmax{WTXXTW}s.t.WTW=E(2)

由拉格朗日乘数法得:

W T X X T W + λ [ E − W T W ] (3) W^T X X^T W + \lambda [E-W^T W] \tag{3} WTXXTW+λ[EWTW](3)

W W W 求导得:

∂ ∂ W { W T X X T W + λ [ E − W T W ] } = 2 X X T W − 2 λ E W = 0 (4) \frac{\partial}{\partial W}\bigg\{W^T X X^T W + \lambda [E-W^T W]\bigg\} = 2X X^T W - 2\lambda E W =0 \tag{4} W{WTXXTW+λ[EWTW]}=2XXTW2λEW=0(4)

因此有:

X X T w = λ W (5) XX^Tw=\lambda W \tag{5} XXTw=λW(5)

( λ E − X X T ) W = 0 (6) (\lambda E - XX^T)W=0 \tag{6} (λEXXT)W=0(6)

其中 X X T XX^T XXT 为样本 Z Z Z 的协方差矩阵, λ \lambda λ X X T XX^T XXT 的特征值, W W W X X T XX^T XXT 的特征向量。

将式 (5) 代入式 (2) 可得:

m a x { W T X X T W } = m a x { W T λ W } = m a x { λ W W T } = m a x λ E (7) \begin{aligned} & max\{W^T X X^T W\} \\ = & max\{W^T\lambda W\} \\ = & max\{\lambda WW^T\} \\ = & max{\lambda E} \\ \end{aligned}\tag{7} ===max{WTXXTW}max{WTλW}max{λWWT}maxλE(7)

于是,只需要对协方差矩阵 X X T XX^T XXT进行特征值分解,将求得的特征值排序: λ 1 ≥ , λ 2 ≥ , . . . , λ m \lambda_1 \geq,\lambda_2 \geq,...,\lambda_m λ1,λ2,...,λm,再取前 k k k 个特征值对应的特征向量构成投影矩阵 W = ( w 1 , w 2 , . . . , w k ) W = (w_1,w_2,...,w_k) W=(w1,w2,...,wk),这就是主成分分析的解。

主成分所占整个信息的百分比可以用下式计算:

∑ i = 1 k λ i ∑ i = 1 m λ i (8) \frac{\sum_{i=1}^k \lambda_i}{\sum_{i=1}^m \lambda_i} \tag{8} i=1mλii=1kλi(8)

PCA 算法描述如下图所示:

图6 PCA 算法

实践中常通过对 X 进行奇异值(SVD)分解来代替协方差矩阵的特征值分解。

3.2 维数选择

降维后低维空间的维数 k k k 通常是实现指定的,或通过在 k k k 值不同的低维空间中对 KNN 分类器(或其他开销较小的学习器)进行交叉验证来选去较好的 k k k 值。对 PCA,还可以从重构的角度设置一个重构阈值,例如 t = 95 % t=95\% t=95%,然后选择使下式成立的最小 k k k 值:[2]

∑ i = 1 k λ i ∑ i = 1 m λ i ≥ t (9) \frac{\sum_{i=1}^k \lambda_i}{\sum_{i=1}^m \lambda_i} \geq t \tag{9} i=1mλii=1kλit(9)

显然,低维空间与原始高维空间必有不同,因为对应于最小的 m-k 个特征值的特征向量被舍弃了,这是降维导致的结果。但是舍弃这部分信息往往是必要的:一方面,舍弃这部分信息之后能使样本的采样密度增大,这正是降维的重要动机;另一方面,当数据收到噪声影响时,最小的特征值所对应的特征向量往往与噪声有关,将它们舍弃能在一定程度起到去除噪声的效果。

4. Sklearn 实现

sklearn.decomposition.PCA (n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)

n_compoents:主成分数量,当为 0.0 到 1.0 之间的浮点数时,表示希望保留的方差比。


Methods

fit(self, X[, y]) Fit the model with X.

fit_transform(self, X[, y]) Fit the model with X and apply the dimensionality reduction on X.

get_covariance(self) Compute data covariance with the generative model.

get_params(self[, deep]) Get parameters for this estimator.

get_precision(self) Compute data precision matrix with the generative model.

inverse_transform(self, X) Transform data back to its original space.

score(self, X[, y]) Return the average log-likelihood of all samples.

score_samples(self, X) Return the log-likelihood of each sample.

set_params(self, **params) Set the parameters of this estimator.

transform(self, X) Apply dimensionality reduction to X.


查看 PCA 的详细信息:

components_:主成分

explained_variance_:解释方差

explained_variance_ratio_:解释方差比

4.1 主成分可视化

first_pc = pca.components_[0]
second_pc = pca.components_[1]

transformed_data = pca.transform(data)
for ii,jj in zip(transformed_data, data):
    plt.scatter( first_pc[0]*ii[0], first_pc[1]*ii[0], color="r")
    plt.scatter( second_pc[0]*ii[1], second_pc[1]*ii[1], color="c")
    plt.scatter( jj[0], jj[1], color="b")
   
plt.xlabel("bonus")
plt.ylabel("long-term incentive")
plt.show()
图7 安然数据集

5. 在线可视化网站

通过这个网站,你可以更直观的了解到 PCA 降维的含义。

图8 3维数据主成分

参考文献

[1] Aurelien Geron, 王静源, 贾玮, 边蕤, 邱俊涛. 机器学习实战:基于 Scikit-Learn 和 TensorFlow[M]. 北京: 机械工业出版社, 2018: 191.

[2] 周志华. 机器学习[M]. 北京: 清华大学出版社, 2016: 53-56.229-233 .

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值