Week8-2:Dimensionality Reduction

维数约简

假如你负责一项机器学习项目,最开始你需要收集数据集,也许把收集任务下发给各部门后,收集上来的数据特征有上千个,你是全部用呢?还是只用一部分呢?如果只用一部分,应该如何选择呢?

首先我们肯定是不能全用的,因为特征太多会拖慢训练速度。

我们需要选择其中的一部分特征,但是这些特征又要能保证一些特性,使他能够较好的代表所有特征。

二维转一维

假设现在有2个特征 $x_1, x_2$,我们需要将其转成一维数据 $y$ ,我们将所有的点 $(x_1, x_2)$ 投影到一条直线上去,那么最后会得到一条数轴上的一些点集,也就是把二维转成一维了。

三维转二维

我们将所有的三维上的点投影到一个平面上,这个平面用两个向量$z_1, z_2$来表示,那么最后我们将得到一个平面上的点集,这样也就将三维转成二维了。

主要成分分析

又叫PCA,它寻找一条低维的面,使得所有点到该面的距离的平方和最小。如下图中的这条直线,所有点到该直线的距离的平方和最短。

那么其实不用找一条直线,可以发现,只要方向与直线一样,投影的结果是一样的,所以只需要找到一个向量即可。

处理过程

预处理

如果给定m个数据 $x^{(1)}, x^{(2)}, .. , x^{(m)}$ ,我们首先对数据进行缩放,像第二周讲的那样,我们先求得每一个特征的平均数$\mu_j = \frac 1 m (x_j^{(1)} + x_j^{(2)} … +x_j^{(m)})$ ,用 $x_j^{(i)} - \mu_j$ 替换 $x_j^{(i)}$ 。

计算协方差矩阵

计算出每一个数据的协方差矩阵

计算特征向量

再计算协方差矩阵的特征向量,在matlab中,可以使用[U, S, V] = svd(Sigma)(Sigma是协方差矩阵)来计算特征向量U,那么这时我们会得到一个 $n \times n$ 的特征向量。

取前k列作为$U_{reduce}$ 值,用来做降维映射。

降维

令向量$z^{(i)} = U_{reduce}^T * x^{(i)}$ 就得到了n维的 $x^{(i)}$ 降成k维后的$z^{(i)}$

k的选取

现在你有1000个特征,那么到底降成多少个比较合适呢?也许可以是500个,也有可能100个就够了。

这里有一个方法可以检测降维后,新数据对原始数据特性的保留程度,计算下面公式,你将得到新数据与原始数据之间的差异度。假设计算出来的结果是0.05,那么新数据保留了原始数据95%的特性,一般来说,我们只要保持计算结果小于0.01即可。

所以最好的方式是,尝试不同的k值,找到一个比较小的k值,同时新数据保留原始数据99%~90%的特性均可。

PCA的应用

PCA常用于:

  • 压缩数据,节约空间
  • 加速机器学习过程
  • 数据可视化(如取k=2、k=3)

一种不好的用法是,用PCA来避免过拟合,我们前几周知道,过拟合问题可以通过用正规化参数 $\lambda$ 来处理,虽然PCA可以减少特征数量,但其实它保持了原数据的特性,也就是方差,所以效果不尽人意。

同时在进行一次机器学习训练过程中,我们也许根本用不到PCA算法,最好的方式还是先不用PCA降维,得到训练结果后,再使用PCA降维重新训练一次,看哪种方式带来的结果比较合乎人意。

坚持原创文章分享,您的支持将鼓励我继续创作!