使用Python进行主成分分析

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 中的主成分分析库丰富,使用方便,通过学习和实践主成分分析,可以加深对数据分析和机器学习的理解。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签