数据综合评价方法盘点:从原理到实践(三)主成分分析法(PCA)

主成分分析法(PCA)

原理

主成分分析法是降维技术,通过线性变换把多个相关变量变成一组互不相关的新变量,也就是主成分。这些主成分按方差从大到小排列,方差大的主成分包含原始数据信息多。实际中,选前几个方差大的主成分代表原始数据大部分信息,实现数据降维,保留主要特征,方便后续分析处理。

实现路径

  1. 数据标准化:对原始数据标准化,消除量纲和数量级影响,让不同变量可比。标准化公式xij=xijxjsjx_{ij}^* = \frac{x_{ij} - \overline{x_j}}{s_j}xijx_{ij}是第ii个样本的第jj个指标值,xj\overline{x_j}是第jj个指标均值,sjs_j是第jj个指标标准差。
  2. 计算协方差矩阵:算标准化后数据的协方差矩阵SS,协方差矩阵反映变量相关性。
  3. 求解特征值和特征向量:对协方差矩阵SS特征分解,求特征值λ1λ2λp\lambda_1 \geq \lambda_2 \geq \cdots \geq \lambda_p和对应的特征向量e1,e2,,epe_1, e_2, \cdots, e_ppp是原始变量个数。
  4. 确定主成分个数:根据特征值大小和累计贡献率确定主成分个数。一般选累计贡献率达 80% 或 90% 的前kk个主成分。累计贡献率CRk=i=1kλii=1pλiCR_k = \frac{\sum_{i = 1}^{k}\lambda_i}{\sum_{i = 1}^{p}\lambda_i}
  5. 计算主成分得分:把原始数据投影到选的主成分上,得主成分得分。主成分得分矩阵ZZ的第ii行第jj列元素zij=l=1pxileljz_{ij} = \sum_{l = 1}^{p}x_{il}^* e_{lj}xilx_{il}^*是标准化后的第ii个样本的第ll个指标值,elje_{lj}是第jj个主成分对应的第ll个特征向量元素。

Python 实现代码

1
2
3
4
5
6
7
8
9
10
11
12
from sklearn.decomposition import PCA
import numpy as np


# 示例数据
data = np.array([[10, 20, 30],
[15, 25, 35],
[20, 30, 40]])

pca = PCA(n_components = 0.8) # 保留 80% 的信息
new_data = pca.fit_transform(data)
print("主成分得分:", new_data)

优劣势

  • 优势
    • 降维效果好:能有效降低数据维度,减少复杂性,保留主要信息,提高数据分析效率和可解释性。
    • 客观性强:计算过程基于数据特征,不依赖主观判断,结果客观稳定。
    • 应用广泛:在数据挖掘、机器学习、图像处理等好多领域都用,像数据预处理、特征提取这些。
  • 劣势
    • 主成分解释难:主成分是原始变量线性组合,实际意义不明确,不好直观解释理解。
    • 信息损失:降维过程中,虽然保留大部分信息,但还是可能丢一些次要信息,对信息完整性要求高的问题不太适用。
    • 数据要求高:对数据分布和质量有要求,数据有异常值或分布不均匀,会影响主成分分析结果。

具体案例

假设我们对50名学生的5门课程成绩进行分析,这5门课程分别是语文、数学、英语、物理、化学,希望通过主成分分析法找出能够代表学生综合学习能力的主要成分。

  1. 具体数据
学生编号 语文 数学 英语 物理 化学
1 85 90 80 75 88
2 78 85 70 68 75
3 92 95 88 80 90
4 80 75 72 65 70
5 88 92 85 78 82
... ... ... ... ... ...
50 75 80 70 60 65
  1. Python实现代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import numpy as np
    from sklearn.decomposition import PCA

    # 原始成绩数据
    data = np.array([
    [85, 90, 80, 75, 88],
    [78, 85, 70, 68, 75],
    [92, 95, 88, 80, 90],
    [80, 75, 72, 65, 70],
    [88, 92, 85, 78, 82],
    # 此处省略其他学生的数据
    [75, 80, 70, 60, 65]
    ])

    # 数据标准化
    data_standardized = (data - np.mean(data, axis=0)) / np.std(data, axis=0)

    # 进行主成分分析,保留80%的信息
    pca = PCA(n_components=0.8)
    new_data = pca.fit_transform(data_standardized)

    # 输出主成分得分
    print("主成分得分:", new_data)

    # 输出每个主成分的方差贡献率
    print("方差贡献率:", pca.explained_variance_ratio_)

    # 输出累计方差贡献率
    print("累计方差贡献率:", np.cumsum(pca.explained_variance_ratio_))

  2. 结果分析

  • 主成分得分:主成分得分矩阵中每一行代表一个学生在各个主成分上的得分,通过这些得分可以对学生进行综合评价和比较。例如,得分较高的学生在综合学习能力上表现相对较好。
  • 方差贡献率:可以看出每个主成分所包含的原始数据的信息量。比如,第一个主成分的方差贡献率可能较高,说明它对原始数据的解释能力较强,可能代表了学生的综合学习能力;第二个主成分的方差贡献率相对较低,可能代表了其他方面的能力或特征。
  • 累计方差贡献率:如果前几个主成分的累计方差贡献率达到了设定的阈值(如80%),则说明这几个主成分能够较好地代表原始数据的大部分信息。在这个案例中,假设前两个主成分的累计方差贡献率达到了80%,那么就可以主要依据这两个主成分来对学生的学习情况进行分析和评价。

通过主成分分析法,我们可以将复杂的多门课程成绩数据进行降维处理,提取出主要的信息成分,更简洁地了解学生的综合学习能力和特征。