zoukankan      html  css  js  c++  java
  • 主成分分析PCA

    PCA原理

    PCA思想

    PCA是一种重要的降维方法之一,就是找出数据里最主要的方面,用主要方面代替原数据,并希望损失尽可能小。

    PCA推导:基于最小投影距离

    假设m个n维数据((x^{(1)},x^{(2)},...,x^{(m)}))都已经进行了中心化,即(sumlimits_{i=1}^mx^{(i)}=0),经过投影变换后得到的新坐标系为({w_1,w_2,...,w_n}),其中(w)是标准正交基,即(lVert w Vert_2=1,w_i^Tw_j=0)

    如果我们将数据从n维降到n'维,即丢弃新坐标系中部分坐标,则新坐标系为({w_1,w_2,...,w_{n'}}),样本点(x^{(i)})在n'维坐标系中的投影为:(z^{(i)}=(z_1^{(i)},z_2^{(i)},...,z_{n'}^{(i)})^T),其中,(z_j^{(i)}=w_j^Tx^{(i)})(x^{(i)})在低维坐标系里第j维的坐标。

    如果我们用(z^{(i)})来恢复原始数据(x^{(i)}),则得到恢复数据(overline x^{(i)}=sumlimits_{j=1}^{n'}z_j^{(i)}w_j=Wz^{(i)})其中,W为标准正交基组成的矩阵。

    现在我们考虑整个样本集,我们希望所有的样本到这个超平面的距离足够近,即最小化下式:

    [sum_{i=1}^mlVert overline x^{(i)}-x^{(i)} Vert_2^2 ]

    将这个式子进行整理可以得到

    [egin{align}egin{split} sumlimits_{i=1}^{m}lVert overline{x}^{(i)}-x^{(i)} Vert_2^2&=sumlimits_{i=1}^{m}lVert Wz^{(i)}-x^{(i)} Vert_2^2\ &=sumlimits_{i=1}^{m}(Wz^{(i)})^T(Wz^{(i)})-2sumlimits_{i=1}^{m}(Wz^{(i)})^Tx^{(i)}+sumlimits_{i=1}^{m}x^{(i)T}x^{(i)}\ &=sumlimits_{i=1}^{m}z^{(i)T}z^{(i)}-2sumlimits_{i=1}^{m}z^{(i)T}W^Tx^{(i)}+sumlimits_{i=1}^{m}x^{(i)T}x^{(i)}\ &=sumlimits_{i=1}^{m}z^{(i)T}z^{(i)}-2sumlimits_{i=1}^{m}z^{(i)T}z^{(i)}+sumlimits_{i=1}^{m}x^{(i)T}x^{(i)}\ &=-sumlimits_{i=1}^{m}z^{(i)T}z^{(i)}+sumlimits_{i=1}^{m}x^{(i)T}x^{(i)}\ &=-tr(W^T(sumlimits_{i=1}^{m}x^{(i)}x^{(i)T})W)+sumlimits_{i=1}^{m}x^{(i)T}x^{(i)}\ &=-tr(W^TXX^TW)+sumlimits_{i=1}^{m}x^{(i)T}x^{(i)} end{split} end{align} ]

    注意到(sumlimits_{i=1}^{m}x^{(i)}x^{(i)T})是数据集的协方差矩阵,W的每个向量(w_j)是正标准正交基,而(sumlimits_{i=1}^{m}x^{(i)T}x^{(i)})是一个常数,最小化上式等于

    [underbrace{argmin}_W-tr(W^TXX^TW)quad s.t. W^TW=I ]

    可以发现,最小值对就的W由协方差矩阵(XX^T)最大的n'个特征向量组成。

    利用拉格朗日函数可以得到

    [J(W)=-tr(W^TXX^TW+lambda(W^TW-I)) ]

    对W求导有(-XX^TW+lambda W=0),整理如下

    [XX^TW=lambda W ]

    这样可以看到,W为(XX^T)的n'个特征向量组成的矩阵,面(lambda)(XX^T)的若干个特征值组成的矩阵,特征值在主对角线上,其余位置为0。当我们将数据集从n维降到n'维时,需要找到的最大的n'个特征值对应的向量。这n'个特征向量组成的矩阵W即为我们需要的矩阵,对于原始数据集,我们只需要用(z^{(i)}=W^Tx^{(i)}),就可以把原始数据集降维到最小投影距离的n'维数据集。

    PCA推导:基于最大投影方差

    假设m个n维数据((x^{(1)},x^{(2)},...,x^{(m)}))都已经进行了中心化,即(sumlimits_{i=1}^mx^{(i)}=0),经过投影变换后得到的新坐标系为({w_1,w_2,...,w_n}),其中(w)是标准正交基,即(lVert w Vert_2=1,w_i^Tw_j=0)

    如果我们将数据从n维降到n'维,即丢弃新坐标系中部分坐标,则新坐标系为({w_1,w_2,...,w_{n'}}),样本点(x^{(i)})在n'维坐标系中的投影为:(z^{(i)}=(z_1^{(i)},z_2^{(i)},...,z_{n'}^{(i)})^T),其中,(z_j^{(i)}=w_j^Tx^{(i)})(x^{(i)})在低维坐标系里第j维的坐标。

    对于任意样本(x^{(i)}),在新的坐标系中的投影为(W^Tx^{(i)}),在新坐标系中投影方差为(W^Tx^{(i)}x^{(i)T}W),要使所有的样本投影方差和最大,也就是最大化(sumlimits_{i=1}^{m}W^Tx^{(i)}x^{(i)T}W)的迹,即

    [underbrace{argmax}_W tr(W^TXX^TW)quad s.t. W^TW=I ]

    与上面一样,只是少一个负号,利用拉格朗日函数可以得到

    [J(W)=tr(W^TXX^TW+lambda(W^TW-I)) ]

    对W求导有(XX^TW+lambda W=0),整理如下

    [XX^TW=-lambda W ]

    这样可以看到,和上面一样。W为(XX^T)的n'个特征向量组成的矩阵,面(lambda)(XX^T)的若干个特征值组成的矩阵,特征值在主对角+--位置为0。当我们将数据集从n维降到n'维时,需要找到的最大的n'个特征值对应的向量。这n'个特征向量组成的矩阵W即为我们需要的矩阵,对于原始数据集,我们只需要用(z^{(i)}=W^Tx^{(i)}),就可以把原始数据集降维到最小投影距离的n'维数据集。

    PCA算法流程

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

    输出:降维后的数据集D'

    1. 对所有样本进行中心化:(x^{(i)}=x^{(i)}-frac{1}{m}sumlimits_{j=1}^{m}x^{(j)})

    2. 计算样本的协方差矩阵(XX^T)

    3. 对矩阵(XX^T)进行特征值分解

    4. 对出最大的n'个特征值对应的向量((w_1,w_2,...,w_{n'})),将所有向量标准化后,组成特征向量矩阵W。

    5. 对样本集中的每一个样本(x^{(i)})转化为新的样本(z^{(i)}=W^Tx^{(i)})

    6. 得到输出样本集(D'=(z^{(1)},z^{(2)},...,z^{(m)}))

    核主成分分析KPCA

    在PCA算法中,我们假设存在超平面,可以让我们对数据进行投影。但有些时候数据不是线性的,不能直接使用PCA的方法直接降维。这就需要用和SVM一样的核函数的思想,先把数据集从n维映射到线性可分的高维N>n,然后再从N维降到一个低维度n',这里有n'<n<N。

    假设高维空间的数据是由n维空间的数据通过映射(phi)产生,对于n维空间的特征分解:

    [sumlimits_{i=1}^{m}x^{(i)}x^{(i)T}W=lambda W ]

    映射为

    [sumlimits_{i=1}^{m}phi(x^{(i)})phi(x^{(i)T})W=lambda W ]

    和PCA一样进行降维。

    方差与协方差的意义

    方差:用来度量随机变量与其数据期望之间的偏离程度

    协方差:用来度量两个变量之间的相关关系。

    协方差:

    1. 大于0,正相关
    2. 小于0,负相关
    3. 等于0,不相关
    4. 协方差小的,两者相关性也小

    PCA算法总结

    PCA优点:

    1. 仅以方差衡量信息量,不受数据集以外的因素影响
    2. 各主成分之前正交,可消除原始数据成分间的相互影响因素
    3. 计算方法简单,主要计算是特征值分解,易于实现

    PCA缺点:

    1. 主成分各特征维度的含义模糊,不如原样本的特征解释性强
    2. 方差小的非主成分也可能含对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。

    sklearn使用PCA

    类库

    from sklearn.decomposition import PCA
    

    参数

    1. n_components:降维后特征维度数量
    2. whiten:是否进行白化
    3. svd_solver:奇异值分解的方法

    实例

    from sklearn.decomposition import PCA
    
    pca = PCA(n_components=2)
    pca.fit(x)
    
  • 相关阅读:
    快速排序
    冒泡排序
    选择排序
    合并排序
    插入排序
    跟我一起阅读Java源代码之HashMap(三)
    跟我一起阅读Java源代码之HashMap(二)
    跟我一起阅读Java源代码之HashMap(一)
    Apache2.2 + tomcat7 服务器集群配置
    Spring+Hibernate实现动态SessionFactory切换(改进版)
  • 原文地址:https://www.cnblogs.com/guesswhy/p/12882876.html
Copyright © 2011-2022 走看看