数学概念

方差:用来衡量随机变量与其数学期望(均值)之间的偏离程度。统计中的方差(样本方差)是各个数据分别与其平均数之差的平方的和的平均数。

$$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}&nbsp;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)原理及使用详解的更多相关文章

  1. 100天搞定机器学习|Day7 K-NN

    最近事情无比之多,换了工作.组队参加了一个比赛.和朋友搞了一些小项目,公号荒废许久.坚持是多么重要,又是多么艰难,目前事情都告一段落,我们继续100天搞定机器学习系列.想要继续做这个是因为,一方面在具 ...

  2. 100天搞定机器学习|Day11 实现KNN

    机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...

  3. 100天搞定机器学习|Day8 逻辑回归的数学原理

    机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...

  4. 100天搞定机器学习|Day9-12 支持向量机

    机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...

  5. 100天搞定机器学习|Day16 通过内核技巧实现SVM

    前情回顾 机器学习100天|Day1数据预处理100天搞定机器学习|Day2简单线性回归分析100天搞定机器学习|Day3多元线性回归100天搞定机器学习|Day4-6 逻辑回归100天搞定机器学习| ...

  6. 100天搞定机器学习|Day17-18 神奇的逻辑回归

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

  7. 100天搞定机器学习|Day19-20 加州理工学院公开课:机器学习与数据挖掘

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

  8. 100天搞定机器学习|Day21 Beautiful Soup

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

  9. 100天搞定机器学习|Day22 机器为什么能学习?

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

  10. 100天搞定机器学习|Day33-34 随机森林

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

随机推荐

  1. 一篇文章带你了解Python常用自动化测试框架——Pytest

    一篇文章带你了解Python常用自动化测试框架--Pytest 在之前的文章里我们已经学习了Python自带测试框架UnitTest,但是UnitTest具有一定的局限性 这篇文章里我们来学习第三方框 ...

  2. 在Window系统中安装VMware虚拟机搭建Linux服务器

    1.什么是VMware Workstation VMware Workstation Pro是一款桌面虚拟化软件.我们可以通过Workstation Pro在Windows或Linux PC上运行多个 ...

  3. SQL Server 2000 创建角色,登陆用户,安全用户,批量授予权限

    前言 我在2011年刚入门学习的时候,是从 SQL Server 2008 开始学的,再加上这些年较少接触 SQL Server 2000,因此对它不是很熟. 之前都是在 SQL Server 200 ...

  4. 用友vs金蝶产品分析(云星空与YonSuite)

    产品定位 用友与金蝶二者面对的客户群体是相同的:都是为成长型企业提供一体化服务,由于金蝶云星空发展较早,在部分产品功能上具备一定的先发优势:在产品的架构上,由于YS采用目前最先进的云原生和微服务架构, ...

  5. 【Java】Java中StringBuilder()成员方法append()和toString()

    StringBuilder就相当于C++的String长度可变,用于构造字符串对象,内部使用自动扩容的数组操作字符串数据. StringBuilder和StringBuffer使用的是相同的API[区 ...

  6. jdk10的var局部变量类型推理

    注:本人参考了openjdk官网,由于openjdk是开源的,所以不存在侵权行为,本章只为学习,我觉得没有什么比官网更具有话语权 1.jdk10的var的类型推测:就是这种处理将仅限于具有初始值设定项 ...

  7. 串ababaaababaa的next和串ababaabab的nextval

    这个next求法我看了视频和网上的,发现有两种求法,一种是求最左边和最右边相等的最大个数, 就比如说串ababaaababaa,这个 所以这个3的位置为1,依次下来. 这个唯一要注意的是,是按照你选择 ...

  8. VO、DTO、Entity的区别

    只能说从实际用法的一般习惯上进行区分: 1.entity 里的每一个字段,与数据库相对应,注意:entity与对应的实际数据库表的字段 没有强制要求但是一般建议保持一致(包括字段数据类型),当然,从实 ...

  9. Mybatis-Flex核心功能之@Id

    1.是什么? 在 Entity 类中,MyBatis-Flex 是使用 @Id 注解来标识主键的 2.怎么玩? public @interface Id { /** * ID 生成策略,默认为 non ...

  10. C++ Qt开发:StatusBar底部状态栏组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QStatus ...