维数约简
假如你负责一项机器学习项目,最开始你需要收集数据集,也许把收集任务下发给各部门后,收集上来的数据特征有上千个,你是全部用呢?还是只用一部分呢?如果只用一部分,应该如何选择呢?
首先我们肯定是不能全用的,因为特征太多会拖慢训练速度。
我们需要选择其中的一部分特征,但是这些特征又要能保证一些特性,使他能够较好的代表
所有特征。
二维转一维
假设现在有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降维重新训练一次,看哪种方式带来的结果比较合乎人意。