信息量的损失

看这样一组二维数据
详解机器学习主成分分析(PCA)

我们想要将数据降到一维,到底是图中的红线好呢还是绿线好呢?
详解机器学习主成分分析(PCA)
降维就意味着信息的丢失,我们需要做的,就是尽可能将这样的信息损失降低

详解机器学习主成分分析(PCA)
详解机器学习主成分分析(PCA)

我们可以很直观地看到,数据点和直线的距离就在降维的过程中丢失掉了。

显然,绿线丢失的数据要比红线多

所以,我们可以判断,使用红线相比绿线会更好

我们也注意到,投影到红线上的蓝点,离散的程度大于投影到绿线上的蓝点,这也从另一个角度说明投影到红线丢失的信息相对更少。

这个离散的程度,我们使用蓝点之间的方差进行衡量:
var(a)=1mi=1m(aiμa)2\operatorname{var}(a)=\frac{1}{m} \sum_{i=1}^{m}\left(a_{i}-\mu_{a}\right)^{2}

其中:
μa=1mi=1mai\mu_{a}=\frac{1}{m} \sum_{i=1}^{m} a_{i}

为了方便计算,我们将所有的特征都减去该特征的均值,并依然用 aia_i 来表示,所以蓝点之间的方差可以记为:
var(a)=1mi=1mai2\operatorname{var}(a)=\frac{1}{m} \sum_{i=1}^{m}a_{i}^{2}

特征不相关

上面是二维降为一维的情况,只需要找到使得方差最大化的一个向量就可以了:

详解机器学习主成分分析(PCA)

但是对于更高的维度,应该如何处理呢?例如三维降为二维

当然我们可以首先找到一个使得投影方差最大方向,然后在这个基础上,找到和这个方向不相关的另外一个使得投影方差最大的方向。

所谓的不相关,就是指第二个方向向量和第一个方向向量正交,体现在二维平面上就是垂直的关系:

详解机器学习主成分分析(PCA)
我们先找到了使得投影方差最大方向,其方向向量u(1)u^{(1)} ,然后找到了和它垂直的投影方差最大的方向,其方向向量u(2)u^{(2)}

这里两个方向的相关程度,我们使用协方差进行衡量:
Cov(a,b)=1mi=1maibi\operatorname{Cov}(a, b)=\frac{1}{m} \sum_{i=1}^{m} a_{i} b_{i}

这里的 a, b 均已减去特征的均值。

当协方差 Cov(a,b)=0Cov(a,b) = 0 的时候,两个特征向量正交,也就是两个特征不相关

PCA 推导过程

