Loading

吴恩达机器学习笔记-14(降维)

降维

降维可以压缩数据,使得数据占用较少的磁盘空间,还可以加速学习算法。

数据压缩

下面看这样一个例子:
image
假设这个数据集中的样本有两个特征,两个特征都表示物体的长度,因此是高度冗余的,那么我们会希望将这个2维数据压缩到1维。(因为都是四舍五入之后的数据,所以画出来不会在一条直线上。)

把不同的样本用不同的颜色标注出来
image
假设有这样一条绿色的线,看起来大多数样本都在的一条线。
我们把所有数据都投影到绿色的线上,那么会得到这样一个结果:
image
那么就需要新定义一个特征\(z_1\),这个特征可以表示出任意一个样本。

对于原始样本\(x^i\)来说,是2维实数向量。投影过后,或者说降维之后的样本\(z^i\)就应该是1维实数向量。
总而言之就是,如果允许通过投影绿线上所有的原始样本来近似原始的数据集,那么就只需要一个实数,就可以指定任意一个样本在直线上的位置。
这样就可以使数据空间减半,使算法运行更快。

同样可以将3维数据降维到2维数据。在实际工作中,可能会有1000维乃至于10000维的数据,但是这样高维的是无法通过作图观察到的,所以这里举的例子是3维到2维的。
image
左边是原始的数据集,可能很难看出来,这些数据其实大概都分布在一个平面内,那么我们会想将这些数据投影到同一个平面中,如中间图所示。然后用两个新的特征\(z_1,z_2\)来表示,最后得到右边的平面图。
新数据集的样本显然就应该是2维实数向量,这样就实现了所谓的降维。

数据可视化

降维除了用于压缩数据使得数据占用率变小,算法加快,还可以用于数据可视化。
(2014年数据)

国家 GDP(万亿美元) 人均GDP(千美元) 人类发展指数 平均寿命 贫困指数 平均家庭收入 ......
加拿大 1.577 39.17 0.908 80.7 32.6 67.293 ......
中国 5.878 7.54 0.687 73 46.9 10.22 ......
印度 1.632 3.41 0.547 64.7 36.8 0.735 ......
俄罗斯 1.48 19.84 0.755 65.5 39.9 0.72 ......
新加坡 0.223 56.69 0.866 80 42.5 67.1 ......
美国 14.527 46.86 0.91 78.3 40.8 84.3 ......
...... ...... ...... ...... ...... ...... ...... ......
假设有50个特征,也就是说\(x^i\)是50维向量,要可视化,就必须要降维,将50维降到3维乃至2维。

比起上面这个复杂的表格,将50维向量降到2维:

国家 \(z_1\) \(z_2\)
加拿大 1.6 1.2
中国 1.7 0.3
印度 1.6 0.2
俄罗斯 1.4 0.5
新加坡 0.5 1.7
美国 2 1.5
...... ...... ......
在降维的时候,z通常不会是具有物理意义的特征,也就是说他可能是比较抽象的,但是又能反映各样本不同的一个值。那么在可视化的时候需要做的一件事就是,要弄清楚降维后产生的新的特征,代表什么意思,才能读懂可视化图形所传达的信息。
把这个新数据集可视化之后可以得到:
image
假设\(z_1\)表示国家的经济活跃程度,\(z_2\)表示个人的经济活跃程度或者表示个人幸福程度之类的。
那么靠近右上角的样本,表示这个国家经济体量大,而且人均经济也比较发达或者说人均比较幸福,传统意义上的发达国家。
如果是右方靠下的点,表示这个国家经济体量大,但是人均经济欠发达或者说人均不那么幸福,就比较像现在的中国。

这就是如何用降维的方法来进行数据可视化。

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

对于降维问题,目前最流行最常用的算法是主成分分析法。

假设有这样一个2维数据集,欲降到1维。那么会需要找到一条能将数据投影到上面的直线。
现在需要解决的问题就是,如何去找到这样一条直线,看下面的例子:
若已经找到了一条“好”的直线
image
能看出来点到投影点间的垂直距离是比较小的,PCA要做的就是,找到一个低维空间,将数据投影在上面,使得数据与投影点之间的垂直距离(欧氏距离)的平方最小。
这部分欧氏距离有时也称作投影误差,那么根据之前学的内容,容易推断出,就要对这个误差进行最小化。
另外,在运用PCA之前,通常需要进行均值归一化和特征规范化,

image
相比之下,投影在2号直线上的点与数据之间的欧氏距离就会非常大,所以PCA不会选择这样一条直线进行降维操作。

