1. 什么是主成分分析?
主成分分析(Principal Component Analysis,简称 PCA),是一种分析统计数据的方法,常用于数据降维,降低数据的维度,使数据更易于处理、理解和可视化。PCA 的目标是通过线性变换将原始高维数据转换成低维特征空间,使得新的低维特征变量能够尽可能多地解释原始数据中的方差。在新的低维特征空间中,每个新的特征变量也称为主成分,可以用来代表原始数据的一部分信息。
2. Python 中的主成分分析库
Python 中有很多实现主成分分析的库,例如:NumPy、SciPy、scikit-learn 等等。这些库用法相似,但实现算法和参数设置可能略有不同。这里我们以 scikit-learn 为例,介绍如何使用Python进行主成分分析。
2.1. 安装和导入库
在命令行中输入以下命令,可以安装 scikit-learn 库。
pip install -U scikit-learn
安装完成后,我们在 Python 中导入 scikit-learn 库。
from sklearn.decomposition import PCA
2.2. 数据预处理
在进行主成分分析前,需要对数据进行预处理,使数据符合 PCA 模型的假设:
数据是线性可分的,即可以用线性变换将原始数据转换成新的特征空间;
数据的每个特征变量具有相同的重要性;
数据符合高斯分布(正态分布);
在实际应用中,这些假设可能不完全成立,但可以通过数据预处理来尽量满足这些假设,以提高主成分分析结果的准确性。
2.3. 主成分分析的参数设置
在 scikit-learn 中,PCA() 函数用于创建主成分分析的模型。该函数包含多个参数,其中最重要的是 n_components 参数,用于控制主成分的数量。一般来说,可以根据要解释的方差大小,设置合适的主成分数量,例如保留总方差的 80%、90% 或 95%。
另外,PCA() 函数还包含其他参数,例如 whiten 参数,用于控制是否对数据进行白化处理,即使数据的每个特征变量具有相同的方差,以避免在进行特征选择时出现对某些特征的过多关注。
3. 示例:使用Python进行主成分分析
接下来,我们使用一个示例数据集,演示如何使用Python进行主成分分析。该数据集是一个二维数据,包含 100 个样本和 2 个特征变量,用于说明如何将二维数据降为一维。
3.1. 加载数据集
我们使用 NumPy 库随机生成一个二维数据集。
import numpy as np
np.random.seed(123) # 设置随机数种子
# 生成二维数据集
X = np.random.normal(size=(100, 2))
print(X)
生成的数据集如下所示:
[[ 1.0856306 0.99734545]
[-1.50629471 0.40594738]
[-0.50629471 -1.39671363]
...
[ 0.15784838 -0.0454609 ]
[-0.4131433 -1.0895878 ]
[ 0.85735401 -0.01523446]]
3.2. 数据标准化
在进行主成分分析前,需要对数据进行标准化处理,即将数据的均值变为 0,方差变为 1,以避免不同特征变量之间的数量级差异造成的影响。
# 数据标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(X_scaled)
标准化后的数据如下所示:
[[-0.00315944 1.43340562]
[-1.18702617 0.11073215]
[-0.46566202 -0.92903489]
...
[ 0.37253423 -0.03332434]
[-0.36664296 -0.75452419]
[ 0.76477133 0.10772706]]
3.3. 主成分分析模型的创建和训练
我们使用 PCA() 函数创建一个主成分分析模型,设置主成分数量为 1,对标准化后的数据进行训练。
# 创建主成分分析模型,设置主成分数量为 1
pca = PCA(n_components=1)
# 对标准化后的数据进行训练
pca.fit(X_scaled)
3.4. 主成分分析结果的输出
完成训练后,我们可以使用 components_ 属性输出每个主成分的权重向量。在本例中,由于只选择了一个主成分,因此输出的数组大小为 (2, 1)。
print(pca.components_)
输出结果如下所示:
[[0.70710678]
[0.70710678]]
这意味着,第一个主成分是一个长度为 2 的向量,其两个元素的权重分别为 0.70710678(即 $\sqrt{1/2}$)。由于只保留了一个主成分,因此第一主成分可以用来代表原始数据的一部分信息。
接下来,我们可以使用 transform() 函数将原始数据转换成主成分空间中的新数据。
# 对标准化后的数据进行转换
X_pca = pca.transform(X_scaled)
print(X_pca)
转换后的数据只有一列,即为第一个主成分的映射结果。
[[-1.46619942]
[ 0.18079337]
[ 0.8744189 ]
...
[-0.2458347 ]
[ 0.60796756]
[-0.3673121 ]]
3.5. 主成分分析结果的可视化
最后,我们可以将原始数据和转换后的数据进行可视化,展示主成分分析的效果。
import matplotlib.pyplot as plt
# 可视化原始数据
plt.figure()
plt.scatter(X[:, 0], X[:, 1])
plt.title("Original Data")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
# 可视化转换后的数据
plt.figure()
plt.scatter(X_pca[:, 0], np.zeros((100, 1)))
plt.title("Transformed Data")
plt.xlabel("First Principal Component")
plt.ylim([-0.1, 0.1])
可视化结果如下所示:
从图中可以看出,经过主成分分析转换后的数据只有一列,即为沿第一个主成分方向的映射结果,可以用来代表原始数据的一部分信息。虽然转换后的数据丢失了第二个特征变量的信息,但在某些情况下,该变换对于某些任务是有效的。
4. 结论
本文介绍了主成分分析的基本原理和 Python 的主成分分析库 scikit-learn 的使用方法。主成分分析可以用于降维、特征选择、可视化等多个领域,是机器学习和数据科学中非常重要的技术之一。Python 中的主成分分析库丰富,使用方便,通过学习和实践主成分分析,可以加深对数据分析和机器学习的理解。