假设我们的训练数据有 m 行数据,有 n 个特征维度,那么矩阵 X 是一个 m × n 的矩阵,可以表达为:
X=[x1(1)x2(1)xn(1)x1(2)x2(2)xn(2)x1(n)x2(m)xn(m)]X=\left[\begin{array}{cccc}{x_{1}^{(1)}} & {x_{2}^{(1)}} & {\dots} & {x_{n}^{(1)}} \\ {x_{1}^{(2)}} & {x_{2}^{(2)}} & {\dots} & {x_{n}^{(2)}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {x_{1}^{(n)}} & {x_{2}^{(m)}} & {\cdots} & {x_{n}^{(m)}}\end{array}\right]

X 的协方差矩阵 C 可以通过以下公式得到:

C=1mXTXC = \frac{1}{m}X^TX

那么 C 为一个 n × n 的矩阵:

C=1mXTX=[1mi=1m(x1(i))21mi=1mx1(i)x2(i)1mi=1mx1(i)xn(i)1mi=1mx2(i)x1(i)1mi=1m(x2(i))21mi=1mx2(i)xn(i)1mi=1mxn(i)x1(i)1mi=1mxn(i)x2(i)1mi=1m(xn(i))2]C=\frac{1}{m} X^{T} X=\left[\begin{array}{cccc}{\frac{1}{m} \sum_{i=1}^{m}\left(x_{1}^{(i)}\right)^{2}} & {\frac{1}{m} \sum_{i=1}^{m} x_{1}^{(i)} x_{2}^{(i)}} & {\cdots} & {\frac{1}{m} \sum_{i=1}^{m} x_{1}^{(i)} x_{n}^{(i)}} \\ {\frac{1}{m} \sum_{i=1}^{m} x_{2}^{(i)} x_{1}^{(i)}} & {\frac{1}{m} \sum_{i=1}^{m}\left(x_{2}^{(i)}\right)^{2}} & {\cdots} & {\frac{1}{m} \sum_{i=1}^{m} x_{2}^{(i)} x_{n}^{(i)}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {\frac{1}{m} \sum_{i=1}^{m} x_{n}^{(i)} x_{1}^{(i)}} & {\frac{1}{m} \sum_{i=1}^{m} x_{n}^{(i)} x_{2}^{(i)}} & {\cdots} & {\frac{1}{m} \sum_{i=1}^{m}\left(x_{n}^{(i)}\right)^{2}}\end{array}\right]

可以直观地看到,协方差矩阵 C 是一个实对称矩阵Cij=CjiC_{ij} = C_{ji},对角线是各个特征的方差。

因为矩阵 C 是一个实对称矩阵,所以 C 也具备一些实对称矩阵的特征:

  1. C 的不同特征值对应的特征向量是正交的
  2. C 的特征值都是实数,特征向量都是实向量
  3. C 可对角化,且相似对角阵上的元素即为矩阵本身特征值

根据这些性质,我们可以得到 n 个线性无关的非零特征向量 e1,e2,,ene_1,e_2,\cdots, e_n,这些特征向量构成的特征矩阵 E=e1,e2,,enE={e_1,e_2,\cdots, e_n} 满足:

ETCE=Λ=[λ1λ2λn]E^{T} C E=\Lambda=\left[\begin{array}{cccc}{\lambda_{1}} \\ {} & {\lambda_{2}} \\ {} & {} & {\ddots} \\ {} & {} & {} & {\lambda_{n}}\end{array}\right]

Λ\Lambda 是一个对角矩阵,除了对角线有值,其他位置(空白处)都是 0 。

对于特征矩阵 X ,因为可能存在大量的冗余数据,我们将它转换到另外一个特征空间,得到新的特征矩阵 Z

Z=[z1(1)z2(1)zn(1)z1(2)z2(2)zn(2)z1(m)z2(m)zn(m)]Z = \left[ \begin{array} { c c c c } { z _ { 1 } ^ { ( 1 ) } } & { z _ { 2 } ^ { ( 1 ) } } & { \cdots } & { z _ { n } ^ { ( 1 ) } } \\ { z _ { 1 } ^ { ( 2 ) } } & { z _ { 2 } ^ { ( 2 ) } } & { \cdots } & { z _ { n } ^ { ( 2 ) } } \\ { \vdots } & { \vdots } & { \ddots } & { \vdots } \\ { z _ { 1 } ^ { ( m ) } } & { z _ { 2 } ^ { ( m ) } } & { \cdots } & { z _ { n } ^ { ( m ) } } \end{array} \right]

我们希望这个特征空间中各个特征的彼此是线性无关的,也就是说希望各个特征向量是正交关系

那么在新的特征空间中,其协方差矩阵应该是一个对角矩阵:
D=1mZTZ=[1mi=1m(z1(i))21mi=1m(z2(i))21mi=1m(zn(i))2]D = \frac { 1 } { m } Z ^ { T } Z = \left[ \begin{array} { c c c c } { \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left( z _ { 1 } ^ { ( i ) } \right) ^ { 2 } } & { } & { } & { } \\ { } & { \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left( z _ { 2 } ^ { ( i ) } \right) ^ { 2 } } & { } & { } \\ { } & { } & { \ddots } & { } \\ { } & { } & { } & { \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left( z _ { n } ^ { ( i ) } \right) ^ { 2 } } \end{array} \right]

对角线是方差,其他位置(空白处)是协方差。协方差为 0 ,代表着两个向量正交。

假设特征空间转换的过程可以表达为 Z=XUZ = XU ,矩阵 D 代入该表达式可以得到:
D=1mZTZ=1m(XU)T(XU)=1mUTXTXU=UT(1mXTX)U=UTCU\begin{aligned} D & = \frac { 1 } { m } Z ^ { T } Z \\ & = \frac { 1 } { m } ( X U ) ^ { T } ( X U ) \\ & = \frac { 1 } { m } U ^ { T } X ^ { T } X U \\ & = U ^ { T } \left( \frac { 1 } { m } X ^ { T } X \right) U \\ & = U ^ { T } C U \end{aligned}

也就是说 U = E ,U 就是矩阵 C 特征向量所组成的矩阵。矩阵 D 对角线上每个值就是矩阵 C 的特征值。

如果我们把 D 中的特征值按照从大到小,将特征向量从左到右进行排序,然后取其中前 k 个,经过压缩转换(Z=XUZ = XU),就得到了我们降维之后的数据矩阵 ZZ

Z=XU=[x(1)x(2)x(m)][u(1)u(2)u(k)]Z = X U = \left[ \begin{array} { c } { \cdots x ^ { ( 1) } \cdots } \\ { \cdots x ^ { ( 2 ) } \cdots } \\ { \vdots } \\ { \cdots x ^ { ( m ) } \cdots } \end{array} \right] \left[ \begin{array} { c c c c } { \vdots } & { \vdots } & { } & { \vdots } \\ { u ^ {(1) } } & { u ^ { ( 2 ) } } & { \cdots } & { u ^ { ( k ) } } \\ { \vdots } & { \vdots } & { } & { \vdots } \end{array} \right]

          Z: m×k~~~~~~~~~~Z:~m\times k 矩阵
          X: m×n~~~~~~~~~~X:~m\times n 矩阵
          U: n×k~~~~~~~~~~U:~n\times k 矩阵

PCA的计算过程

  1. 首先对特征进行归一化处理。(标准化处理 正态分布)
    1. μj=1mi=1mxj(i)\mu _ { j } = \frac { 1 } { m } \sum _ { i = 1 } ^ { m } x _ { j } ^ { ( i ) }
    2. xj(i):=xj(i)μjx _ { j } ^ { ( i ) } : = x _ { j } ^ { ( i ) } - \mu _ { j }
    3. σj2=1mi=1m(xj(i))2\sigma _ { j } ^ { 2 } = \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left( x _ { j } ^ { ( i ) } \right) ^ { 2 }
    4. xj(i):=xj(i)σjx _ { j } ^ { ( i ) } : = \frac { x _ { j } ^ { ( i ) } } { \sigma _ { j } }
  2. 计算协方差矩阵
    C=1mXTXC = \frac{1}{m} X^TX
  3. 计算协方差矩阵的特征向量并按照特征大从大到小排序
  4. 提取特征向量矩阵的前 k 列。
    U=[u(1)u(2)u(k)]U = \left[ \begin{array} { c c c c } { \vdots } & { \vdots } & { } & { \vdots } \\ { u ^ { ( 1) } } & { u ^ { ( 2 ) } } & { \dots } & { u ^ { ( k ) } } \\ { \vdots } & { \vdots } & { } & { \vdots } \end{array} \right]
  5. 通过矩阵乘法计算得到新的特征 Z 。其中计算的公式为:
    Z=XU=[x(1)x(2)x(m)][u(1)u(2)u(k)]Z = X U = \left[ \begin{array} { c } { \cdots x ^ { ( 1) } \cdots } \\ { \cdots x ^ { ( 2 ) } \cdots } \\ { \vdots } \\ { \cdots x ^ { ( m ) } \cdots } \end{array} \right] \left[ \begin{array} { c c c c } { \vdots } & { \vdots } & { } & { \vdots } \\ { u ^ {(1) } } & { u ^ { ( 2 ) } } & { \cdots } & { u ^ { ( k ) } } \\ { \vdots } & { \vdots } & { } & { \vdots } \end{array} \right]

至此我们算是完成了降维

特征数 k 的选择

不过有时候,降维的效果可能并不好。要么可能维度压缩不多,内存占用和计算速度依然没有改善,要么可能维度压缩太过,信息丢失太大。

这其实取决于特征数 k 的选择。

因为矩阵 U 中每个特征向量是相互正交的,矩阵 U 也是一个正交矩阵,所以有 UUT=EUU^T = EEE 为单位矩阵。

经过如下推导,我们可以反压缩得到矩阵 X:
ZUT=(XU)UT=XE=XZ U ^ { T } = ( X U ) U ^ { T } = X E = X

因为保留的特征数 k 小于 m,所以这个反压缩得到的结果是不等于 X 的。

例如一维还原到二维,最终反压缩得到的结果是:
详解机器学习主成分分析(PCA)

而不是:
详解机器学习主成分分析(PCA)
这是因为特征转换的过程中,丢失了一部分的信息

所以使用 XapproxX_{approx} 进行标记更加合适:
Xapprax=ZUTX_{apprax} = Z U ^ { T }

有了 XapproxX_{approx} ,其实我们就能计算信息丢失率
1mi=1mx(i)xapprox(i)21mi=1mx(i)2\frac { \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left\| x ^ { ( i ) } - x _ { \text {approx} } ^ { ( i ) } \right\| ^ { 2 } } { \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left\| x ^ { ( i ) } \right\| ^ { 2 } }

如果损失小于 1%,那么我们可以说保留了 99% 的差异性。

当然,差异性的百分比还有另外一个获得,那就是前 k 个特征值之和除以所有的特征值之和。

因为我们已经对特征值进行了降序排序,所以前面 k 个特征应该能够比较好的代表全部的特征。

注意,这个特征值是指对角矩阵对角线上的数值
Λ=[λ1λ2λn]\Lambda = \left[ \begin{array} { l l l l } { \lambda _ { 1 } } & { } \\ { } & { \lambda _ { 2 } } \\ { } & { } & { \ddots } \\ { } & { } & { } & { \lambda _ { n } } \end{array} \right]

如果对于每个特征值,我们使用 SiiS_{ii} 进行标记,那么公式就是:
i=1kSiii=1mSii\frac { \sum _ { i = 1 } ^ { k } S _ { i i } } { \sum _ { i = 1 } ^ { m } S _ { i i } }

大于 k 小于 m 部分的特征值,就是丢失的数据,所以信息丢失率也可以通过下面的公式计算:
1i=1kSiii=1mSii1 - \frac { \sum _ { i = 1 } ^ { k } S _ { i i } } { \sum _ { i = 1 } ^ { m } S _ { i i } }

我们需要做的,是设置一个差异性保留的百分比,然后从小到大对 k 进行遍历,差异性满足条件,k 就是我们要的结果。

例如计算得到的数据差异性百分比和 k 的关系如下:

k = 1 :60%
k = 2 :77%
k = 3 :88%
k = 4 :93%
k = 5 :97%
k = 6 :99%

如果我们要保留 90% 的数据,那么 k 的取值应该是 4 ;
如果我们要保留 99% 的数据,那么 k 的取值应该是 6 。

关于PCA的注意事项

  1. 如果使用了PCA对训练集的数据进行了处理,那么对于验证集测试集也需要进行相对应的处理
    我们在处理训练集的过程中得到了特征的均值 μ\mu 和方差 σ\sigma ,以及特征向量 UU ,我们需要使用这些参数先对数据进行归一化处理,然后转换到新的特征空间。

  2. 在使用PCA进行压缩之前,先使用原数据进行训练,这样我们才能对比压缩前后的效果。
    如果不是占用内存空间太大,或者算法运行速度过慢,其实没有必要进行压缩。

  3. 不要使用 PCA 来避免过拟合
    因为通过这样的方式皮避免过拟合,不仅效果很差,并且会丢失部分数据。

相关文章:

  • 2021-06-24
  • 2021-04-18
  • 2021-05-15
  • 2021-06-08
  • 2021-04-13
  • 2021-12-11
  • 2022-02-23
  • 2022-12-23
猜你喜欢
  • 2021-11-03
  • 2021-08-08
  • 2021-07-14
  • 2021-12-26
  • 2022-01-18
  • 2021-04-30
  • 2021-10-28
相关资源
相似解决方案