更加一般化地说,我们有n维的数据,欲降至k维,不会想上面的直线一样只是找单个向量进行投影,而是找k个方向的向量进行投影,并对投影误差进行最小化处理。
image
对于3维降2维的例子而言,就是需要找2个方向的向量进行投影,而这2个向量则构成了一个2维平面。
用线性代数化的语言描述就是,需要找k个向量(\(u^1,...,u^k\)),将数据投影到这k个向量展开的线性子空间上面。

算法的使用

首先要对数据预处理,即进行特征缩放或者均值归一化。
计算每个特征的均值\(\mu_j=\frac{1}{m}\sum_{i=1}^m{x_j^i}\),令\(x_j^i=x_j^i-\mu_j\)。如果特征是在不同的数量级上,我们还需要将其除以标准差\(\sigma\)

抛开数学推导不谈,PCA降n维为k维的过程如下:

  1. 计算协方差矩阵\(\Sigma=\frac{1}{m}\sum_{i=1}^n{(x^i)}{(x^i)}^T\)
    如果训练集数据这样表示\(X=\begin{bmatrix}{x^1}^T\\\\...\\\\{x^m}^T\end{bmatrix}\)
    协方差矩阵也可以表示为\(\Sigma=\frac{1}{m}X^T{X}\)
  2. 计算矩阵\(\Sigma\)的特征向量:[U,S,V] = svd(Sigma)(svd指的是奇异值分解法,用eig函数也可以),svd返回三个矩阵U,S,V。我们只需要矩阵U,U是一个n*n的矩阵。经过计算后的U能够看出来是由\(u^1,u^2,...,u^n\)一系列列向量组成的,想降到k维,就取前k个向量。令\(U_{reduce}=[u^1,...,u^k]\)
  3. k维的新特征\(z^i={U_{reduce}}^T\times{x^i}\)\(x^i\)是nX1的,\(U_reduce\)是nXk的,那么\(z^i\)就是k*1的,即k维向量。这样就得到了新的特征。
    至此,我们找到了所谓的新特征来表示旧特征,即用k维特征表示之前的n维特征。
    实际上在这个求z的过程中,就已经完成了最小化投影误差的操作。

如何选择主成分的数字k

在PCA算法中我们将n维向量降维到k维向量,这个数字k,是PCA的一个参数,或者说是主成分的数字,或者说是保留下来的主成分的数字k。

首先给出数学表达式:
投影误差:\(\frac{1}{m}\sum_{i=1}^m{||x^i-x^i_{approx}||}^2\)
(这里的\(x^i_{approx}=U_{reduce}\times{z^i}\)
数据的总方差(每个数据与原点距离的平方):\(\frac{1}{m}\sum_{i=1}^m{||x^i||}^2\)
在选择k时,一个常见的经验主导的方法是选择使

\[\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} \]

的最小的k值。
专业的表达是“99%的方差得到了保留”。从经验上来说99%的保留度是最好的。

在octave\matlab中,使用[U,S,V] = svd(Sigma)这一命令时,其中的矩阵S是一个对角矩阵(除主对角线外的其他元素皆为0)。
image
对于给定的k,我们只需要计算是否有:

\[1-\frac{\sum_{i=1}^kS_{ii}}{\sum_{i=1}^nS_{ii}}\leq{0.01} \]

就可以高效地选择出参数k。

用PCA进行数据重建

image
假设有这样一个数据集,已经从2维降到了1维,要将1维数据还原到2维的,考虑到新特征z是k1的向量,原始特征x是n1向量,\(U_{reduce}\)是n*k阶矩阵。
那么容易得到\(x_{approx}^i=U_{reduce}\times{z^i}\),如果投影误差不太大,那么就可以将\(x_{approx}\)近似为原始的特征\(x\)
image

使用PCA时的注意事项

考虑这样一个监督学习的例子:
image
有m个样本,每个样本又10000个特征(即\(x^i\)是一个10000维向量)
只对数据集中的特征\(x^1,...,x^m\)使用PCA,得到映射出的新特征\(z^1,...z^m\)(假设\(z^i\)是1000维向量),这样就通过降维节省了空间,提高了算法运行速率。
此时就有了一个新的训练集
image
假如用在LR中,函数模型就应该变为对z的函数模型:\(h_\theta(z)=\frac{1}{1+e^{-{\theta^{T}}z}}\)
PCA做的事是用x映射出z,这个映射只能通过在训练集上运行PCA来定义。

经验上来说,在设计学习算法的时候,首先用原始数据来进行学习比一来就用PCA映射出新数据再进行学习更好。只有当使用原始数据不能实现,或者需要的空间太大的时候,再考虑用PCA处理数据之后进行学习。

posted @ 2021-06-15 09:09  mmmhongyu  阅读(264)  评论(0)    收藏  举报