1. 简介
主成分分析是指将数据中相关性很高的属性 / 变量转化成彼此相互独立或不相关的新属性 / 变量,利用较少的新属性 / 变量(主成分)去解释原来数据中的大部分属性 / 变量的一种降维方法。
2. 原理
2.1 基础思想
以学校课程为例,用 {x_1,x_2,cdots,x_p} 表示 p 门课程的成绩变量, {c_1,c_2,cdots,c_p} 表示各门课程的权重,则成绩的加权和为
现在希望能够选择合适的权重来更好的区分学生的成绩 {s_1,s_2,cdots,s_n} (n 为学生人数且 {n gt p} )。一般来说,如果这些值很分散,则表明区分的好。故需要寻找这样的加权,使得 {s_1,s_2,cdots,s_n} 能够尽可能的分散。
而数据的分散程度可以利用方差的大小来体现,设 {X_1,X_2,cdots,X_p} 表示以 {x_1,x_2,cdots,x_p} 为样本观测值的随机变量,规定(否则权值可以无穷大而失去意义) {c_1^2 c_2^2 cdots c_p^2 = 1} 。在此约束下,若能找到 {c_1,c_2,cdots,c_p} 使得 {Var(c_1X_1 c_2X_2 cdots c_pX_p)} 的值达到最大,则表明此时学生的成绩区分达到最好。
可见,以上问题本质为一个求最优解的优化问题:
求出的最优解 {c_1,c_2,cdots,c_p} 是一个单位向量,代表一个主成分方向,对应的主成分为 {Z = c_1X_1 c_2X_2 cdots c_pX_p} 。 一个主成分不足以代表原来的 p 个变量,故需要寻找第二、三、・・・个主成分。且后面的主成分不应该再包含前面已经求出来的主成分的信息,统计上理解就是主成分间两两之间的协方差为零,几何上理解就是主成分间两两正交。 设 {Z_i} 表示第 i 个主成分,{i = 1,2,cdots,p} ,则
其中,对于每一个 i ,均有 {c_{i1}^2 c_{i2}^2 cdots c_{ip}^2 = 1} 。且 {(c_{11},c_{12},cdots,c_{1p})} 使得 {Var(Z_1)} 的值达到最大;{(c_{21},c_{22},cdots,c_{2p})} 不仅垂直于 {(c_{11},c_{12},cdots,c_{1p})} ,而且使得 {Var(Z_2)} 的值达到最大;{(c_{31},c_{32},cdots,c_{3p})} 不仅垂直于 {(c_{11},c_{12},cdots,c_{1p})} 和{(c_{21},c_{22},cdots,c_{2p})} ,而且使 {Var(Z_3)} 的值达到最大;以此类推得到全部 p 个主成分。
【注意事项】
- 主成分分析的结果受量纲的影响,故实际应用中先将各变量的数据标准化,然后使用协方差矩阵或相关系数矩阵进行分析。
- 使用相关系数矩阵求主成分时,Kaiser 主张将特征值小于 1 的主成分予以放弃(这也是 SPSS 软件的默认值)
- 在实际研究中,由于主成分的目的是为了降维,减少变量个数,故一般选取少量的主成分(不超过 5 或 6 个),只要这些主成分的累计贡献率(定义见下文)能够达到 70%~80% 就行了。
设 p 个变量 {X_1,X_2,cdots,X_p} 在第 i 次试验中的取值为 {x_{i1},x_{i2},cdots,x_{ip} (i = 1,2,cdots,n)} ,则原数据写成矩阵形式为
为了保证主成分分析不受量纲的影响,将 X 进行标准化变换
其中,bar{x_j} 、s_j 分别为 X 的第 j 列的均值和标准差。 变换后的数据矩阵为
2.2 确定主成分变量
对于自变量的任意一个线性组合 :
其在第 i 次试验中的取值为
由于 tilde{X} 已经标准化了,因此
记 {w = (c_1,c_2,cdots,c_p)^T} ,则
对于新变量 {z} 来说,如果在n 次试验下它的取值变化不大,即 {z} 的 {M^*} 较小,则这个新变量 {z} 可以去掉。反之,如果 {z} 的 {M^*} 较大,则说明该新变量 {z} 的作用比较明显。因此,我们希望所选择的 {c_i (i=1,2,cdots,p)}
能使 {M^*} 达到最大,即使得新变量 z 有较大作用。
如果 {X^TX} 的特征值 {lambda_1 geq lambda_2 geq cdots geq lambda_p} ,它们对应的标准化正交特征向量为 {eta_1,eta_2,cdots,eta_p} ,则 {M^* = (Xw)^T(Xw)/n} 的最大值在 {w = eta_1} 时达到,且最大值为 {lambda_1 / n} 。此时新变量 {z} 为
其中 {tilde{x} = (tilde{x_1},tilde{x_2},cdots,tilde{x_p})} 。
常记 {Z_1 = tilde{x}^Teta_1} ,并称 {Z_1} 为变量的第一主成分。 一般的,如果已经确定了 k 个主成分:
则第 {k 1} 个主成分 {Z_{k 1} = tilde{x}^Tw} 可由以下两个条件决定:{w^Teta_i = 0, i = 1,2,cdots,k, w^Tw = 1} ;
- 在以上条件下,使得 {M^*} 达到最大。
由二次型的条件极值可知,第 {k 1} 个主成分就是 {Z_{k 1} = tilde{x}^Teta_{k 1} (i = 1,2,cdots,p)} 。如此总共可以取到 p 个主成分 {Z_i = tilde{x}^Teta_i (i = 1,2,cdots,p)} 。
2.3 选择主成分变量
确定了 p 个主成分后,将标准化后的数据 {tilde{x_1},tilde{x_2},cdots,tilde{x_p} } 转换成主成分 {z_1,z_2,cdots,z_p} ,令
记 {Q = (eta_1,eta_2,cdots,eta_p)_{p times p} } ,Q 为标准正交阵,且 {Z = XQ} ,则
由上式可知,{X^TX} 的特征值 {lambda_i} 度量了第 i 个主成分 {z_i} 在第 n 试验中取值变化的大小。如果 {lambda_i approx 0} ,则说明该主成分 {z_i} 在 n 次实验中的取值变化很小,可以选择剔除该主成分。
【筛选方法】
- 首先将 {X^TX} 的特征值按由大到小的次序排序。
- 然后剔除这些特征值 {lambda_{r 1},lambda_{r 2},cdots,lambda_{p} } 对应的主成分,这些特征值满足
即筛选留下的主成分对应的特征值之和所占比重(定义为累计贡献率)要超过 {85%} 。
- 单纯考虑累计贡献率有时是不够的,还需考虑选择的主成分对原始变量的贡献值,定义贡献值为相关系数的平方和。如果选择的主成分为 {z_1,z_2,cdots,z_p} ,则它们对原始变量 {tilde{x_i} } 的贡献值为
这里 {r(z_j,x_i)} 表示 {z_j} 与 {x_i} 的相关系数。
3. 步骤
假设进行主成分分析的指标变量有 m 个:{x_1,x_2,cdots,x_m} ;共有 n 个评价对象,第 i 个评价对象的第 j 个指标的取值为 {a_{ij} } ,评价矩阵为
3.1 对原始数据进行标准化
将各指标值转换成标准指标 {tilde{a_{ij} }} :
其中
即 {mu_j} ,{s_j} 为第 j 个指标的标准均值和样本标准差。对应地,称
为标准化指标变量。标准化后的评价矩阵为
3.2 计算相关系数矩阵
R相关系数矩阵 {R=(r_{ij})_{m times m} } ,其中
易知式中 {r_{ii} = 1} ,{r_{ij} = r_{ji} } ,{r_{ij} } 是第 i 个指标与第 j 个指标的相关系数。
3.3 计算特征值和特征向量
计算相关系数矩阵 R 的特征值 {lambda_1 geq lambda_2 geq cdots geq lambda_m geq 0} ,及对应的特征向量 {mu_1,mu_2,cdots,mu_m} ,其中 {mu_j = (mu_{1j},mu_{2j},cdots,mu_{mj})^T} ,由特征向量组成 m 个新的指标变量
其中 {y_i} 表示第 i 主成分。即
其中,{tilde{X} = (tilde(x_1),tilde{x_2},cdots,tilde{x_m})^T} ,{Y = (y_1,y_2,cdots,y_m)^T} ,{mu = (mu_1,mu_2,cdots,mu_m)} 。 标准化后的评价矩阵 {tilde{A} } 转化为新评价矩阵 {tilde{B} } :
3.4 选择
{p (p leq m)}个主成分计算特征值 {lambda_j (j = 1,2,cdots,m)} 的信息贡献率和累计贡献率。称
为主成分 {y_j} 的信息贡献率;称
为主成分 {y_1,y_2,cdots,y_p} 的累计贡献率,当 {alpha_p} 接近 1({alpha_p = 0.85 / 0.90 / 0.95} )时,选择前 p 个指标变量 {y_1,y_2,cdots,y_p} 作为 p 个主成分,代替原来的 m 个指标变量。选择该 p 个主成分后,新评价矩阵 tilde{C} 为:
3.5 计算综合评价值
定义综合得分为
其中 {b_j} 为第 j 个主成分的信息贡献;则 n 个评价对象的综合评价值向量为
其中,{b = (b_1,b_2,cdots,b_p)^T} 。 然后便可以依据该评价值向量对这 n 个对象进行综合评价。
4. 代码实现
4.1 MatLab 代码实现如下
- 利用 pcacov 函数:
% 1. 数据标准化
data=zscore(data);
% 2. 计算相关系数矩阵
R=corrcoef(data);
% 3. PCA 分析
% x:特征向量矩阵;y:特征值向量;z:主成分贡献率向量(总和为 100 )
[x,y,z]=pcacov(R);
% 4. 选择 5 个主成分
p = 5;
% 5. 计算新评价矩阵
C = data*x;
C = C(:,1:p);
% 6. 计算综合评价值
Z = C*z(1:p)/100;
- 利用 pca 函数:
% 1. 数据标准化
data=zscore(data);
% 2. PCA 分析
% x:特征向量矩阵;C:新评价矩阵;y:特征值向量
[x,C,y]=pca(data);
% 3. 选择 5 个主成分
p = 5;
% 4. 计算主成分贡献率(总和为 1 )
z = y/sum(y);
% 5. 计算综合评价值
Z = C*z(1:p);