
主成分分析(PCA) 是一种常用于数据分析和降维的线性代数方法。它可以将高维度数据转换成低维空间,从而提高模型的运算效率、解释结果。
基本原理
假设一个数据集 ,其中包含了 个元素,每个元素有 个特征,即 。我们想要将这些数据压缩成 个特征向量集合 ,并基于它们进行数据的重构。
PCA 的基本思想是通过最大化方差来找到这些 个特征向量。具体而言,该算法首先找到拥有最大方差的第一主成分 ,然后找到在不同于 的方向上方差最大的第二主成分 ,以此类推。一般来说,前 个主成分可以表示原始数据的 方差,生成的新特征向量也被称为主成分。
下面给出 PCA 算法推导的数学原理:
上式中的 表示矩阵 的协方差,向量 满足:
上述公式可以解释为:寻找向量 ,使得将数据 投影到 上的方差最大化。由于 是标准化了的,所以 的长度为 ,这意味着 的方差等于 。根据拉格朗日乘数法,从而有以下限制条件:
通过对 求导并令其为 ,我们可以得到:
上式表明,向量 是特征向量,并且协方差矩阵在该向量下的方差 是它对应的特征值。
对于: 的情况,PCA 重复使用这样的过程,直到生成 个主成分。这些主成分是通过以下式子计算出来的:
Python 实现主成分分析
在 Python 中,可以使用 scikit-learn 库来实现 PCA,以下是一个简单的例子:
1、创建一个 的样本矩阵X
,用于测试 PCA 模型。在实际应用中,样本矩阵通常是从真实数据中采样得到的。
import numpy as np
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
2、创建一个 PCA 对象,并指定要保留的主成分数量为 2。然后,使用 fit()
方法基于样本矩阵X
训练 PCA 模型,计算特征向量、特征值等信息。此时,模型就可以用于将新的数据映射到主成分空间中。
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X)
3、使用训练好的 PCA 模型 pca
,将原始样本矩阵X
投影到新的主成分空间中,得到投影后的数据矩阵 X_pca
。
X_pca = pca.transform(X)
4、输出结果
print("原始数据:", X, "投影后的数据:", X_pca, sep="\n")
输出结果为:
原始数据:
[[1 2 3]
[4 5 6]
[7 8 9]]
投影后的数据:
[[-5.19615242e+00 -1.33226763e-15]
[ 0.00000000e+00 0.00000000e+00]
[ 5.19615242e+00 1.33226763e-15]]
需要注意的是,PCA 需要对样本数据进行中心化(即减去每个特征的均值)才能正常工作。scikit-learn 的 PCA 模型会自动完成这一步骤,但如果您使用其他库或自己编写 PCA 算法,则需要手动对数据进行中心化。
完整代码如下:
import numpy as np
from sklearn.decomposition import PCA
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
pca = PCA(n_components=2)
pca.fit(X)
X_pca = pca.transform(X)
print("原始数据:", X, "投影后的数据:", X_pca, sep="\n")
结语
PCA 是一种常用于机器学习中的技术,它能够在数据集中找到最重要的特征,并通过投影到这些特征组成的空间来进行降维、可视化和加速等操作。虽然 PCA 并不是解决所有问题的万能方法,但它仍然是非常有用和广泛应用的工具之一。




