为了账号安全,请及时绑定邮箱和手机立即绑定

100天搞定机器学习|Day59 主成分分析(PCA)原理及使用详解

数学概念

方差:用来衡量随机变量与其数学期望(均值)之间的偏离程度。统计中的方差(样本方差)是各个数据分别与其平均数之差的平方的和的平均数。
Var(X)=1n∑(xi−μ)2Var(X)=\frac{1}{n}\sum(x_i-μ)^2Var(X)=n1(xiμ)2
协方差:度量两个随机变量关系的统计量,协方差为0的两个随机变量是不相关的。
cov(X,Y)=∑(Xi−X‾)(Yi−Y‾)(n−1)cov(X,Y)=\frac{\sum(Xi-\overline{X})(Y_i-\overline{Y})}{(n-1)}cov(X,Y)=(n1)(XiX)(YiY)
协方差矩阵:在统计学与概率论中,协方差矩阵的每个元素是各个向量元素之间的协方差。特殊的,矩阵对角线上的元素分别是向量的方差。
C=[cov(x,x)cov(x,y)cov(x,z)cov(y,x)cov(y,y)cov(y,z)cov(z,x)cov(z,y)cov(z,z)]C=\left[ \begin{array} { c c c c } { cov(x,x) } & { cov(x,y) } & { cov(x,z) } \\ { cov(y,x) } & { cov(y,y) } & { cov(y,z) } \\{ cov(z,x) } & { cov(z,y) } & { cov(z,z) } \end{array} \right]C=cov(x,x)cov(y,x)cov(z,x)cov(x,y)cov(y,y)cov(z,y)cov(x,z)cov(y,z)cov(z,z)

PCA原理

主成分分析法(Principal Component Analysis)是一种基于变量协方差矩阵对数据进行压缩降维、去噪的有效方法,它借助正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分(PC),主成分是旧特征的线性组合。

PCA的本质就是找一些投影方向,使得数据在这些投影方向上的方差最大,而且这些投影方向是相互正交的。这其实就是找新的正交基的过程,计算原始数据在这些正交基上投影的方差,方差越大,就说明在对应正交基上包含了更多的信息量。如下图,第一个 PC 为 c1 所在的轴,第二个PC 为 c2 所在的轴,第三个 PC 为与平面正交的轴。我们仅保留一定数量的主成分来解释原始数据集的方差,而忽略其余部分。

PCA常用于高维数据的降维、数据噪音消除、图像压缩、特征脸等等。

图像压缩

PCA公式推导

1.假设xxxmmm 维随机变量,其均值为μ\muμ,协方差矩阵为Σ\SigmaΣ

考虑由mmm维随机变量xxxmmm维随机变量yyy的线性变换
yi=αiTx=∑k=1mαkixk,i=1,2,⋯,my _ { i } = \alpha _ { i } ^ { T } x = \sum _ { k = 1 } ^ { m } \alpha _ { k i } x _ { k } , \quad i = 1,2 , \cdots , myi=αiTx=k=1mαkixk,i=1,2,,m

其中αiT=(α1i,α2i,⋯,αmi)\alpha _ { i } ^ { T } = ( \alpha _ { 1 i } , \alpha _ { 2 i } , \cdots , \alpha _ { m i } )αiT=(α1i,α2i,,αmi)

如果该线性变换满足以下条件,则称之为总体主成分:

(1)αiTαi=1,i=1,2,⋯,m\alpha _ { i } ^ { T } \alpha _ { i } = 1 , i = 1,2 , \cdots , mαiTαi=1,i=1,2,,m

(2)cov⁡(yi,yj)=0(i≠j)\operatorname { cov } ( y _ { i } , y _ { j } ) = 0 ( i \neq j )cov(yi,yj)=0(ij);

(3)变量y1y_1y1xxx的所有线性变换中方差最大的;y2y_2y2是与y1y_1y1不相关的xxx的所有线性变换中方差最大的;一般地,yiy_iyi是与y1,y2,⋯,yi−1,(i=1,2,⋯,m)y _ { 1 } , y _ { 2 } , \cdots , y _ { i - 1 } , ( i = 1,2 , \cdots , m )y1,y2,,yi1,(i=1,2,,m)都不相关的xxx的所有线性变换中方差最大的;这时分别称y1,y2,⋯,ymy _ { 1 } , y _ { 2 } , \cdots , y _ { m }y1,y2,,ymxxx的第一主成分、第二主成分、…、第mmm主成分。

