机器学习降维之主成分分析

1. 主成分基本思想

主成分基本思想:在主成分分析中,首先对给定数据进行规范化,使得数据每一个变量的平均值维0,方差为1,之后对数据进行正交变换,原来由线性相关变量表示的数据,通过正交变换变成由若干个线性无关的新变量表示的数据。新变量是可能的正交变换中变量的方差的和最大的,方差表示了新变量上信息的大小,将新变量依次称为第一主成分,第二主成分等

通过主成分分析,可以利用主成分近似地表示原始数据,这可理解为发现数据的'基本结构',也可以把数据由少数主成分表示,这可理解为数据降维

2. 总体主成分定义

X=(x1,x2,x3,...,xm)Tmμ,μ=E(X)=(μ1,μ2,...,μm)T

ξ,ξ=cov(xi,xj)=E[(xiμ)(xjμ)T]

mxmy=(y1,y2,...,ym)T线

yi=aiTX=a1ix1+a2ix2+...+amixm

其中aiT=(a1i,a2i,...,ami)

由随机变量的性质可以知道:

E(yi)=aiTμ

var(yi)=aiTξai

cov(yi,yj)=aiTξaj

下面给出总体主成分的定义

定义(总体主成分):给定一个上面yi=aiTX=a1ix1+a2ix2+...+amixm的线性变换,如果满足下列条件:

  • (1)系数向量aiTaiTai=1
  • (2)yiyj0
  • (3)y1X线;y2y1X线; yiy1,y2,...,yi1X线; y1,y2,...,ymX...m

3. 样本均值和方差

假设对m维随机变量X=(x1,x2,...,xm)T进行n次独立观测,x1,x2,...,xn表示观测样本,其中xj=(x1j,x2j,...,xmj)T表示第j个观测样本,xijji

给定样本矩阵X,可以估计样本均值,以及样本协方差,样本均值向量x~=1nj=1nxj

样本方差S=1n1j=1n(xikx~i)(xjkj~)

3.1 样本方差推导

样本方差公式$$S = \frac{1}{n-1}\sum_{i=1}n(x_i-\mu_i)2S = \frac{1}{n-1}[(X-\frac{1}{n}XTI_nI_nT)T(X-\frac{1}{n}XTI_nI_n^T)]$$

S=1n1XT(In1nInInT)(In1nInInT)X

H=In1nInInTS=1n1XTHX
其中H为等幂矩阵HH=H和中心矩阵HnIn=0

4. PCA求解流程

  • (1)数据归一化,均值为0,方差为1
  • (2)计算协方差矩阵
  • (3)计算协方差矩阵的特征值和特征向量
  • (4)将特征值从大到小排序
  • (5)保留最上面的N个特征向量
  • (6)将数据转换到上述N个特征向量构建的新空间中

4.1 python实现PCA

def pca(dataMat, topNfeat=9999999):
    meanVals = mean(dataMat, axis=0)
    meanRemoved = dataMat - meanVals #remove mean
    covMat = cov(meanRemoved, rowvar=0)
    eigVals,eigVects = linalg.eig(mat(covMat))
    eigValInd = argsort(eigVals)            #sort, sort goes smallest to largest
    eigValInd = eigValInd[:-(topNfeat+1):-1]  #cut off unwanted dimensions
    redEigVects = eigVects[:,eigValInd]       #reorganize eig vects largest to smallest
    lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat

5. PCA最小平方误差理论推导

PCA求解其实是寻找最佳投影方向,即多个方向的标准正交基构成一个超平面。

理论思想:在高维空间中,我们实际上是要找到一个d维超平面,使得数据点到这个超平面的距离平方和最小

假设xk表示p维空间的k个点,zk表示xk在超平面D上的投影向量,W=w1,w2,...,wd为D维空间的标准正交基,即PCA最小平方误差理论转换为如下优化问题zk=i=1d(wiTxk)wi(1)

argmini=1k||xkzk||22

s.t.wiTwj=p(i==jp=1,p=0)

注:wiTxk为x_k在w_i基向量的投影长度,wiTxkwi为w_i基向量的坐标值

求解:

L=(xkzk)T(xkzk)

L=xkTxkxkTzkzkTxk+zkTzk

由于向量内积性质xkTzk=zkTxk

