当前位置: 首页 > news >正文

主成分分析(PCA)

1 主成分分析简介

主成分分析(Principal Component Analysis,PCA), 将多个变量通过线性变换以选出较少个数重要变量的一种多元统计分析方法。主成分分析是由卡尔·皮尔逊(Karl Pearson)于1901年发明的。通过维度约减的方式将高维度空间的数据映射到低维度空间的数据。

2 主成分分析基本原理

2.1 线性变换

主成分分析的核心思想是通过将原数据的维度进行线性变换得到一组新的数据维度(主成分)。这组新的数据维度称为主成分。主成分之间线性无关,主成分实际构建了数据新的特征维度,在该特征维度下,数据的维度可能进行了压降,数据的运算会变得更加容易。

有n个p维的样本,构成样本矩阵

X=\begin{bmatrix} x_{11} &x_{12} &... & x_{1n}\\ x_{21} &x_{22} &... & x_{2n} \\ .& .&... & . \\ x_{p1} &x_{p2} &... & x_{pn} \end{bmatrix}=\begin{bmatrix} x_{1}\\ x_{2} \\ ... \\ x_{p} \end{bmatrix}

假设有一组向量(数据)可以通过x_{1},x_{2},...,x_{p}线性表达

\left\{\begin{matrix} y_{1}=a_{11}x_{1}+a_{12}x_{2}+...+a_{1p}x_{p}\\ y_{2}=a_{21}x_{1}+a_{22}x_{2}+...+a_{2p}x_{p} \\ ... \\ y_{m}=a_{m1}x_{1}+a_{m2}x_{2}+...+a_{mp}x_{p} \end{matrix}\right.

当选择合适的系数,会构建满足条件的新的特征维度y_{1},y_{2},...,y_{m},记Y=\begin{bmatrix} y_{1}\\ y_{2} \\ ... \\ y_{m} \end{bmatrix}

记上述变换为Y=AX

其中A=\begin{bmatrix} a_{11} & a_{12} &... &a_{1p} \\ a_{21}&_{22} & ...&a_{2p} \\ .& .& .& .\\ a_{m1}& a_{m2}& ...&a_{mp} \end{bmatrix}

在构建主成分时,要求y_{i},y_{j}(i\neq j)之间线性无关,且在i<j时,X在主成分y_{i}上投影的方差大于在主成分y_{j}上的投影的方差。如此,数据X在主成分上进行了“分解”,且依据数据信息量的程度将主成分进行了区分和排序。当m<p时,实现了对数据的降维操作。

这里的变换矩阵A即为所求的变换矩阵。

2.2 协方差与相关系数

假设样本x_{1}=(x_{11},x_{12},...,x_{1n}),x_{2}=(x_{21},x_{22},...,x_{2n})

则样本x_{1}的均值为\overline{x_{1}}=\frac{1}{n}\sum_{i=1}^{n}x_{1i},方差为s_{1}=\frac{1}{n-1}\sum_{i=1}^{n}(x_{1i}-\overline{x_{1}})^{2}

样本x_{1},x_{2}的协方差为cov(x_{1},x_{2})=E(x_{1}-\overline{x_{1}})(x_{2}-\overline{x_{2}})=\frac{1}{n-1}\sum_{i=1}^{n}(x_{1i}-\overline{x_{1}})(x_{2i}-\overline{x_{2}})

样本x_{1},x_{2}的相关系数为

r_{12}=\frac{cov(x_{1},x_{2})}{\sqrt{s_{1}s_{2}}}=\frac{\frac{1}{n-1}\sum_{i=1}^{n}(x_{1i}-\overline{x_{1}})(x_{2i}-\overline{x_{2}})}{\sqrt{\frac{1}{n-1}\sum_{i=1}^{n}(x_{1i}-\overline{x_{1}})^{2}*\frac{1}{n-1}\sum_{i=1}^{n}(x_{2i}-\overline{x_{2}})^{2}}}=\frac{\sum_{i=1}^{n}(x_{1i}-\overline{x_{1}})(x_{2i}-\overline{x_{2}})}{\sqrt{\sum_{i=1}^{n}(x_{1i}-\overline{x_{1}})^{2}*\sum_{i=1}^{n}(x_{2i}-\overline{x_{2}})^{2}}}

若将样本x_{1},x_{2}标准化,即\frac{x_{1i}-\overline{x_{1}}}{\sqrt{\frac{1}{n-1}s_{1}}},\frac{x_{2i}-\overline{x_{2}}}{\sqrt{\frac{1}{n-1}s_{2}}},i=1,2,...,n,为便于表达再将其分别记为x_{1},x_{2}

则标准化后的x_{1},x_{2}的均值为0,方差为1,则其协方差矩阵与相关系数均为

r_{12}=\frac{cov(x_{1},x_{2})}{\sqrt{s_{1}s_{2}}}=\frac{1}{n-1}\sum_{i=1}^{n}x_{1i}x_{2i}

在主成分中,由于y_{i},y_{j}(i\neq j)线性无关,故y_{i},y_{j}(i\neq j)的协方差和相关系数均为0。

2.3 特征值与特征向量

现在假设X的分量x_{1},x_{2},...,x_{p}均已按前述操作进行了标准化,则X的协方差矩阵C=\frac{1}{n-1}XX^{T},为p*p的实对称阵。

存在主成分分析对应的矩阵A,使得Y=AX。则Y的协方差矩阵D=\frac{1}{n-1}YY^{T}=\frac{1}{n-1}\begin{bmatrix} y_{1}\\ y_{2} \\ ... \\ y_{m} \end{bmatrix}*\left ( y_{1},y_{2},...,y_{m} \right )

由于y_{i},y_{j}(i\neq j)线性无关,y_{i},y_{j}(i\neq j)的协方差为0,上述矩阵D为对角阵。

D=\frac{1}{n-1}YY^{T}=\frac{1}{n-1}(AX)(AX)^{T}=\frac{1}{n-1}AXX^{T}A^{T}=A(\frac{1}{n-1}XX^{T})A^{T}=ACA^{T}

如此,可以看出主成分分析的问题转化之一的要求是寻找一矩阵A,使得将实对称阵C转化为对角阵D

根据实对称阵的相关代数知识,实对称阵C一定存在一组非负特征值\lambda _{1},\lambda _{2},...,\lambda _{p}和特征向量(单位正交向量)\beta _{1},\beta _{2},...,\beta _{p},使得C\beta _{i}=\lambda _{i}\beta _{i},i=1,2,...,p,其中\beta _{i}p维向量。

B=\left (\beta _{1},\beta _{2},...,\beta _{p} \right ),则CB=B\begin{bmatrix} \lambda _{1} & & & \\ & \lambda _{2} & & \\ & & ... & \\ & & & \lambda _{p} \end{bmatrix}

由于B为正交矩阵,B^{-1}=B^{T},从而将上式左边同时乘以B^{T}得到

B^{T}CB=\begin{bmatrix} \lambda _{1} & & & \\ & \lambda _{2} & & \\ & & ... & \\ & & & \lambda _{p} \end{bmatrix}

A=B^{T},即可找出矩阵A

其对上述特征值,若将其按从大到小排列,即\lambda _{1}\geqslant \lambda _{2}\geqslant ...\geqslant \lambda _{p},则对应的矩阵A为主成分分析所求的线性变换矩阵。

如此,问题得解。

当存在特征值为0时,则m<p,起到降维的效果。

2.4 主成分的贡献

主成分的贡献率衡量的是主成分的影响。

主成分y_{i}的贡献率为\frac{\lambda_{i}}{\sum_{j=1}^{p}\lambda _{j}}

主成分的累计贡献率为\frac{\sum_{j=1}^{i}\lambda_{j}}{\sum_{j=1}^{p}\lambda _{j}}

3 主成分分析算法步骤

3.1 数据标准化

将样本X的每一个数据按照以下方式进行标准化:\frac{x_{ki}-\overline{x_{k}}}{\sqrt{\frac{1}{n-1}s_{k}}},其中\overline{x_{k}},s_{k}的定义见前文。不妨将标准化后的数据仍记为x_{ki},x_{k},X,k=1,2,...,p,i=1,2,...,n

3.2 计算协方差矩阵

C=\frac{1}{n-1}XX^{T}=\frac{1}{n-1}\begin{bmatrix} x_{1}\\ x_{2} \\ ... \\ x_{p} \end{bmatrix}*\left ( x_{1},x_{2},...,x_{p} \right )=\frac{1}{n-1}\begin{bmatrix} r_{11} & r_{12} &... &r_{1p} \\ r_{21}& r_{22}& ...& r_{2p}\\ .&. & ...& .\\ r_{p1}&r_{p2} &... &r_{pp} \end{bmatrix}

3.3 求解特征值和特征向量

记特征值为\lambda(\lambda \geqslant 0),特征向量为\beta,有

C\beta =\lambda \beta,得到方程(\lambda E-C)\beta =0   ......  (1)式。
该方程有非零解的充要条件为行列式\left | \lambda E-C \right |=0。这是一个关于\lambda的齐次线性方程组,求解该方程组,得到\lambda,并将其按从大到小排序。再将\lambda代入(1)式,可求解出特征向量\beta,并将特征向量单位化。

3.4 构造主成分

若对主成分的累计贡献率有要求,如选择累计贡献率\geqslant95%的特征值,记为\lambda _{1},\lambda _{2},...,\lambda _{m},对应的单位特征向量为\beta _{1},\beta _{2},...,\beta _{m}

B=\left (\beta _{1},\beta _{2},...,\beta _{m} \right ),令A=B^{T},利用线性变换Y=AX,得到主成分Y

4 主成分分析实例

这里用sklearn中自带的PCA模型及数据进行演示。

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
X = np.array([[-1, -2], [-2, -1], [-3, -2], [2, 1], [2, 1], [3, 2]])
X_std = StandardScaler().fit_transform(X) #数据标准化
pca = PCA(n_components=2)
pca.fit(X_std)
#查看特征值
print(pca.singular_values_)
[3.41436763 0.58488774]
#查看特征向量
print(pca.components_)
[[ 0.70710678  0.70710678][ 0.70710678 -0.70710678]]

5 主成分分析总结

(1)主成分分析的计算步骤简单,主要是求解特征值和特征向量;

(2)主成分分析的各主成分之间正交,数据运算会变得容易;

(3)当主成分的维度小于原数据维度时,可以起到降维的作用;

(4)主成分维度可能不如原数据维度直观,解释性较差;

(5)主成分分析有一些演变的方法,如核主成分分析,解决非线性问题的主成分分析问题。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 自然语言处理(NLP)--数据增强
  • 文本纠错实现定位与标记
  • JMeter进阶技巧:参数化与数据驱动测试
  • Polars简明基础教程八:Series 和 DataFrame 以及它们之间的转换_B
  • Qt窗口交互场景、子窗口数据获取
  • AcWing 723. PUM
  • 改善工作流
  • Spring Boot如何实现数据脱敏?
  • 在Spring Boot中使用MyBatis实现复杂查询和分页功能
  • Java基础之循环嵌套
  • K8S学习笔记(自用,不定期更新)
  • Docker-命令
  • Tomcat初篇
  • Java 网络编程练习
  • 新天龙八部3江山策仿官方+单机联网+GM工具
  • php的引用
  • [PHP内核探索]PHP中的哈希表
  • 《Java编程思想》读书笔记-对象导论
  • CAP 一致性协议及应用解析
  • chrome扩展demo1-小时钟
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • ES6 学习笔记(一)let,const和解构赋值
  • Fabric架构演变之路
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java Agent 学习笔记
  • JavaScript异步流程控制的前世今生
  • JDK 6和JDK 7中的substring()方法
  • maya建模与骨骼动画快速实现人工鱼
  • 编写符合Python风格的对象
  • 从零开始学习部署
  • 力扣(LeetCode)965
  • 软件开发学习的5大技巧,你知道吗?
  • elasticsearch-head插件安装
  • puppet连载22:define用法
  • 如何用纯 CSS 创作一个货车 loader
  • ​ssh免密码登录设置及问题总结
  • # Redis 入门到精通(一)数据类型(4)
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (4) PIVOT 和 UPIVOT 的使用
  • (arch)linux 转换文件编码格式
  • (C++哈希表01)
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (七)Knockout 创建自定义绑定
  • (三分钟)速览传统边缘检测算子
  • (译)2019年前端性能优化清单 — 下篇
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转) 深度模型优化性能 调参
  • *** 2003
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .net core Redis 使用有序集合实现延迟队列
  • .net Signalr 使用笔记
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?