zoukankan      html  css  js  c++  java
  • 李宏毅机器学习课程笔记-15.2无监督学习之主成分分析

    主成分分析即Principal Component Analysis,PCA,它是一种线性降维方法。

    主成分分析(1)

    PCA即主成分分析(Principe Component Analysis)。PCA假设降维函数是一个linear function,即输入(x)和输出(z)之间是linear transform (z=Wx),而PCA要做的就是根据很多个(x)找出(W)

    PCA for 1-D

    为了简化问题先假设输出(z=Wcdot x)是1个标量(scalar),其中(W)是1个行向量(row vector)、(x)是1个列向量。若假设(W)的模(长度)(||W||_2=1),此时(z)就是(x)(W)方向上的投影。

    我们希望所有(x)(W)方向上投影得到的所有(z)分布越大越好,也就是说在投影之后不同样本之间的区别仍然是可以被看得出来的,所以投影结果的variance越大越好,即我们希望找到一个使得投影结果的variance较大的(W),variance的计算公式为(Var(z)=frac{1}{N}sumlimits_{z}(z-ar{z})^2, ||W||_2=1),其中(ar z)是所有(z)的平均值。

    PCA for n-D

    如果输出(z=Wx)是1个包含(n)个元素的向量((n)需要我们自己确定),其中(W)是1个matrix、(w^i)(W)中的第(i)个行向量((||w^i||_2=0,1leq ileq n))、(x)是1个列向量,则(z_i=w^icdot x)表示(x)在方向(w^i)上的投影。

    注:(w^i)必须相互正交,即(W)为正交矩阵(Orthogonal Matrix),否则最终找到的(w^i)实际上是相同的值。

    拉格朗日乘子法

    如何求出PCA中的参数(W)呢?实际上已经有相关库可以直接调用PCA,此外也可以用神经网络描述PCA算法然后用梯度下降的方法来求解,这里主要介绍用拉格朗日乘子法(Lagrange multiplier)求解PCA的数学推导过程。

    注:(w^i)(x)均为列向量,下文中类似(w^icdot x)表示的是矢量内积,而((w^i)^Tcdot x)表示的是矩阵相乘。

    计算(w^1)

    结论:(w^1)(S=Cov(x))这个matrix中的特征向量,对应最大的特征值(lambda_1)

    首先计算出(ar{z_1})

    [egin{split} &z_1=w^1cdot x\ &ar{z_1}=frac{1}{N}sum z_1=frac{1}{N}sum w^1cdot x=w^1cdot frac{1}{N}sum x=w^1cdot ar x end{split} ]

    (Var(z_1))越大越好,所以我们要使得(Var(z_1))最大:

    [egin{split} Var(z_1)&=frac{1}{N}sumlimits_{z_1} (z_1-ar{z_1})^2\ &=frac{1}{N}sumlimits_{x} (w^1cdot x-w^1cdot ar x)^2\ &=frac{1}{N}sum (w^1cdot (x-ar x))^2\ end{split} ]

    因为((acdot b)^2=(a^Tb)^2=a^Tba^Tb=a^Tb(a^Tb)^T=a^Tbb^Ta),所以:

    [egin{split} Var(z_1)&=frac{1}{N}sum (w^1cdot (x-ar x))^2\ &=frac{1}{N}sum(w^1)^T(x-ar x)(x-ar x)^T w^1\ &=(w^1)^Tfrac{1}{N}(sum(x-ar x)(x-ar x)^T) w^1\ end{split} ]

    又因为(Cov(x)=frac{1}{N}sum(x-ar x)(x-ar x)^T),并令(S=Cov(x)),所以:

    [egin{split} Var(z_1)&=(w^1)^Tfrac{1}{N}(sum(x-ar x)(x-ar x)^T) w^1\ &=(w^1)^T Cov(x)w^1\ &=(w^1)^TSw^1 end{split} ]

    在使得(Var(z_1)=(w^1)^TCov(x)w^1)最大的同时,还有一个约束条件(||w^1||_2=(w^1)^Tw^1=1),否则(w^1)无限大就可以使得(Var(z_1))但这并没有意义。

    因为(S=Cov(x)),所以S是对称的(symmetric)、半正定的(positive-semidefine)、所有特征值非负的(non-negative eigenvalues)。

    使用拉格朗日乘数法,利用目标和约束条件构造函数:(g(w^1)=(w^1)^TSw^1-alpha((w^1)^Tw^1-1)),对(w^1)中每个元素求偏微分并使为0:

    [egin{split} &partial g(w^1)/partial w_1^1=0\ &partial g(w^1)/partial w_2^1=0\ &partial g(w^1)/partial w_3^1=0\ &... end{split} ]

    整理上式,可以得到:(Sw^1=alpha w^1),其中(w^1)(S)的特征向量(eigenvector),但满足((w^1)^Tw^1=1)的特征向量(w^1)有很多,我们要找的是使得((w^1)^TSw^1)最大的那个(w_1),于是可得((w^1)^TSw^1=(w^1)^T alpha w^1=alpha (w^1)^T w^1=alpha),因此使得((w^1)^TSw^1)最大就变成了使得(alpha)最大,即(S)的特征值(alpha)最大时对应的那个特征向量(w^1)就是我们要找的(w^1)

    计算(w^2)

    在计算(w^2)时比计算(w^1)时多了一个限制条件:(w^2)必须与(w^1)正交(orthogonal)。

    所以求解目标为:使得((w^2)^TSw^2)最大,约束条件为:((w^2)^Tw^2=1,(w^2)^Tw^1=0)

    结论:(w^2)也是(S=Cov(x))这个matrix中的特征向量,对应第二大的特征值(lambda_2)

    与计算(w^1)一样使用拉格朗日乘子法求解,定义(g(w^2)=(w^2)^TSw^2-alpha((w^2)^Tw^2-1)-eta((w^2)^Tw^1-0)),然后对(w^2)的每个元素做偏微分:

    [egin{split} &partial g(w^2)/partial w_1^2=0\ &partial g(w^2)/partial w_2^2=0\ &partial g(w^2)/partial w_3^2=0\ &... end{split} ]

    整理上式可得(Sw^2-alpha w^2-eta w^1=0),该式两侧同乘((w^1)^T)得到((w^1)^TSw^2-alpha (w^1)^Tw^2-eta (w^1)^Tw^1=0),其中(alpha (w^1)^Tw^2=0,eta (w^1)^Tw^1=eta)

    由于((w^1)^TSw^2)是vector×matrix×vector=scalar所以在外面套一个transpose不会改变其值,并且S是对称的即(S^T=S),所以:

    [egin{split} (w^1)^TSw^2&=((w^1)^TSw^2)^T\ &=(w^2)^TS^Tw^1\ &=(w^2)^TSw^1 end{split} ]

    已知(w^1)满足(Sw^1=lambda_1 w^1),所以:

    [egin{split} (w^1)^TSw^2&=(w^2)^TSw^1\ &=lambda_1(w^2)^Tw^1\ &=0 end{split} ]

    因此有((w^1)^TSw^2=0)(alpha (w^1)^Tw^2=0)(eta (w^1)^Tw^1=eta),又根据((w^1)^TSw^2-alpha (w^1)^Tw^2-eta (w^1)^Tw^1=0),所以(eta=0)

    此时(Sw^2-alpha w^2-eta w^1=0)就转变成了(Sw^2-alpha w^2=0)(Sw^2=alpha w^2)。由于(S)是对称的,因此在与(w_1)不冲突的情况下,这里(alpha)选取第二大的特征值(lambda_2)时,可以使((w^2)^TSw^2)最大。

    decorrelation

    可知(z=Wcdot x),有一个神奇的事情是(Cov(z)=D),即z的covariance是一个对角矩阵(diagonal matrix)。

    推导过程如下:

    img

    PCA可以让降维后数据中不同dimension之间的covariance变为0,即降维后数据中不同feature之间是没有correlation的,这样的好处是减少feature之间的联系从而减少model所需的参数量

    如果使用PCA将原数据降维之后再给其他model使用,那这些model就可以直接假设数据的各个维度不相关,这时model得到简化、参数量大大降低,相同的数据量可以得到更好的训练结果,从而可以避免overfitting的发生。

    主成分分析(2)

    Reconstruction Component

    假设我们现在考虑MNIST手写数字识别,可以假设一个数字图片由一些类似于笔画的component(本质上是一个28×28的vector)组成,将这些component记做(u_1,u_2,u_3,...),我们把(K)个component加权求和就可以组成一个数字图片:(x≈c_1u^1+c_2u^2+...+c_Ku^K+ar x),其中(x)是一张数字图片,(ar x)是所有数字图片的平均值。

    假设(K)个component已知,我们就可以用(left [egin{matrix}c_1 c_2 c_3...c_k end{matrix} ight]^T)来表示一张数字图片,如果(k)远小于图片像素数量,那这种表示方法就可以有效降维。

    那我们要如何找出这(K)个component呢?我们要找到(K)个vector使得(x-ar x)(hat x)越接近越好,其中(hat x=c_1u^1+c_2u^2+...+c_Ku^K)

    所以目标是使得Reconstruction Error (||(x-ar x)-hat x||)最小,即(L=minlimits_{u^1,...,u^k}sum||(x-ar x)-(sumlimits_{i=1}^k c_i u^i) ||_2)

    回顾PCA中(z=Wcdot x),实际上我们通过PCA最终解得的(W={w^1,w^2,...,w^k})就是使Reconstruction Error最小化的(K)个vector({u^1,u^2,...,u^k}),简单证明如下。

    如下图和下式所示,用下图中的矩阵相乘来表示所有的(x^i-ar x≈c_1^i u^1+c_2^i u^2+...),其中(x^i)指第(i)张图片,目标是使(approx)两侧矩阵之间的差距越小越好。

    img

    [egin{split} &x= left [ egin{matrix} u_1 u_2 ... u_k end{matrix} ight ]cdot left [ egin{matrix} c_1\ c_2\ ...\ c_k end{matrix} ight ]\ \ &left [ egin{matrix} x_1\ x_2\ ...\ x_n end{matrix} ight ]=left [ egin{matrix} u_1^1 u_2^1 ... u_k^1 \ u_1^2 u_2^2 ... u_k^2 \ ...\ u_1^n u_2^n ... u_k^n end{matrix} ight ]cdot left [ egin{matrix} c_1\ c_2\ ...\ c_k end{matrix} ight ]\ end{split} ]

    使用SVD将每个matrix (X_{m×n})都拆成matrix (U_{m×K})(Sigma_{K×K})(V_{K×n})的乘积,其中(K)为component的数目。使用SVD拆解后三个矩阵相乘的结果是跟等号左边的矩阵(X)最接近的,此时(U)就对应着(u^i)形成的矩阵、(Sigmacdot V)就对应着(c_k^i)形成的矩阵。

    根据SVD的结论,组成矩阵(U)(k)个列向量(标准正交向量,orthonormal vector)就是(XX^T)最大的(k)个特征值(eignvalue)所对应的特征向量(eigenvector),而(XX^T)实际上就是(x)的covariance matrix,因此(U)就是PCA的(k)个解。

    PCA寻找(W)的过程,实际上就是把(X)拆解成能够使得Reconstruction Error最小的(k)个component的过程,PCA中要找的投影方向(w^i)就相当于恰当的component (u^i),PCA中投影结果(z^i)就相当于各个component各自的权重(c_i)

    NN for PCA

    由上可知,PCA找出来的({w^1,w^2,...,w^k})就是(K)个component ({u^1,u^2,...,u^k})(hat x=sumlimits_{k=1}^K c_k w^k),我们要使(hat x)(x-ar x)之间的差距越小越好。我们已经通过SVD找到了(w^k)的值,而对每个不同的样本(x)都有一组不同的(c_k)值。

    在PCA中我们已经证得,({w^1,w^2,...,w^k})(k)个vector是标准正交化的(orthonormal),因此(c_k=(x-ar x)cdot w^k),这个时候我们就可以使用神经网络来表示整个过程,如下图所示。

    img

    如上图所示,假设(x)是3维向量,要投影到2维的component上,即(K=2)(c_k=(x-ar x)cdot w^k)类似于神经网络,(x-ar x)相当于一个神经元的3维输入,而(w^k_1)(w^k_2)(w^k_3)则是该神经元的权重,而(c_k)则是这个神经元的输出。得到(c_1)(c_2)之后,再让它乘上(w^1)(w^2)然后求和得到(hat x)。此时,PCA就被表示成只含一层hidden layer的神经网络,且这个hidden layer是线性的(没有激活函数),训练目标是让这个神经网络的输入(x-ar x)与输出(hat x)越接近越好,这就是Autoencoder

    注:PCA求解出的(w^i)与上述神经网络所解得的(w^i)是不一样的,因为PCA解出的(w^i)是相互垂直的(orgonormal),而上述神经网络的解无法保证(w^i)相互垂直,神经网络无法做到Reconstruction Error比PCA小。因此,在linear情况下直接用PCA找(W)远比用神经网络的方式更快速方便,神经网络的好处是它可以使用不止一层的hidden layer而可以做Deep Autoencoder。

    PCA的缺点

    • PCA是无监督的,没有使用label
    • PCA是线性的,而有时需要non-linear transformation

    What happens to PCA

    观察PCA对MNIST和Face的降维结果(见原视频),我们发现找到的component好像并不算是component。比如MNIST实验中PCA找到的是几乎完整的数字雏形,而Face实验中找到的是几乎完整的人脸雏形,而我们想象中的组件应该是类似于横折撇捺、眼睛鼻子眉毛等等。

    原因是这样的:(xapprox c_1u^1+c_2u^2+...+c_Ku^K+ar x),其中(c_i)是可正可负的,所以component不仅可以相加还可以相减,于是PCA得到的组件并不是我们想象中的那样,但通过这些组件的加加减减肯定可以获得我们想象中的基础的component。

    如果想要直接得到类似笔画的基础component,就要使用NMF(non-negative matrix factorization,非负矩阵分解)

    非负矩阵分解

    如果想要直接得到类似笔画的基础component,就要使用NMF(non-negative matrix factorization,非负矩阵分解)

    PCA可以看成是对原始矩阵(X)做SVD进行矩阵分解,但并不保证分解后矩阵的正负。实际上在进行图像处理时,如果部分component的matrix包含一些负值的话,如何处理负的像素值也会成为一个问题(可以做归一化处理,但比较麻烦)。

    而NMF的基本思路是,强迫使所有component和它的权重都必须是正的,也就是说所有图像都必须由组件叠加(不可相减)得到

    相比于PCA,我们可以发现NMF对MNIST和Face的降维结果(见原视频)更接近于我们想象中的基本的component。

    其它PCA版本

    降维的方法有很多,这里再列举一些与PCA有关的方法:

    • Multidimensional Scaling (MDS) [Alpaydin, Chapter 6.7]

      MDS不需要把每个data都表示成feature vector,只需要知道特征向量之间的distance,就可以做降维,PCA保留了原来在高维空间中的距离,在某种情况下MDS就是特殊的PCA

    • Probabilistic PCA [Bishop, Chapter 12.2]

      PCA概率版本

    • Kernel PCA [Bishop, Chapter 12.3]

      PCA非线性版本

    • Canonical Correlation Analysis (CCA) [Alpaydin, Chapter 6.9]

      CCA常用于两种不同的data source的情况,比如同时对声音信号和唇形的图像进行降维

    • Independent Component Analysis (ICA)

      ICA常用于source separation,PCA找的是正交的组件,而ICA则只需要找“独立”的组件即可

    • Linear Discriminant Analysis (LDA) [Alpaydin, Chapter 6.8]

      LDA是supervised的方式


    Github(github.com):@chouxianyu

    Github Pages(github.io):@臭咸鱼

    知乎(zhihu.com):@臭咸鱼

    博客园(cnblogs.com):@臭咸鱼

    B站(bilibili.com):@绝版臭咸鱼

    微信公众号:@臭咸鱼

    转载请注明出处,欢迎讨论和交流!


  • 相关阅读:
    496. 下一个更大元素 I
    240. 搜索二维矩阵 II
    java反射之ObjectAnalyzer
    PHP导出excel文件的多种方式
    git获取公钥和私钥以及常用的命令
    PHP PSR-2 代码风格规范
    phpStrom安装PHP_CodeSniffer检查代码规范
    常见PHP安全网站漏洞及防范措施
    Oracle中创建主键并在Spring data JPA中使用
    JPA自定义查询中报错:缺失右括号
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/14917220.html
Copyright © 2011-2022 走看看