一、来源及作用
存在问题
在我们训练模型的过程中,有时会出现在训练集上误差较小,但到了测试集误差又较大,我们称之为泛化误差,造成这种现象往往是以下几个原因:
- 训练数据不足
- 训练集与测试集数据分布不同
- 特征维度过高,造成过拟合
而为了解决这一问题,我们又有以下几种方法:
- 增加样本数量
- 使用正则项
- 对数据进行降维
其中对数据进行降维可以进行人工特征筛选,但往往费时又费力,效果还有可能不好,因此我们可以采用一些模型来进行数据降,其中比较常用的就是PCA(Principal Component Analysis),即主成分分析。
基本作用
PCA经常被用作以下几个方面:
- 数据降维(降低高维数据,简化计算)
- 数据去噪
- 处理共线特征,降低算法的开销,同时防止样本过拟合
二、 基本原理及求解步骤
核心思想
PCA的核心思想是经过线性变换,将数据从 n n n维线性空间映射至 k k k维( k < n k < n k<n),并且期望在投影方向上信息量最大,同时将数据进行反向重构时代价最小。
比如下面一组数据:
如果我们将其投影至X轴,则其效果如下:
X = [1 7 -4 1 5 -1 3 -2 -6 -2]
Y = [ 1.86379123 6.27582279 -3.08964086 3.39810814 6.43125938 -0.57665254
3.06208316 -1.7341361 -6.09519518 -1.36688637]
如果我们将其投影至Y轴,则效果如下:
但如果我们将其投影至过原点的一条直线,其效果将变为:
很显然投影至 y = x y=x y=x直线上,更能体现出数据之间的差异性。
如何选择投影方向
1.数据中心化
即所有特征分别减去其各自维度的平均值,其效果就是将所有数据往原点方向整体偏移,处理后的数据平均值为0.
2.求协方差矩阵C
我们以原始特征空间为2维举例: C = [ c o v ( x 1 , x 1 ) c o v ( x 1 , x 2 ) c o v ( x 2 , x 1 ) c o v ( x 2 , x 2 ) ] C= \left[ {\begin{array}{cc} cov(x_1,x_1) & cov(x_1,x_2) \\ cov(x_2,x_1) & cov(x_2,x_2) \\ \end{array} } \right] C=[cov(x1,x1)cov(x2,x1)cov(x1,x2)cov(x2,x2)]
-
C的纬度是 k ∗ k k*k k∗k维的, k k k为特征的数量。
-
对角线上的值分别是 x 1 x_1 x1和 x 2 x_2 x2的方差,非对角线上的是协方差,协方差可以用来描述两个特征之间的相关性,协方差大于0表示 x 1 x_1 x1和 x 2 x_2 x2成正相关,即一个增大,另一个也增大;如果协方差小于0,则说明呈负相关;如果协方差等于0,则说明线性无关。协方差的绝对值越大,相关性越强;反之则越弱
-
其中对于协方差并没有统一的度量值
其中:
c o v ( x , y ) = E [ ( x − E ( x ) ) ( y − E ( y ) ) ] = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) n \begin{aligned}cov(x,y)&=E[(x-E(x))(y-E(y))]\\&=\frac{\sum\limits_{i=1}^n(x_i-\bar x)(y_i-\bar y)}{n}\end{aligned} cov(x,y)=E[(x−E(x))(y−E(y))]=ni=1∑n(xi−xˉ)(yi−yˉ)
由于中心化后的数据各个维度上的平均值都为0,因此
c o v ( x , y ) = 1 n ∑ i = 1 n x i y i = 1 n x T y \begin{aligned}cov(x,y)&=\frac{1}{n}\sum\limits_{i=1}^nx_iy_i\\&=\frac{1}{n}x^Ty\end{aligned} cov(x,y)=n1i=1∑nxiyi=n1xTy
由此可得: C = 1 n X T X C=\frac{1}{n}X^TX C=n1XTX
- 这里 n n n为样本的数量,X为所有样本的特征构成的矩阵
3.求解协方差矩阵的特征值与特征向量
令 C μ = λ μ C\mu=\lambda\mu Cμ=λμ
就可以解出一组特征值与特征向量 { ( λ 1 , μ 1 ) , ( λ 2 , μ 2 ) . . . ( λ n , μ n ) } \{(\lambda_1,\mu_1),(\lambda_2,\mu_2)...(\lambda_n,\mu_n)\} {
(λ1,μ1),(λ2,μ2)...(λn,μn)}
我们将其按照特征值从大到小排列,如果要将数据从 n n n维投影至 k k k维,我们取前 k k