zoukankan      html  css  js  c++  java
  • 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[ egin{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} ight]$$

    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 eq 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 } geqlambda _ { 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$的相关系数$ ho ( y _ { k } , x _ { i } )$称为因子负荷量(factor loading),它表示第$k$个主成分$y_k$与变量$x$的相关关系,即$y_k$对$x$的贡献程度。
    $$ ho ( 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[ egin{array} { l l l l } { x _ { 1 } } & { x _ { 2 } } & { cdots } & { x _ { n } } end{array} ight] = left[ egin{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} ight]$$

    其中$x _ { j } = ( x _ { 1 j } , x _ { 2 j } , cdots , x _ { m j } ) ^ { T }$是$x$的第$j$个独立观测样本,$j=1,2,…,n$。

    $X$的样本协方差矩阵
    $$left. egin{array} { c } { S = [ s _ { i j } ] _ { m imes 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} ight.$$

    给定样本数据矩阵$X$,考虑向量$x$到$y$的线性变换$$y = A ^ { T } x$$
    这里
    $$A = left[ egin{array} { l l l l } { a _ { 1 } } & { a _ { 2 } } & { cdots } & { a _ { m } } end{array} ight] = left[ egin{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} ight]$$

    如果该线性变换满足以下条件,则称之为样本主成分。样本第一主成分$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 imes n$样本矩阵$X$,求样本相关矩阵
    $$R = frac { 1 } { n - 1 } X X ^ { T }$$
    再求样本相关矩阵的$k$个特征值和对应的单位特征向量,构造正交矩阵
    $$V = ( v _ { 1 } , v _ { 2 } , cdots , v _ { k } )$$

    $V$的每一列对应一个主成分,得到$k imes n$样本主成分矩阵
    $$Y = V ^ { T } X$$

    (2)矩阵$X$的奇异值分解算法。针对$m imes n$样本矩阵$X$
    $$X ^ { prime } = frac { 1 } { sqrt { n - 1 } } X ^ { T }$$
    对矩阵$X ^ { prime }$进行截断奇异值分解,保留$k$个奇异值、奇异向量,得到
    $$X ^ { prime } = U S V ^ { T }$$
    $V$的每一列对应一个主成分,得到$k imes n$样本主成分矩阵$Y$
    $$Y = V ^ { T } X$$

    PCA算法流程

    输入:n维样本集$D=(x^{(1)}, x{(2)},...,x{(m)})$,要降维到的维数n'.
    输出:降维后的样本集$D'$

    1、 对所有的样本进行中心化:
    $x^{(i)} = x^{(i)} - frac{1}{m}sumlimits_{j=1}{m}&nbsp;x{(j)}$

    2、 计算样本的协方差矩阵$XX^T$

    3、 对矩阵$XX^T$进行特征值分解
    4、 取出最大的n'个特征值对应的特征向量$(w_1,w_2,...,w_{n'})$, 将所有的特征向量标准化后,组成特征向量矩阵W。

    5、 对样本集中的每一个样本$x{(i)}$,转化为新的样本$z{(i)}=WTx{(i)}$

    6、 得到输出样本集$D' =(z^{(1)}, z{(2)},...,z{(m)})$
    有时候,我们不指定降维后的n'的值,而是换种方式,指定一个降维到的主成分比重阈值t。这个阈值t在(0,1]之间。假如我们的n个特征值为$lambda_1 geq lambda_2 geq ... geq lambda_n$,则n'可以通过下式得到:$$frac{sumlimits_{i=1}{n'}lambda_i}{sumlimits_{i=1}{n}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 = USigma 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

  • 相关阅读:
    前端使用crypto.js进行加密
    C#编程总结(七)数据加密——附源码
    PID file /run/zabbix/zabbix_server.pid not readable (yet?) after start. 报错解决
    TNS-12560: Message 12560 not found; No message file for product=network, facility=TNS报错
    oracle无法启动asm实例记录
    linux添加硬盘分区挂载教程
    Oracle Database 12c Release 2安装过程实录
    Centos6.9minimal版系统安装图形化界面
    扫描工具nmap介绍
    Zabbix系列之六——添加web监测
  • 原文地址:https://www.cnblogs.com/jpld/p/14417243.html
Copyright © 2011-2022 走看看