假设xxxmmm维随机变量,其协方差矩阵是Σ\SigmaΣΣ\SigmaΣ的特征值分别是λ1≥λ2≥⋯≥λm≥0\lambda _ { 1 } \geq\lambda _ { 2 } \geq \cdots \geq \lambda _ { m } \geq 0λ1λ2λm0,特征值对应的单位特征向量分别是α1,α2,⋯,αm\alpha _ { 1 } , \alpha _ { 2 } , \cdots , \alpha _ { m }α1,α2,,αm,则xxx的第2主成分可以写作

yi=αiTx=∑k=1mαkixk,i=1,2,⋯,my _ { i } = \alpha _ { i } ^ { T } x = \sum _ { k = 1 } ^ { m } \alpha _ { k i } x _ { k } , \quad i = 1,2 , \cdots , myi=αiTx=k=1mαkixk,i=1,2,,m
并且,xxx的第iii主成分的方差是协方差矩阵Σ\SigmaΣ的第iii个特征值,即var⁡(yi)=αiTΣαi=λi\operatorname { var } ( y _ { i } ) = \alpha _ { i } ^ { T } \Sigma \alpha _ { i } = \lambda _ { i }var(yi)=αiTΣαi=λi

3.主成分有以下性质:

主成分yyy的协方差矩阵是对角矩阵cov⁡(y)=Λ=diag⁡(λ1,λ2,⋯,λm)\operatorname { cov } ( y ) = \Lambda = \operatorname { diag } ( \lambda _ { 1 } , \lambda _ { 2 } , \cdots , \lambda _ { m } )cov(y)=Λ=diag(λ1,λ2,,λm)

主成分yyy的方差之和等于随机变量xxx的方差之和
∑i=1mλi=∑i=1mσii\sum _ { i = 1 } ^ { m } \lambda _ { i } = \sum _ { i = 1 } ^ { m } \sigma _ { i i }i=1mλi=i=1mσii
其中σii\sigma _ { i i }σiix2x_2x2的方差,即协方差矩阵Σ\SigmaΣ的对角线元素。

主成分yky_kyk与变量x2x_2x2的相关系数ρ(yk,xi)\rho ( y _ { k } , x _ { i } )ρ(yk,xi)称为因子负荷量(factor loading),它表示第kkk个主成分yky_kyk与变量xxx的相关关系,即yky_kykxxx的贡献程度。
ρ(yk,xi)=λkαikσii,k,i=1,2,⋯,m\rho ( y _ { k } , x _ { i } ) = \frac { \sqrt { \lambda _ { k } } \alpha _ { i k } } { \sqrt { \sigma _ { i i } } } , \quad k , i = 1,2 , \cdots , mρ(yk,xi)=σiiλkαik,k,i=1,2,,m

4.样本主成分分析就是基于样本协方差矩阵的主成分分析。

给定样本矩阵
X=[x1x2⋯xn]=[x11x12⋯x1nx21x22⋯x2n⋮⋮⋮xm1xm2⋯xmn]X = \left[ \begin{array} { l l l l } { x _ { 1 } } & { x _ { 2 } } & { \cdots } & { x _ { n } } \end{array} \right] = \left[ \begin{array} { c c c c } { x _ { 11 } } & { x _ { 12 } } & { \cdots } & { x _ { 1 n } } \\ { x _ { 21 } } & { x _ { 22 } } & { \cdots } & { x _ { 2 n } } \\ { \vdots } & { \vdots } & { } & { \vdots } \\ { x _ { m 1 } } & { x _ { m 2 } } & { \cdots } & { x _ { m n } } \end{array} \right]X=[x1x2xn]=x11x21xm1x12x22xm2x1nx2nxmn

其中xj=(x1j,x2j,⋯,xmj)Tx _ { j } = ( x _ { 1 j } , x _ { 2 j } , \cdots , x _ { m j } ) ^ { T }xj=(x1j,x2j,,xmj)Txxx的第jjj个独立观测样本,KaTeX parse error: Expected 'EOF', got ',' at position 6: j=1,2,̲…,n

XXX的样本协方差矩阵
S=[sij]m×m,sij=1n−1∑k=1n(xik−x‾i)(xjk−x‾j)i=1,2,⋯,m,j=1,2,⋯,m\left. \begin{array} { c } { S = [ s _ { i j } ] _ { m \times m } , \quad s _ { i j } = \frac { 1 } { n - 1 } \sum _ { k = 1 } ^ { n } ( x _ { i k } - \overline { x } _ { i } ) ( x _ { j k } - \overline { x } _ { j } ) } \\ { i = 1,2 , \cdots , m , \quad j = 1,2 , \cdots , m } \end{array} \right.S=[sij]m×m,sij=n11k=1n(xikxi)(xjkxj)i=1,2,,m,j=1,2,,m

