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

1.主成分基本思想主成分基本思想:在主成分分析中,首先对给定数据进行规范化,使得数据每一个变量的平均值维0,方差为1,之后对数据进行正交变换,原来由线性相关变量表示的数据,通过正交变换变成由若干个

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

1. 主成分基本思想

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

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

2. 总体主成分定义

\(假设X = {(x_1,x_2,x_3,…,x_m)}^T是m维随机变量,其均值向量为\mu\),$$\mu = E(X) = {(\mu_1,\mu_2,…,\mu_m)}^T$$

\(协方差矩阵是\xi\),$$\xi = cov(x_i,x_j) = E[(x_i-\mu){(x_j-\mu)}^T]$$

\(考虑由m维随机变量x到m维随机变量y = {(y_1,y_2,…,y_m)}^T的线性变换\)

\[y_i = a_i^TX = a_{1i}x_1+a_{2i}x_2+…+a_{mi}x_m \]

其中\(a_i^T = (a_{1i},a_{2i},…,a_{mi})\)

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

\[E(y_i) = a_{i}^T\mu \]

\[var(y_i) = a_i^T\xi a_i \]

\[cov(y_i,y_j) = a_i^T\xi a_j \]

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

定义(总体主成分):给定一个上面\(y_i = a_i^TX = a_{1i}x_1+a_{2i}x_2+…+a_{mi}x_m\)的线性变换,如果满足下列条件:

  • (1)系数向量\(a_i^T是单位向量,即a_i^T a_i = 1\)
  • (2)\(变量y_i与y_j互不相关,即它们的协方差为0\)
  • (3)\(变量y_1是X的所有线性变换中方差最大的;y_2是与y_1不相关的X的所有线性变换中方差最大的;\) \(一般地y_i是与y_1,y_2,…,y_{i-1}都不相关的X的所有线性变换中方差最大的;\) \(这时分别称y_1,y_2,…,y_m为X的第一主成分、第二主成分、…、第m主成分\)

3. 样本均值和方差

假设对m维随机变量\(X={(x_1,x_2,…,x_m)}^T\)进行n次独立观测,\(x_1,x_2,…,x_n\)表示观测样本,其中\(x_j={(x_{1j},x_{2j},…,x_{mj})}^T\)表示第j个观测样本,\(x_{ij}表示第j个观测样本的第i个变量\)

给定样本矩阵X,可以估计样本均值,以及样本协方差,样本均值向量$$\tilde x = \frac{1}{n}\sum_{j=1}^nx_j$$

样本方差$$S = \frac{1}{n-1}\sum_{j=1}^n(x_{ik} – \tilde x_i)(x_{jk}-\tilde j)$$

3.1 样本方差推导

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

\[S = \frac{1}{n-1}X^T(I_n – \frac{1}{n}I_nI_n^T)(I_n – \frac{1}{n}I_nI_n^T)X \]

