栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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)=(n−1)∑(Xi−X)(Yi​−Y)​
协方差矩阵:在统计学与概率论中,协方差矩阵的每个元素是各个向量元素之间的协方差。特殊的,矩阵对角线上的元素分别是向量的方差。
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.假设xxx为mmm 维随机变量,其均值为μmuμ,协方差矩阵为ΣSigmaΣ。

考虑由mmm维随机变量xxx到mmm维随机变量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​=αiT​x=k=1∑m​αki​xk​,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,⋯,malpha _ { 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(i≠j);

(3)变量y1y_1y1​是xxx的所有线性变换中方差最大的;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​,⋯,yi−1​,(i=1,2,⋯,m)都不相关的xxx的所有线性变换中方差最大的;这时分别称y1,y2,⋯,ymy _ { 1 } , y _ { 2 } , cdots , y _ { m }y1​,y2​,⋯,ym​为xxx的第一主成分、第二主成分、…、第mmm主成分。

假设xxx是mmm维随机变量,其协方差矩阵是ΣSigmaΣ,ΣSigmaΣ的特征值分别是λ1≥λ2≥⋯≥λm≥0lambda _ { 1 } geqlambda _ { 2 } geq cdots geq lambda _ { m } geq 0λ1​≥λ2​≥⋯≥λm​≥0,特征值对应的单位特征向量分别是α1,α2,⋯,αmalpha _ { 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​=αiT​x=k=1∑m​αki​xk​,i=1,2,⋯,m
并且,xxx的第iii主成分的方差是协方差矩阵ΣSigmaΣ的第iii个特征值,即var⁡(yi)=αiTΣαi=λioperatorname { 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σiisum _ { i = 1 } ^ { m } lambda _ { i } = sum _ { i = 1 } ^ { m } sigma _ { i i }i=1∑m​λi​=i=1∑m​σii​
其中σiisigma _ { i i }σii​是x2x_2x2​的方差,即协方差矩阵ΣSigmaΣ的对角线元素。

主成分yky_kyk​与变量x2x_2x2​的相关系数ρ(yk,xi)rho ( y _ { k } , x _ { i } )ρ(yk​,xi​)称为因子负荷量(factor loading),它表示第kkk个主成分yky_kyk​与变量xxx的相关关系,即yky_kyk​对xxx的贡献程度。
ρ(yk,xi)=λkαikσii,k,i=1,2,⋯,mrho ( 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=[x1​​x2​​⋯​xn​​]=⎣⎢⎢⎡​x11​x21​⋮xm1​​x12​x22​⋮xm2​​⋯⋯⋯​x1n​x2n​⋮xmn​​⎦⎥⎥⎤​

其中xj=(x1j,x2j,⋯,xmj)Tx _ { j } = ( x _ { 1 j } , x _ { 2 j } , cdots , x _ { m j } ) ^ { T }xj​=(x1j​,x2j​,⋯,xmj​)T是xxx的第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,⋯,mleft. 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​=n−11​∑k=1n​(xik​−xi​)(xjk​−xj​)i=1,2,⋯,m,j=1,2,⋯,m​

给定样本数据矩阵XXX,考虑向量xxx到yyy的线性变换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=[a1​​a2​​⋯​am​​]=⎣⎢⎢⎡​a11​a21​⋮am1​​a12​a22​⋮am2​​⋯⋯⋯​a1m​a2m​⋮amm​​⎦⎥⎥⎤​

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

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

一般地,样本第iii主成分yi=aiTxy _ { i } = a _ { i } ^ { T } xyi​=aiT​x是在aiTai=1a _ { i } ^ { T } a _ { i } = 1aiT​ai​=1和aiTxja _ { i } ^ { T } x _ { j }aiT​xj​与akTxj(k

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

(1)相关矩阵的特征值分解算法。针对m×nm times nm×n样本矩阵XXX,求样本相关矩阵
R=1n−1XXTR = frac { 1 } { n - 1 } X X ^ { T }R=n−11​XXT
再求样本相关矩阵的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′=n−1​1​XT
对矩阵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≥...≥λnlambda_1 geq lambda_2 geq ... geq lambda_nλ1​≥λ2​≥...≥λn​,则n’可以通过下式得到:∑i=1n′λi∑i=1nλi≥tfrac{sumlimits_{i=1}^{n'}lambda_i}{sumlimits_{i=1}^{n}lambda_i} geq t i=1∑n​λi​i=1∑n′​λi​​≥t

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 = USigma 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,方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/219050.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号