给定样本数据矩阵XXX,考虑向量xxxyyy的线性变换y=ATxy = A ^ { T } xy=ATx
这里
A=[a1a2⋯am]=[a11a12⋯a1ma21a22⋯a2m⋮⋮⋮am1am2⋯amm]A = \left[ \begin{array} { l l l l } { a _ { 1 } } & { a _ { 2 } } & { \cdots } & { a _ { m } } \end{array} \right] = \left[ \begin{array} { c c c c } { a _ { 11 } } & { a _ { 12 } } & { \cdots } & { a _ { 1 m } } \\ { a _ { 21 } } & { a _ { 22 } } & { \cdots } & { a _ { 2 m } } \\ { \vdots } & { \vdots } & { } & { \vdots } \\ { a _ { m 1 } } & { a _ { m 2 } } & { \cdots } & { a _ { m m } } \end{array} \right]A=[a1a2am]=a11a21am1a12a22am2a1ma2mamm

如果该线性变换满足以下条件,则称之为样本主成分。样本第一主成分y1=a1Txy _ { 1 } = a _ { 1 } ^ { T } xy1=a1Tx是在a1Ta1=1a _ { 1 } ^ { T } a _ { 1 } = 1a1Ta1=1条件下,使得a1Txj(j=1,2,⋯,n)a _ { 1 } ^ { T } x _ { j } ( j = 1,2 , \cdots , n )a1Txj(j=1,2,,n)的样本方差a1TSa1a _ { 1 } ^ { T } S a _ { 1 }a1TSa1最大的xxx的线性变换;

样本第二主成分y2=a2Txy _ { 2 } = a _ { 2 } ^ { T } xy2=a2Tx是在a2Ta2=1a _ { 2 } ^ { T } a _ { 2 } = 1a2Ta2=1a2Txja _ { 2 } ^ { T } x _ { j }a2Txja1Txj(j=1,2,⋯,n)a _ { 1 } ^ { T } x _ { j } ( j = 1,2 , \cdots , n )a1Txj(j=1,2,,n)的样本协方差a1TSa2=0a _ { 1 } ^ { T } S a _ { 2 } = 0a1TSa2=0条件下,使得a2Txj(j=1,2,⋯,n)a _ { 2 } ^ { T } x _ { j } ( j = 1,2 , \cdots , n )a2Txj(j=1,2,,n)的样本方差a2TSa2a _ { 2 } ^ { T } S a _ { 2 }a2TSa2最大的xxx的线性变换;

一般地,样本第iii主成分yi=aiTxy _ { i } = a _ { i } ^ { T } xyi=aiTx是在aiTai=1a _ { i } ^ { T } a _ { i } = 1aiTai=1aiTxja _ { i } ^ { T } x _ { j }aiTxjakTxj(k<i,j=1,2,⋯,n)a _ { k } ^ { T } x _ { j } ( k < i , j = 1,2 , \cdots , n )akTxj(k<i,j=1,2,,n)的样本协方差akTSai=0a _ { k } ^ { T } S a _ { i } = 0akTSai=0条件下,使得aiTxj(j=1,2,⋯,n)a _ { i } ^ { T } x _ { j } ( j = 1,2 , \cdots , n )aiTxj(j=1,2,,n)的样本方差akTSaia _ { k } ^ { T } S a _ { i }akTSai最大的xxx的线性变换。

5.主成分分析方法主要有两种,可以通过相关矩阵的特征值分解或样本矩阵的奇异值分解进行。

(1)相关矩阵的特征值分解算法。针对m×nm \times nm×n样本矩阵XXX,求样本相关矩阵
R=1n−1XXTR = \frac { 1 } { n - 1 } X X ^ { T }R=n11XXT
再求样本相关矩阵的kkk个特征值和对应的单位特征向量,构造正交矩阵
V=(v1,v2,⋯,vk)V = ( v _ { 1 } , v _ { 2 } , \cdots , v _ { k } )V=(v1,v2,,vk)

VVV的每一列对应一个主成分,得到k×nk \times nk×n样本主成分矩阵
Y=VTXY = V ^ { T } XY=VTX