L=xkTxk2xkTzk+zkTzk

将(1)带入得$$x_k^Tz_k = \sum_{i=1}dw_iTx_kx_k^Tw_i$$

zkTzk=i=1dj=1d(wiTxkwi)T(wjTxkwj)

根据约束条件s.t.得$$z_k^Tz_k = \sum_{i=1}dw_iTx_k^Tx_kw_i$$

L=xkTxki=1dwiTxkxkTwi

根据奇异值分解$$\sum_{i=1}dw_iTx_kx_k^Tw_i = tr(WTx_kTx_kW)$$

L=argmini=1kxkTxktr(WTxkTxkW)=argmini=1ktr(WTxkTxkW)+C

等价于带约束得优化问题:$$argmaxtr(WTXXTW)$$

s.t.WTW=I

最佳超平面W与最大方差法求解的最佳投影方向一致,即协方差矩阵的最大特征值所对应的特征向量,差别仅是协方差矩阵ξ的一个倍数

5.1 定理

argminϕ(W,Z|X)=tr((XWTZ)T(XWTZ))=||XWTZ||F2

s.t.WTW=Iq

注:X为(n,p),Z为(n,q),q < p,w为(p,q)

该定理表达的意思也就是平方差理论,将降维后的矩阵通过W^T投影回去,再与X计算最小平方差,值越小说明信息损失越少

ϕ目标函数最小时,W为X的前q个特征向量矩阵且Z=WTX

以上优化可以通过拉格朗日对偶问题求得,最终也会得到$$argmaxtr(WTXXTW)$$

s.t.WTW=I

6. 核PCA推导

核函数:设X是输入空间(Rn的子集或离散子集),又F为特征空间(希尔伯特空间),如果存在一个从X到F的隐射ϕ(X):X>F使得对所有x,z\in X,函数K(x,z)满足条件K(x,z)=ϕ(x)ϕ(z)

下面推导F投影到的主成分定义的平面,根据F样本方差的特征值分解得(为推导方便去掉前面的(1n1)FTHFVi=λiVi由于H为等逆矩阵,则FTHHFVi=λiVi

由于想得到F很难,我们换一种思路将求F转移求K上,根据AAT与ATA的关系:非零特质值相同,得到HFFTHUi=λiUi

两边同时乘以FTH得到$$FTHHFFTHU_i = \lambda _iF^THU_i$$

从上式可以得到FTHUiFTHHF的特征向量

FTHUi进行归一化$$U_{normal} = \frac{FTHU_i}{{||U_iTHFF^THU_i||}_2}$$

由于HFFTH=HKH=λi,则$$U_{normal} = \lambda {-\frac{1}{2}}FTHU_i$$

F投影到Unormal定义的平面P=FcenterUnormal

P=(F1ni=1nFi)(λ12FTHUi)

P=(F1nFTIn)(λ12FTHUi)

P=λ12(K1nK(x,xi))HUi

附:奇异值分解

奇异值分解是一个能适用于任意矩阵的一种分解方法:A=UξVT

假设A是一个MN的矩阵,那么U就是MM的方阵(里面的向量是正交的,U里面向量为左奇异向量),ξ为MN的实数对角矩阵(对角线以外的元素都是0,对角线上的元素为奇异值),
VT是一个N
N的矩阵(里面的向量是正交的,V里面的向量称为右奇异向量)

再结合特征值分解:(ATA)Vi=λiVi

上面得到的Vi就是奇异值分解种的右奇异向量,λi为特征值

此外我们还可以得到:σi=λi\ui=1σiAVi

上面的σiui为左奇异向量

常见的做法是将奇异值由大到小排列,在大多数情况下,前10%甚至1%的奇异值的和就占了全部奇异值和的99%以上,也就是说我们可以用前r大的奇异值来近似描述矩阵

Am×nUm×rξr×rVr×nT

r是一个远小于m,n的数

参考资料:

  • (1)李航老师的<统计学习方法>
  • (2)<机器学习实战基于Scikit-Learn和TensorFlow>
  • (3)<百面机器学习>
posted @   Fate0729  阅读(2017)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2018-07-18 I/O多路复用方案
2018-07-18 linux下安装boost
点击右上角即可分享
微信分享提示