100天搞定机器学习|Day59 主成分分析(PCA)原理及使用详解
数学概念
方差:用来衡量随机变量与其数学期望(均值)之间的偏离程度。统计中的方差(样本方差)是各个数据分别与其平均数之差的平方的和的平均数。
$$Var(X)=\frac{1}{n}\sum(x_i-μ)^2$$
协方差:度量两个随机变量关系的统计量,协方差为0的两个随机变量是不相关的。
$$cov(X,Y)=\frac{\sum(Xi-\overline{X})(Y_i-\overline{Y})}{(n-1)}$$
协方差矩阵:在统计学与概率论中,协方差矩阵的每个元素是各个向量元素之间的协方差。特殊的,矩阵对角线上的元素分别是向量的方差。
$$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]$$
PCA原理
主成分分析法(Principal Component Analysis)是一种基于变量协方差矩阵对数据进行压缩降维、去噪的有效方法,它借助正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分(PC),主成分是旧特征的线性组合。
PCA的本质就是找一些投影方向,使得数据在这些投影方向上的方差最大,而且这些投影方向是相互正交的。这其实就是找新的正交基的过程,计算原始数据在这些正交基上投影的方差,方差越大,就说明在对应正交基上包含了更多的信息量。如下图,第一个 PC 为 c1 所在的轴,第二个PC 为 c2 所在的轴,第三个 PC 为与平面正交的轴。我们仅保留一定数量的主成分来解释原始数据集的方差,而忽略其余部分。
PCA常用于高维数据的降维、数据噪音消除、图像压缩、特征脸等等。
PCA公式推导
1.假设$x$为$m$ 维随机变量,其均值为$\mu$,协方差矩阵为$\Sigma$。
考虑由$m$维随机变量$x$到$m$维随机变量$y$的线性变换
$$y _ { i } = \alpha _ { i } ^ { T } x = \sum _ { k = 1 } ^ { m } \alpha _ { k i } x _ { k } , \quad i = 1,2 , \cdots , m$$
其中$\alpha _ { i } ^ { T } = ( \alpha _ { 1 i } , \alpha _ { 2 i } , \cdots , \alpha _ { m i } )$。
如果该线性变换满足以下条件,则称之为总体主成分:
(1)$\alpha _ { i } ^ { T } \alpha _ { i } = 1 , i = 1,2 , \cdots , m$;
(2)$\operatorname { cov } ( y _ { i } , y _ { j } ) = 0 ( i \neq j )$;
(3)变量$y_1$是$x$的所有线性变换中方差最大的;$y_2$是与$y_1$不相关的$x$的所有线性变换中方差最大的;一般地,$y_i$是与$y _ { 1 } , y _ { 2 } , \cdots , y _ { i - 1 } , ( i = 1,2 , \cdots , m )$都不相关的$x$的所有线性变换中方差最大的;这时分别称$y _ { 1 } , y _ { 2 } , \cdots , y _ { m }$为$x$的第一主成分、第二主成分、…、第$m$主成分。
假设$x$是$m$维随机变量,其协方差矩阵是$\Sigma$,$\Sigma$的特征值分别是$\lambda _ { 1 } \geq\lambda _ { 2 } \geq \cdots \geq \lambda _ { m } \geq 0$,特征值对应的单位特征向量分别是$\alpha _ { 1 } , \alpha _ { 2 } , \cdots , \alpha _ { m }$,则$x$的第2主成分可以写作
$$y _ { i } = \alpha _ { i } ^ { T } x = \sum _ { k = 1 } ^ { m } \alpha _ { k i } x _ { k } , \quad i = 1,2 , \cdots , m$$
并且,$x$的第$i$主成分的方差是协方差矩阵$\Sigma$的第$i$个特征值,即$$\operatorname { var } ( y _ { i } ) = \alpha _ { i } ^ { T } \Sigma \alpha _ { i } = \lambda _ { i }$$
3.主成分有以下性质:
主成分$y$的协方差矩阵是对角矩阵$$\operatorname { cov } ( y ) = \Lambda = \operatorname { diag } ( \lambda _ { 1 } , \lambda _ { 2 } , \cdots , \lambda _ { m } )$$
主成分$y$的方差之和等于随机变量$x$的方差之和
$$\sum _ { i = 1 } ^ { m } \lambda _ { i } = \sum _ { i = 1 } ^ { m } \sigma _ { i i }$$
其中$\sigma _ { i i }$是$x_2$的方差,即协方差矩阵$\Sigma$的对角线元素。
主成分$y_k$与变量$x_2$的相关系数$\rho ( y _ { k } , x _ { i } )$称为因子负荷量(factor loading),它表示第$k$个主成分$y_k$与变量$x$的相关关系,即$y_k$对$x$的贡献程度。
$$\rho ( y _ { k } , x _ { i } ) = \frac { \sqrt { \lambda _ { k } } \alpha _ { i k } } { \sqrt { \sigma _ { i i } } } , \quad k , i = 1,2 , \cdots , m$$
4.样本主成分分析就是基于样本协方差矩阵的主成分分析。
给定样本矩阵
$$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 _ { j } = ( x _ { 1 j } , x _ { 2 j } , \cdots , x _ { m j } ) ^ { T }$是$x$的第$j$个独立观测样本,$j=1,2,…,n$。
$X$的样本协方差矩阵
$$\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.$$
给定样本数据矩阵$X$,考虑向量$x$到$y$的线性变换$$y = A ^ { T } x$$
这里
$$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]$$
如果该线性变换满足以下条件,则称之为样本主成分。样本第一主成分$y _ { 1 } = a _ { 1 } ^ { T } x$是在$a _ { 1 } ^ { T } a _ { 1 } = 1$条件下,使得$a _ { 1 } ^ { T } x _ { j } ( j = 1,2 , \cdots , n )$的样本方差$a _ { 1 } ^ { T } S a _ { 1 }$最大的$x$的线性变换;
样本第二主成分$y _ { 2 } = a _ { 2 } ^ { T } x$是在$a _ { 2 } ^ { T } a _ { 2 } = 1$和$a _ { 2 } ^ { T } x _ { j }$与$a _ { 1 } ^ { T } x _ { j } ( j = 1,2 , \cdots , n )$的样本协方差$a _ { 1 } ^ { T } S a _ { 2 } = 0$条件下,使得$a _ { 2 } ^ { T } x _ { j } ( j = 1,2 , \cdots , n )$的样本方差$a _ { 2 } ^ { T } S a _ { 2 }$最大的$x$的线性变换;
一般地,样本第$i$主成分$y _ { i } = a _ { i } ^ { T } x$是在$a _ { i } ^ { T } a _ { i } = 1$和$a _ { i } ^ { T } x _ { j }$与$a _ { k } ^ { T } x _ { j } ( k < i , j = 1,2 , \cdots , n )$的样本协方差$a _ { k } ^ { T } S a _ { i } = 0$条件下,使得$a _ { i } ^ { T } x _ { j } ( j = 1,2 , \cdots , n )$的样本方差$a _ { k } ^ { T } S a _ { i }$最大的$x$的线性变换。
5.主成分分析方法主要有两种,可以通过相关矩阵的特征值分解或样本矩阵的奇异值分解进行。
(1)相关矩阵的特征值分解算法。针对$m \times n$样本矩阵$X$,求样本相关矩阵
$$R = \frac { 1 } { n - 1 } X X ^ { T }$$
再求样本相关矩阵的$k$个特征值和对应的单位特征向量,构造正交矩阵
$$V = ( v _ { 1 } , v _ { 2 } , \cdots , v _ { k } )$$
$V$的每一列对应一个主成分,得到$k \times n$样本主成分矩阵
$$Y = V ^ { T } X$$
(2)矩阵$X$的奇异值分解算法。针对$m \times n$样本矩阵$X$
$$X ^ { \prime } = \frac { 1 } { \sqrt { n - 1 } } X ^ { T }$$
对矩阵$X ^ { \prime }$进行截断奇异值分解,保留$k$个奇异值、奇异向量,得到
$$X ^ { \prime } = U S V ^ { T }$$
$V$的每一列对应一个主成分,得到$k \times n$样本主成分矩阵$Y$
$$Y = V ^ { T } X$$
PCA算法流程
输入:n维样本集$D=(x^{(1)}, x{(2)},...,x)$,要降维到的维数n'.
输出:降维后的样本集$D'$
1、 对所有的样本进行中心化:
$x^{(i)} = x^{(i)} - \frac{1}{m}\sum\limits_{j=1}{m} x$
2、 计算样本的协方差矩阵$XX^T$
3、 对矩阵$XX^T$进行特征值分解
4、 取出最大的n'个特征值对应的特征向量$(w_1,w_2,...,w_{n'})$, 将所有的特征向量标准化后,组成特征向量矩阵W。
5、 对样本集中的每一个样本$x{(i)}$,转化为新的样本$z=WTx$
6、 得到输出样本集$D' =(z^{(1)}, z{(2)},...,z)$
有时候,我们不指定降维后的n'的值,而是换种方式,指定一个降维到的主成分比重阈值t。这个阈值t在(0,1]之间。假如我们的n个特征值为$\lambda_1 \geq \lambda_2 \geq ... \geq \lambda_n$,则n'可以通过下式得到:$$\frac{\sum\limits_{i=1}{n'}\lambda_i}{\sum\limits_{i=1}\lambda_i} \geq 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)
sklearn.decomposition.PCA 参数速查手册文字版
PCA 的使用简单的离谱,一般指定n_components即可,如果设置为整数,说明要保留的主成分数量。如果将其设置为小数,则说明降维后的数据能保留的信息。
上面提到主成分分析方法主要有两种,可以通过相关矩阵的特征值分解或样本矩阵的奇异值分解$A = U\Sigma V^T$进行。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,方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。
参考
https://github.com/fengdu78/lihang-code
https://finthon.com/python-pca/
https://www.cnblogs.com/pinard/p/6239403.html
100天搞定机器学习|Day59 主成分分析(PCA)原理及使用详解的更多相关文章
- 100天搞定机器学习|Day7 K-NN
最近事情无比之多,换了工作.组队参加了一个比赛.和朋友搞了一些小项目,公号荒废许久.坚持是多么重要,又是多么艰难,目前事情都告一段落,我们继续100天搞定机器学习系列.想要继续做这个是因为,一方面在具 ...
- 100天搞定机器学习|Day11 实现KNN
机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...
- 100天搞定机器学习|Day8 逻辑回归的数学原理
机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...
- 100天搞定机器学习|Day9-12 支持向量机
机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...
- 100天搞定机器学习|Day16 通过内核技巧实现SVM
前情回顾 机器学习100天|Day1数据预处理100天搞定机器学习|Day2简单线性回归分析100天搞定机器学习|Day3多元线性回归100天搞定机器学习|Day4-6 逻辑回归100天搞定机器学习| ...
- 100天搞定机器学习|Day17-18 神奇的逻辑回归
前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...
- 100天搞定机器学习|Day19-20 加州理工学院公开课:机器学习与数据挖掘
前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...
- 100天搞定机器学习|Day21 Beautiful Soup
前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...
- 100天搞定机器学习|Day22 机器为什么能学习?
前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...
- 100天搞定机器学习|Day33-34 随机森林
前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...
随机推荐
- EasyRE
注意 操作等级 亦或的操作优先级比减号低 C++运算符优先级_c++运算符的优先级顺序-CSDN博客 转换 还有注意一般都是小端存放,所以这里要逆序输出
- 排序:使数组唯一的最小增量 (3.22 leetcode每日打卡)
给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1. 返回使 A 中的每个值都是唯一的最少操作次数. 示例 1: 输入:[1,2,2]输出:1解释:经过一次 move 操作, ...
- 由后缀表达式题目:stoi atoi 函数新发现
洛谷上的题:有些·表示一个操作结束~假装没看到 1 #include<iostream> 2 #include<stack> 3 #include<string> ...
- Windows Server 2022 安装IIS 报错 访问临时文件夹 C:\WINDOWS\TEMP\3C 读取/写入权限 错误: 0x80070005
在windows中使用命令行方式安装IIS(Web服务器) Windows Server 2022 安装IIS 报错 访问临时文件夹 C:\WINDOWS\TEMP\3C 读取/写入权限 错误: 0x ...
- Python有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
n = 0 for i in range(1, 5): for j in range(1, 5): for k in range(1, 5): if(i != k) and (i != j) and ...
- echarts官网文档打开慢的解决方法
echarts官网文档打开慢的解决方法由于我们在做大数据屏的时候需要很多echarts图表,这个过程中也会遇到需要查询echarts官网文档.手册.配置项的时候,但是由于网站在国外,访问很慢或者打不开 ...
- PageHelper插件注意事项
PageHelper插件注意事项 使用PageHelper.startPage后要紧跟查询语句 下面的代码就有可能出问题: PageHelper.startPage(10, 10); if(param ...
- [GDOI22pj2C] 教室的电子钟
第三题 教室的电子钟 提交文件: clock.cpp 输入文件: clock.in 输出文件: clock.out 时间空间限制: 1 秒, 256 MB 为了迎接 GDOI,小蒟蒻学校所有教室的钟都 ...
- [ABC248G] GCD cost on the tree
Problem Statement You are given an undirected tree with $N$ vertices. Let us call the vertices Verte ...
- MySQL运维13-Mycat分库分表之按月分片
一.按照月分片 使用场景为按照自然月来分片,每个自然月为一个分片,但是一年有12个月,是不是要有12个数据节点才行呢?并不是.例如我现在只有三个分片数据库,这样就可以1月在第一个数据分片中,2月在第二 ...