(2)矩阵XXX的奇异值分解算法。针对m×nm \times nm×n样本矩阵XXX
X′=1n−1XTX ^ { \prime } = \frac { 1 } { \sqrt { n - 1 } } X ^ { T }X=n11XT
对矩阵X′X ^ { \prime }X进行截断奇异值分解,保留kkk个奇异值、奇异向量,得到
X′=USVTX ^ { \prime } = U S V ^ { T }X=USVT
VVV的每一列对应一个主成分,得到k×nk \times nk×n样本主成分矩阵YYY
Y=VTXY = V ^ { T } XY=VTX

PCA算法流程

输入:n维样本集D=(x(1),x(2),...,x(m))D=(x^{(1)}, x^{(2)},...,x^{(m)})D=(x(1),x(2),...,x(m)),要降维到的维数n’.
输出:降维后的样本集D′D'D

1、 对所有的样本进行中心化:
KaTeX parse error: Expected 'EOF', got '&' at position 53: …imits_{j=1}^{m}&̲nbsp;x^{(j)}

2、 计算样本的协方差矩阵XXTXX^TXXT

3、 对矩阵XXTXX^TXXT进行特征值分解
4、 取出最大的n’个特征值对应的特征向量(w1,w2,...,wn′)(w_1,w_2,...,w_{n'})(w1,w2,...,wn), 将所有的特征向量标准化后,组成特征向量矩阵W。

5、 对样本集中的每一个样本x(i)x^{(i)}x(i),转化为新的样本z(i)=WTx(i)z^{(i)}=W^Tx^{(i)}z(i)=WTx(i)

6、 得到输出样本集D′=(z(1),z(2),...,z(m))D' =(z^{(1)}, z^{(2)},...,z^{(m)})D=(z(1),z(2),...,z(m))
有时候,我们不指定降维后的n’的值,而是换种方式,指定一个降维到的主成分比重阈值t。这个阈值t在(0,1]之间。假如我们的n个特征值为λ1≥λ2≥...≥λn\lambda_1 \geq \lambda_2 \geq ... \geq \lambda_nλ1λ2...λn,则n’可以通过下式得到:∑i=1n′λi∑i=1nλi≥t\frac{\sum\limits_{i=1}^{n'}\lambda_i}{\sum\limits_{i=1}^{n}\lambda_i} \geq t i=1nλii=1nλit

scikit-learn中PCA的使用方法

调用

sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False, svd_solver=‘auto’, tol=0.0, iterated_power=‘auto’, random_state=None)
参数、释义、设置

PCA 的使用简单的离谱,一般指定n_components即可,如果设置为整数,说明要保留的主成分数量。如果将其设置为小数,则说明降维后的数据能保留的信息。

上面提到主成分分析方法主要有两种,可以通过相关矩阵的特征值分解或样本矩阵的奇异值分解A=UΣVTA = U\Sigma V^TA=UΣVT进行。scikit-learn库的PCA使用的就是奇异值分解方法,通过svd_solver参数指定:

randomized:适用于数据量大,数据维度多同时主成分数目比例又较低的 PCA 降维

full:传统意义上的 SVD,使用了 scipy 库对应的实现

arpack:直接使用 scipy 库的 sparse SVD 实现,和 randomized 的适用场景类似

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.decomposition import PCA
from sklearn.datasets.samples_generator import make_blobs
 
X, y = make_blobs(n_samples=10000, n_features=3, centers=[[3, 3, 3], [0, 0, 0], [1, 1, 1], [2, 2, 2]],
                  cluster_std=[0.2, 0.1, 0.2, 0.2], random_state=9)
fig = plt.figure()
plt.scatter(X_new[:, 0], X_new[:, 1], marker='o')
plt.show()

# 降维到二维
pca = PCA(n_components=2)
pca.fit(X)
# 输出特征值
print(pca.explained_variance_)
输出特征向量
print(pca.components_)
# 降维后的数据
X_new = pca.transform(X)
print(X_new)
fig = plt.figure()
plt.scatter(X_new[:, 0], X_new[:, 1], marker='o')
plt.show()

这样我们就实现了三维到二维的转换,可以把结果可视化:

PCA算法优缺点

PCA算法优点

1,仅仅需要以方差衡量信息量,不受数据集以外的因素影响

2,各主成分之间正交,可消除原始数据成分间的相互影响的因素

3,计算方法简单,主要运算时特征值分解,易于实现

4,它是无监督学习,完全无参数限制的。

PCA算法缺点

1,主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强

2,方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消