\(H = I_n – \frac{1}{n}I_nI_n^T\)得$$S = \frac{1}{n-1}X^THX$$
其中H为等幂矩阵HH=H和中心矩阵\(H_n*I_n = 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维超平面,使得数据点到这个超平面的距离平方和最小

假设\(x_k\)表示p维空间的k个点,\(z_k\)表示\(x_k\)在超平面D上的投影向量,\(W = {w_1,w_2,…,w_d}\)为D维空间的标准正交基,即PCA最小平方误差理论转换为如下优化问题$$z_k = \sum_{i=1}^d (w_i^T x_k)w_i—(1)$$

\[argmin \sum_{i=1}^k||x_k – z_k||_2^2 \]

\[s.t. w_i^Tw_j = p(当i==j时p=1,否则p=0) \]

注:\(w_i^Tx_k\)为x_k在w_i基向量的投影长度,\(w_i^Tx_kw_i\)为w_i基向量的坐标值

求解:

\(L = (x_k – z_k)^T(x_k-z_k)\)

\(L= x_k^Tx_k – x_k^Tz_k – z_k^Tx_k + z_k^Tz_k\)

由于向量内积性质\(x_k^Tz_k = z_k^Tx_k\)

\(L = x_k^Tx_k – 2x_k^Tz_k + z_k^Tz_k\)

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

\[z_k^Tz_k = \sum_{i=1}^d\sum_{j=1}^d(w_i^Tx_kw_i)^T(w_j^Tx_kw_j) \]

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

\[L =x_k^Tx_k – \sum_{i=1}^dw_i^Tx_kx_k^Tw_i \]

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

\[L =argmin\sum_{i=1}^kx_k^Tx_k – tr(W^Tx_k^Tx_kW) = argmin\sum_{i=1}^k- tr(W^Tx_k^Tx_kW) + C \]

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

\[s.t. W^TW = I \]

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

5.1 定理

\[argmin\phi(W,Z|X) = tr((X-W^TZ)^T(X-W^TZ)) = ||X-W^TZ||_F^2 \]

\[s.t.W^TW=I_q \]

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

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

\(\phi\)目标函数最小时,W为X的前q个特征向量矩阵且\(Z=W^TX\)

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

\[s.t. W^TW = I \]

6. 核PCA推导

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

下面推导F投影到的主成分定义的平面,根据F样本方差的特征值分解得(为推导方便去掉前面的(\(\frac{1}{n-1}\))$$F^THFV_i = \lambda _i V_i$$由于H为等逆矩阵,则$$F^THHFV_i = \lambda _i V_i$$

由于想得到F很难,我们换一种思路将求F转移求K上,根据AAT与ATA的关系:非零特质值相同,得到$$HFF^THU_i = \lambda _iU_i $$

两边同时乘以\(F^TH\)得到$$FTHHFFTHU_i = \lambda _iF^THU_i$$

从上式可以得到\(F^THU_i\)\(F^THHF\)的特征向量

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

由于\(HFF^TH = HKH = \lambda _i\),则$$U_{normal} = \lambda {-\frac{1}{2}}FTHU_i$$

F投影到\(U_normal\)定义的平面$$P = F_{center} U_{normal}$$

\[P= (F-\frac{1}{n}\sum_{i=1}^nF_i)(\lambda ^{-\frac{1}{2}}F^THU_i) \]

\[P= (F-\frac{1}{n}F^TI_n)(\lambda ^{-\frac{1}{2}}F^THU_i) \]

\[P= \lambda ^{-\frac{1}{2}}(K – \frac{1}{n}K(x,x_i))HU_i \]

附:奇异值分解

奇异值分解是一个能适用于任意矩阵的一种分解方法:$$A = U\xi{V}^T$$

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

再结合特征值分解:$$(A^T\bullet{A})\bullet{V_i} = \lambda{_i}\bullet{V_i}$$

上面得到的\(V_i\)就是奇异值分解种的右奇异向量,\(\lambda{_i}\)为特征值

此外我们还可以得到:$$\sigma{_i} = \sqrt{\lambda{_i}}\u_i=\frac{1}{\sigma{_i}}AV_i$$

上面的\(\sigma{_i}为奇异值\)\(u_i\)为左奇异向量

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

\[A_{m\times{n}}\approx{U_{m\times{r}}\xi{_{r\times{r}}}V_{r\times{n}}^T} \]

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

参考资料:

  • (1)李航老师的<统计学习方法>
  • (2)<机器学习实战基于Scikit-Learn和TensorFlow>
  • (3)<百面机器学习>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120013.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • idea怎么远程debug_idea 多线程调试

    idea怎么远程debug_idea 多线程调试1,远程DEBUG的必要性由于部署环境的差异性,相信很多朋友都碰到过开发环境正常测试过的功能在测试环境甚至生产环境下出现bug的情况。一般情况下,生产环境可以采取的手段比较单一,即通过日志的方式获取运行中的环境上下文,分析日志文件并尝试重现bug。这会带来的问题还是不少的,首先,日志的分析是一项比较耗时的工作;其次,现有的日志记录不一定能反映出问题,你可能需要多次重复这个过程(分析日志->猜测问题->加日志->部署->获取日志)来慢慢逼近问题。倘若是测试环境,我们还多了一项可..

  • BeanUtils工具类中的copyProperties方法使用「建议收藏」

    BeanUtils工具类中的copyProperties方法使用「建议收藏」文章目录1、两个包下的BeanUtils.copyProperties对比2、BeanUtils.copyProperties的深浅拷贝问题2.1、浅拷贝和深拷贝2.2、BeanUtils.copyProperties深浅拷贝问题1、两个包下的BeanUtils.copyProperties对比BeanUtils是开发中常用到的工具类,而获取这一工具类主要是通过导入org.springframework.beans.BeanUtils或者org.apache.commons.beanutils.Bean

  • 2022最新前端经典面试试题[通俗易懂]

    1,阐述清楚浮动的几种方式(常见问题)(1)父级div定义height原理:父级div手动定义height,就解决了父级div无法自动获取到高度的问题。优点:简单、代码少、容易掌握缺点:只适合高度固定的布局,要给出精确的高度,如果高度和父级div不一样时,会产生问题(2)父级div定义overflow:hidden原理:必须定义width或zoom:1,同时不能定义heigh…

  • golang下文件锁的使用[通俗易懂]

    golang下文件锁的使用[通俗易懂]前言题目是golang下文件锁的使用,但本文的目的其实是通过golang下的文件锁的使用方法,来一窥文件锁背后的机制。为什么需要文件锁只有多线程/多进程这种并发场景下读写文件,才需要加锁,场景1-读写并发读写并发场景下,如果不加锁,就会出现读到脏数据的情况。想象一下,读文件的进程,读到第500字节,有其它进程以覆盖写的方式向文件中写入1000字节,那读进程读到的后500字节就是脏数据。场景2-写写并发写写并发场景下,如果不加锁,假设A进程先写0-1000字节,B进程写0-900字节,以此类

  • 各大技术团队博客_如何扩大团队规模

    各大技术团队博客_如何扩大团队规模BAT技术团队博客1.美团技术团队博客: 地址: http://tech.meituan.com/2. 腾讯社交用户体验设计(ISUX)地址:http://isux.tencent.com/3. 京东设计中心地址:http://jdc.jd.com4. QQ游戏设计中心地址:ht

  • 致 Python 初学者「建议收藏」

    致 Python 初学者「建议收藏」欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多Python的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触python这门编程语言,从2009年开始单一使用python应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的Python初学者走出困境、快速成长。希望我的经验能真正帮到你

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号