机器学习:维数约减算法PCA(主成分分析法)原理、实现与应用

算法目标

PCA的目标就是实现维数约减,即在尽可能保留信息的同时减少数据的维度。通过维数约减,我们可以实现数据压缩节省存储空间,还能加快一些算法的运算速度。

具体来讲,PCA算法要在高维空间中找到一个低维度的面(子空间),使高维空间中的点到自身投影到低维子空间的对应点之间的距离之和(也称投影误差)最小。下面是一些简单的例子,它们可以被可视化,分别是从二维平面投影到一条直线和从三维空间投影到一张平面。
在这里插入图片描述

预处理

首先在运行PCA算法之前对数据进行特征缩放与均值归一化,使所有数据均值为0且取值范围相近,这将有利于我们找到投影子空间。实施过程也很简单,对于每一维特征值,先求出均值,然后减去均值,再除以方差或二分之一极差。

算法过程

假设我们想把 n n n维的数据降低到 k k k维。

首先,求出协方差矩阵 Σ \Sigma Σ
Σ = 1 m ∑ i = 1 m ( x ( i ) ) ( x ( i ) ) T \Sigma=\frac{1}{m}\sum_{i=1}^m(x^{(i)})(x^{(i)})^T Σ=m1i=1m(x(i))(x(i))T
若定义样本矩阵为
X = [ − ( x ( 1 ) ) T − − ( x ( 2 ) ) T − ⋮ − ( x ( m ) ) T − ] X=\left[\begin{matrix} -(x^{(1)})^T-\\ -(x^{(2)})^T-\\ \vdots\\ -(x^{(m)})^T-\\ \end{matrix}\right] X=(x(1))T(x(2))T(x(m))T
则上面的求和式可直接写为
Σ = 1 m X T X \Sigma=\frac{1}{m}X^TX Σ=m1XTX

接下来,求解该矩阵的特征向量,在matlab中,可以使用svd函数,进行奇异值分解,对于协方差矩阵该函数的结果就是它的特征向量。具体的使用方式为

[U,S,V]=svd(Sigma);

取出 n × n n\times n n×n矩阵U中的前 k k k列,就得到了我们的 k k k个向量,它们张开的 k k k维子空间就是我们要投影的空间,我们把这前 k k k列提取出来后构成的矩阵称为 U r U_r Ur

要求样本向量在这个子空间的投影,则将 U r U_r Ur转置( k × n k\times n k×n),乘以样本的特征列向量 x ⃗ \vec{x} x n × 1 n\times 1 n×1),得到降维后的特征向量 z ⃗ = U r T x ⃗ \vec{z}=U_r^T\vec{x} z =UrTx k × 1 k\times 1 k×1)。对于上面定义的样本矩阵,则是
Z = X U r Z=XU_r Z=XUr
证明吴恩达说难,不给我讲,我也不急着学。

逆过程

逆过程不是完全还原,还原后的数据跟使用PCA之前的数据是有略微不同的,在 n n n维空间中看,还原后的数据点都落在 U r U_r Ur中的向量张开的 k k k维子空间里(比如2D压缩到1D再还原,还原后的点都在同一直线上,而不会是压缩前那样在直线左右略有误差的情况)。公式为
x ⃗ approx = U r z ⃗ \vec{x}_{\text{approx}}=U_r\vec{z} x approx=Urz
推广到 m m m行(即每行一个样本)的矩阵上则是
X approx = Z U r T X_\text{approx}=ZU_r^T Xapprox=ZUrT

主成分数 k k k的选取

定义平均平方投影误差(Average Squared Projection Error)
1 m ∑ i = 1 m ∣ ∣ x ( i ) − x approx ( i ) ∣ ∣ 2 \frac{1}{m}\sum_{i=1}^m||x^{(i)}-x_\text{approx}^{(i)}||^2 m1i=1mx(i)xapprox(i)2即PCA算法希望最小化的代价函数。

再定义总变差(Total Variation)
1 m ∑ i = 1 m ∣ ∣ x ( i ) ∣ ∣ 2 \frac{1}{m}\sum_{i=1}^m||x^{(i)}||^2 m1i=1mx(i)2衡量样本长度的平均值。

一般而言,我们希望选择的 k k k使得
1 m ∑ i = 1 m ∣ ∣ x ( i ) − x approx ( i ) ∣ ∣ 2 1 m ∑ i = 1 m ∣ ∣ x ( i ) ∣ ∣ 2 ≤ 0.01 \frac{\frac{1}{m}\sum_{i=1}^m||x^{(i)}-x_\text{approx}^{(i)}||^2}{\frac{1}{m}\sum_{i=1}^m||x^{(i)}||^2}\le0.01 m1i=1mx(i)2m1i=1mx(i)xapprox(i)20.01即保存 99 % 99\% 99%的差异性(英文是variance,意义不好理解但明白 99 % 99\% 99%对应 0.01 0.01 0.01即可)。

上面这个式子计算比较复杂,我们需要把还原后的数据也计算出来。一种更简单的计算方法是利用svd返回的第二个矩阵S,这是一个对角阵,可以证明
1 m ∑ i = 1 m ∣ ∣ x ( i ) − x approx ( i ) ∣ ∣ 2 1 m ∑ i = 1 m ∣ ∣ x ( i ) ∣ ∣ 2 = 1 − ∑ i = 1 k S i i ∑ i = 1 n S i i \frac{\frac{1}{m}\sum_{i=1}^m||x^{(i)}-x_\text{approx}^{(i)}||^2}{\frac{1}{m}\sum_{i=1}^m||x^{(i)}||^2}= 1-\frac{\sum_{i=1}^kS_{ii}}{\sum_{i=1}^nS_{ii}} m1i=1mx(i)2m1i=1mx(i)xapprox(i)2=1i=1nSiii=1kSii所以一个等价的判断是
∑ i = 1 k S i i ∑ i = 1 n S i i ≥ 0.99 \frac{\sum_{i=1}^kS_{ii}}{\sum_{i=1}^nS_{ii}}\ge0.99 i=1nSiii=1kSii0.99
这样,要找到一个合适的 k k k,只需要调用一次svd函数,然后在S矩阵的对角线上遍历求和,直到满足上面的等式为止。

相应地,即使事先已经选定了 k k k值,你也可以通过上面的式子来衡量PCA的性能。

应用

第一个就是节省存储空间了,这个很显然。

第二个则是对其他机器学习算法中的特征值向量(如数字识别中图片的像素点灰度)进行维数约减,降低特征值维数提升算法运行速度。注意应该对训练集数据使用PCA得到 U r U_r Ur,不能包含验证集和测试集。

三则是可视化,对于一些维数较高的数据,我们无法将其可视化。但是将它们降维到2D或者3D之后,我们就可以在一张纸上将数据形象地展示出来了。

不建议的应用:将PCA用于防止过拟合。看起来PCA能减少数据的维数(即特征值数目),在机器学习的改进方法中讲到过,似乎是个防止过拟合的好方法。因为PCA在运算时并不会考虑与原数据的拟合程度(因为我们只传入的特征值 x ( i ) x^{(i)} x(i),没有使用 y ( i ) y^{(i)} y(i)),使得PCA更容易丢失原数据中的信息。虽然PCA可能会得到一个好的结果,但相较而言正则化是更加稳妥而有效的解决方案。

通常,不建议一上来就将PCA加入到你的机器学习算法中,当算法运行速度太慢或者占用空间太大的时候,我们再考虑PCA。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值