1. 降维

如下图所示,有一个含m个样本量的数据组,每个样本包含两个特征,我们可以找到一条直线z,将所有的点投影到该条直线上,那么每个样本的两个特征x1x_1x2x_2就被压缩成一个特征z1z_1,数据集由{(x1(1),x2(1)),(x1(m),x2(m))(x^{(1)}_1,x^{(1)}_2),……(x^{(m)}_1,x^{(m)}_2)}压缩为{(z1(1)),(z1(2))(z1(m))(z^{(1)}_1),(z^{(2)}_1)……(z^{(m)}_1)}。
【AndrewNg机器学习】降维(Dimensionality Reduction)
同时,我们也可以将三维数据转化为二维,即将三维空间中的每个点投影到一个二维平面上。数据集由{(x1(1),x2(1),x3(1)),(x1(2),x2(2),x3(2))(x1(m),x2(m),x3(m))(x^{(1)}_1,x^{(1)}_2,x^{(1)}_3),(x^{(2)}_1,x^{(2)}_2,x^{(2)}_3)……(x^{(m)}_1,x^{(m)}_2,x^{(m)}_3)}压缩为{(z1(1),z2(1)),(z1(2),z2(2))(z1(m),z1(m))(z^{(1)}_1,z^{(1)}_2),(z^{(2)}_1,z^{(2)}_2)……(z^{(m)}_1,z^{(m)}_1)}。
【AndrewNg机器学习】降维(Dimensionality Reduction)
数据降维在可以使得数据更好的可视化的同时,也减小了数据的大小,使其占用内存更小,后续算法运行更快。

2. 主成分分析(Principal Component Analysis ,PCA)

2.1 什么是PCA

主成分分析是最常见的降维算法。在PCA算法中,我们就是要找到一个方向向量,即上一部分中数据投影的直线或平面。该低维向量u(1)u^{(1)}需要满足投射平均均方误差最小,投射误差是从特征向量向低维平面做垂线的长度。
【AndrewNg机器学习】降维(Dimensionality Reduction)
如下图所示,如果降维过程是将3D-2D,则需要找到两个方向向量。若是nD-kD,则需找到k个方向向量:u(1)u(2)u(k)u^{(1)},u^{(2)}……u^{(k)}
【AndrewNg机器学习】降维(Dimensionality Reduction)

PCA与线性回归是两种不同的算法,PCA最小化的目标是投射误差,不进行任何预测;而线性回归最小化目标是预测误差,其目的是为了进行预测。如下图所示,左边是线性回归误差(垂直于x1周轴),右边则是主要成分分析的误差(垂直于方向向量)。
【AndrewNg机器学习】降维(Dimensionality Reduction)

2.2 PCA算法

假设我们要将PCA从n维减小到k维,其中原始数据为:x(1),x(2)x(m)(shape=(m,n))x^{(1)},x^{(2)}……x^{(m)}(shape=(m,n))x(i)x^{(i)}中包含n个特征值。

首先要进行均值归一化,计算每个特征的均值uju_j,xj=xjujx_j=x_j-u_j。如果不同的特征值处于不同的数量级,还需要将每个特征除以一个值,该值可以是特征的max-min,也可以是特征的标准偏差,以保证所有的特征在一个缩放范围内。

然后由x(i)x^{(i)}(n,1)_{(n,1)}计算协方差矩阵(covariance matrix) Sigma(n,n)_{(n,n)}:
Σ=1mi=1n(x(i))(x(i))T\Sigma=\frac{1}{m}\sum_{i=1}^{n}{(x^{(i)})(x^{(i)})^T}

通过奇异值分解(singular value decomposition,SVD)来求解:[U,S,V]=SVD(sigma)。其中计算结果U(n,n)_{(n,n)}如下图,U 是一个具有与数据之间最小投射误差的方向向量构成的矩阵
【AndrewNg机器学习】降维(Dimensionality Reduction)

然后从U中选去前k个向量得到一个n*k的矩阵命为UreduceU_{reduce},则最后计算降维的结果z(i)=UreduceT×x(i)z^{(i)}=U^T_{reduce}\times x^{(i)}结果维度(k,1)(k,1)

下图为该过程的一个总结。
【AndrewNg机器学习】降维(Dimensionality Reduction)

2.3 压缩重现

在数据降维后得到z=UreduceTxz=U^T_{reduce}*x,将他映射到原来的高维数据:xapprox=Ureduce×zx_{approx}=U_{reduce} \times z

2.4 主成分数量选择

主成分分析的目的是使得投射的平均误差最小,因此主成分的数量k应满足下面的条件,即压缩后的数据应该维持原数据差异性的99%:
1mi=1mx(i)xapprox(i)21mi=1mx(i)20.01\frac{\frac{1}{m}\sum_{i=1}^{m}{|x^{(i)}-x^{(i)}_{approx}|^2}} { \frac{1}{m}\sum_{i=1}^{m}{|x^{(i)}|^2} } \leq 0.01
如果这个比例小于1%,就意味着原本数据方差的99%都保留下来了,即上面的值越小越好。我们可以先令k=1,然后进行主要成分分析,获得UreduceU_{reduce}和z,然后计算比例是否小于1%。如果不是的话再令k=2,如此类推,直到找到可以使得比例小于1%的最小k值。
另外,在我们使用SVD算法时[U,S,V]=SVD(sigma),会得到结果S,其中S为一个(n×n)(n \times n)对角矩阵:
S=[S1100Snn]S = \begin{bmatrix} S_{11} & \cdots & 0 \\ \vdots & \ddots & \vdots \\ 0 & \cdots & S_{nn} \end{bmatrix}
且满足下面的关系:
1mi=1mx(i)xapprox(i)21mi=1mx(i)2=1i=1kSiii=1nSii0.01\frac{\frac{1}{m}\sum_{i=1}^{m}{|x^{(i)}-x^{(i)}_{approx}|^2}} { \frac{1}{m}\sum_{i=1}^{m}{|x^{(i)}|^2} } = 1- \frac{\sum_{i=1}^{k}S_{ii}}{\sum_{i=1}^{n}S_{ii}} \leq 0.01
因此k值需要满足:i=1kSiii=1nSii0.99\frac{\sum_{i=1}^{k}S_{ii}}{\sum_{i=1}^{n}S_{ii}} \geq 0.99

2.5 一些建议

应该注意以下几点:

  • 不要用PCA来减少过拟合
  • 不要将PCA看作训练时的默认步骤,应该先尝试原有特征。

假使我们正在针对一张100×100像素的图片进行某个计算机视觉的机器学习,即总共
有10000个特征,则应该按照下面的方法:

  • 得到训练数据
  • 用PCA将10000特征进行降维
  • 使用逻辑回归进行训练
  • 在测试集上测试

相关文章: