降维也是一种无监督学习问题,降维的一个作用是数据压缩
数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,但它也让我们加快我们的学习算法
具体例子一:从二维降到一维
具体例子二:从三维降到二维
这样的降维处理数据过程可以被用于把任何维度的数据降到任何想要的维度,例如将1000维的特征降至100维
降维可以帮我们将数据可视化,我们便能寻找到一个更好的解决方案
具体例子:
假使有关于许多不同国家的数据,每一个特征向量都有 50 个特征(如 GDP,人均 GDP,平均寿命等)。如果要将这个 50 维的数据可视化是不可能的
将其降至 2 维,便可将其可视化了
这样做的问题在于,降维算法只负责减少维数,新产生的特征的意义就必须由我们自己去发现
主成分分析(PCA)是最常见且有效的降维算法
PCA将相关性高的变量转变为较少的独立新变量,实现用较少的综合指标分别代表存在于各个变量中的各类信息,既减少高维数据的变量维度,又尽量降低原变量数据包含信息的损失程度,是一种典型的数据降维方法
PCA保留了高维数据最重要的一部分特征,去除了数据集中的噪声和不重要特征,这种方法在承受一定范围内的信息损失的情况下节省了大量时间和资源,是一种应用广泛的数据预处理方法
在PCA中,我们要做的是找到一个方向向量(Vector direction),当我们把所有的数据都投射到该向量上时,我们希望投射平均均方误差能尽可能地小
方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长度
如上图所示,可以由两条方向向量,PCA会选择方向向量1,因为所有数据的投射平均均方误差更小,直观看就图中的蓝线长度更短
PCA 在数据挖掘和机器学习实践中的主要应用:
主成分分析与线性回归是两种不同的算法
主成分分析最小化的是投射误差(Projected Error)
线性回归尝试的是最小化预测误差
线性回归的目的是预测结果,而主成分分析不作任何预测
PCA 减少 n n n维到 k k k维:
计算出所有特征的均值,然后令 x j = x j − μ j x_j= x_j-μ_j xj=xj−μj
如果特征是在不同的数量级上,我们还需要将其除以标准差 σ 2 σ^2 σ2
∑ = 1 m ∑ i = 1 n ( x ( i ) ) ( x ( i ) ) T \sum=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T} ∑=m1∑i=1n(x(i))(x(i))T
在 Octave 里我们可以利用奇异值分解来求解,[U, S, V]= svd(sigma)
S i g m a = 1 m ∑ i = 1 n ( x ( i ) ) ( x ( i ) ) T Sigma=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T} Sigma=m1i=1∑n(x(i))(x(i))T
对于一个 n × n n×n n×n维度的矩阵,上式中的** U U U是一个具有与数据之间最小投射误差的方向向量构成的矩阵**
如果我们希望将数据从 n n n维降至 k k k维,我们只需要从 U U U中选取前 k k k个向量,获得一个 n × k n×k n×k维度的矩阵,我们用 U r e d u c e U_{reduce} Ureduce表示,然后通过如下计算获得要求的新特征向量 z ( i ) z^{(i)} z(i): z ( i ) = U r e d u c e T ∗ x ( i ) z^{(i)}=U^{T}_{reduce}*x^{(i)} z(i)=UreduceT∗x(i)
其中 x x x是 n × 1 n×1 n×1维的,因此结果为 k × 1 k×1 k×1维度。注,我们不对方差特征进行处理
在上面的介绍中,我们已经知道了PCA作为压缩算法,由给定压缩后的低维数据$ z^{(i)} 反向得到高维的 反向得到高维的 反向得到高维的 x^{(i)} $数据的过程称为重建原始数据
**具体方法:**我们假设 x x x为2维, z z z为1维, z = U r e d u c e T x z=U^{T}_{reduce}x z=UreduceTx,相反的方程为: x a p p o x = U r e d u c e ⋅ z x_{appox}=U_{reduce}\cdot z xappox=Ureduce⋅z, x a p p o x ≈ x x_{appox}\approx x xappox≈x。如图:
主要成分分析是减少投射的平均均方误差:
训练集的方差为: 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 \dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{\left( i\right) }\right\| ^{2} m1∑i=1m∥ ∥x(i)∥ ∥2
我们希望在平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的 k k k值
如果希望比例小于 1%, 就意味着原本数据的偏差有 99% 都保留下来了。 另外,还可以使用5%(对应95%的偏差), 10%(对应90%的偏差) 这些比例
通常95%到99%是最常用的取值范围。(注:对于许多数据集,通常可以在保留大部分差异性的同时大幅降低数据的维度。这是因为大部分现实数据的许多特征变量都是高度相关的)
先令 k = 1,然后进行主要成分分析,获得 U r e d u c e U_{reduce} Ureduce 和 z z z,然后计算比例是否小于1%
如果不是的话,再令k = 2,如此类推,直到找到可以使得比例小于 1%的最小 k k k值
SVD代表为奇异值分解,函数调用 [U, S, V] = svd(sigma) 返回一个与 Σ(即Sigma) 同大小的对角矩阵 S(由Σ的特征值组成),两个矩阵 U 和 V ,且满足 Σ = U * S * V’。
若 A 为 m×n 矩阵,则 U 为 m×m 矩阵,V 为 n×n 矩阵
奇异值在 S 的对角线上,非负且按降序排列,对角线之外的其它元素都是 0
我们的目的是从 n 维降到 k 维,也就是选出这 n 个特征中最重要的 k 个,也就是选出特征值最大的 k 个
所以得到矩阵 S 后,我们可以直接用它来计算平均均方误差与训练集方差的比例,而不用一遍遍重复计算误差和方差:
1 m ∑ i = 1 m ∥ x ( i ) − x a p p r o x ( i ) ∥ 2 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 = 1 − Σ i = 1 k S i i Σ i = 1 m S i i ≤ 1 % \dfrac {\dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{\left( i\right) }-x^{\left( i\right) }_{approx}\right\| ^{2}}{\dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{(i)}\right\| ^{2}}=1-\dfrac {\Sigma^{k}_{i=1}S_{ii}}{\Sigma^{m}_{i=1}S_{ii}}\leq 1\% m1∑i=1m∥ ∥x(i)∥ ∥2m1∑i=1m∥ ∥x(i)−xapprox(i)∥ ∥2=1−Σi=1mSiiΣi=1kSii≤1%
也就是: Σ i = 1 k s i i Σ i = 1 n s i i ≥ 0.99 \frac {\Sigma^{k}_{i=1}s_{ii}}{\Sigma^{n}_{i=1}s_{ii}}\geq0.99 Σi=1nsiiΣi=1ksii≥0.99
运用 PCA 将数据压缩至 1000 个特征
对训练集运行学习算法
在预测时,采用之前学习得到的 Ureduce 将输入的特征 x 转换成特征向量 z ,然后再进行预测
错误使用PCA情况之一:将其用于减少过拟合(减少了特征的数量
这样做非常不好,不如使用正则化处理。原因在于 PCA 只是近似地丢弃掉一些特征,它并不考虑任何与结果变量有关的信息,因此可能会丢失非常重要的特征
而当进行正则化处理时,会考虑到结果变量,不会丢掉重要的数据。
错误使用PCA情况之二:默认地将主要成分分析作为学习过程中的一部分
不要一开始就使用PCA,最好先使用原始数据,只有当原始数据进行不下去了才考虑PCA
与其考虑降低维度,不如想想如何优化算法;