主成分分析PCA

PCA原理

PCA思想

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

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

假设m个n维数据\((x^{(1)},x^{(2)},...,x^{(m)})\)都已经进行了中心化,即\(\sum\limits_{i=1}^mx^{(i)}=0\),经过投影变换后得到的新坐标系为\({w_1,w_2,...,w_n}\),其中\(w\)是标准正交基,即\(\lVert w\rVert_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)}=\sum\limits_{j=1}^{n'}z_j^{(i)}w_j=Wz^{(i)}\)其中,W为标准正交基组成的矩阵。

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

\[\sum_{i=1}^m\lVert \overline x^{(i)}-x^{(i)}\rVert_2^2 \]

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

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

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

\[\underbrace{\arg\min}_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)})\)都已经进行了中心化,即\(\sum\limits_{i=1}^mx^{(i)}=0\),经过投影变换后得到的新坐标系为\({w_1,w_2,...,w_n}\),其中\(w\)是标准正交基,即\(\lVert w\rVert_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\),要使所有的样本投影方差和最大,也就是最大化\(\sum\limits_{i=1}^{m}W^Tx^{(i)}x^{(i)T}W\)的迹,即

\[\underbrace{\arg\max}_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}\sum\limits_{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维空间的特征分解:

\[\sum\limits_{i=1}^{m}x^{(i)}x^{(i)T}W=\lambda W \]

映射为

\[\sum\limits_{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)
posted @ 2020-05-13 15:53  hi_heisen  阅读(156)  评论(0编辑  收藏  举报