什么是 PCA 算法?
主成分分析(PCA)是一种广泛应用于数据降维、特征抽取和数据可视化的线性变换方法。用于通过正交变换将一组可能相关的变量转换为一组线性不相关的变量,这些新变量被称为主成分。PCA 的主要目的是减少数据的维数,同时保留最重要的变异性信息。
数学原理
假设我们有一个由 n 个样本组成的数据集,每个样本有 d 个特征,可以表示为一个 \(n×d\) 的矩阵\(X\)。
- 数据标准化
首先,对数据进行标准化处理,使得每个特征的均值为 0,方差为 1。
\(\(X_{\text{std}} = \frac{X - \mu}{\sigma}\)\)
其中,\(μ\)是每个特征的平均值,\(σ\)是标准差。
- 协方差矩阵
计算数据的协方差矩阵
\(\(\Sigma = \frac{1}{n} X_{\text{std}}^T X_{\text{std}}\)\)
- 特征值分解
对协方差矩阵进行特征值分解。
\(\(\Sigma V = V \Lambda\)\)
其中,V 是特征向量组成的矩阵,Λ 是对应的特征值组成的对角矩阵。
- 选择主成分
选择最大的 \(k\) 个特征值对应的特征向量,这些向量构成了新的特征空间。这些特征向量通常按照对应的特征值大小排序。
- 投影到新空间
将原始数据集 \(X_{std}\) 投影到这些特征向量上,得到降维后的数据: \(X_{pca}=X_{std}V_k\) 其中,\(V_k\) 是包含前 k 个特征向量的矩阵。
直观理解
- 方差最大化:PCA尝试找到数据中方差(即数据的分散程度)最大的方向,这些方向就是主成分。第一个主成分有着数据中最大的方差,第二个主成分是在与第一个主成分正交的方向上方差最大的,以此类推。
- 数据压缩和信息保留:通过将数据投影到这些主成分上,PCA实现了数据的降维。虽然数据的维数减少了,但在新的特征空间中,尽可能多的信息(方差)被保留下来。
- 去相关性:在新的特征空间中,所有主成分是相互正交的,也就是说,它们是线性不相关的。这使得PCA非常适合去除数据中的多重共线性问题。
案例分享
下面是一个使用 Python 中的 scikit-learn 库来执行 PCA 降维的案例代码。这段代码会加载一个数据集,计算PCA,然后将数据降维到指定的主成分数目。
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# PCA降维:降到2维
pca = PCA(n_components=2)
X_r = pca.fit_transform(X)
# 结果可视化
plt.figure()
colors = ['navy', 'turquoise', 'darkorange']
lw = 2
for color, i, target_name in zip(colors, [0, 1, 2], iris.target_names):
plt.scatter(X_r[y == i, 0], X_r[y == i, 1], color=color, alpha=.8, lw=lw,
label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('PCA of IRIS dataset')
# 显示图形
plt.show()
为什么 PCA 算法需要对数据进行标准化?
主要原因如下:
- 特征尺度差异
在原始数据集中,不同的特征往往具有不同的量纲和尺度。例如,一个特征可能是以千克为单位的重量,而另一个特征可能是以厘米为单位的长度。如果不进行标准化,那么尺度较大的特征会在计算协方差矩阵时占据主导地位,导致PCA分析的结果偏向于尺度较大的特征。
- 方差影响
PCA 旨在寻找最大化数据方差的主成分。如果数据未经标准化,那么具有较大数值范围的特征可能会由于其方差自然较大而被错误地认为是最重要的特征。
-
优化算法性能:在机器学习中,许多优化算法也假设所有的特征都处于相同的尺度上。因此,标准化数据通常可以加快算法的收敛速度,并提高其性能。
-
统一影响度:通过标准化,每个特征的均值变为 0,标准差变为1。这样,所有的特征都会在相同的尺度上被考虑,使得PCA能够公平地评估所有特征的重要性。
PCA算法怎么找到新的降维维度?
PCA 算法通过以下步骤找到新的降维维度
- 计算协方差矩阵
首先,PCA 算法计算数据集的协方差矩阵。这个矩阵描述了数据集中各个变量之间的协方差,也就是说,它表达了变量之间的线性关系及其变异性。
- 特征值分解
然后,算法对协方差矩阵进行特征值分解。特征值分解将协方差矩阵分解成特征向量和特征值。特征向量代表了数据中的方向(或者说是维度),而特征值则给出了这些方向上变异性的量度。
- 选择主成分
特征值按照大小排序,从最大到最小。每个特征值对应一个特征向量,而最大的特征值对应的特征向量指向了最大方差的方向。
- 决定保留的成分数
为了决定保留多少个主成分,通常会设置一个方差的阈值。例如,我们可能希望通过保留的主成分来解释至少95%的原始数据方差。从最大特征值开始累加,直到累计贡献率达到所需的阈值。对应的特征向量数量就是新的降维维度。
- 构造投影矩阵
使用选定的特征向量构造一个投影矩阵。这个矩阵将用于将原始数据投影到新的低维空间中。
- 数据投影
最后,原始数据集乘以这个投影矩阵,转换到新的低维空间。这个操作实际上是将数据点投影到选定的主成分所在的方向上,得到的新数据集的维度就是我们保留的主成分的数量。
数学上,这个过程可以通过计算数据矩阵 \(X\) 和投影矩阵 \(W\) 的乘积来完成,其中 \(W\) 是由选定的特征向量组成的矩阵。
新的数据集 \(X_{new}\) 可以表示为: \(X_{new}=XW\)
通过这个过程,PCA 能够有效地找到新的降维维度,以便最大化保留原始数据集中的信息。
奇异值分解(SVD)与主成分分析(PCA)之间有何区别和联系?
奇异值分解(SVD)和主成分分析(PCA)都是线性代数中用于数据降维的重要技术,它们之间有紧密的联系,但也有一些区别。
联系
- 数学基础:PCA 和 SVD 都是基于线性变换,它们都可以从数据中提取出重要的特征和结构。
- 变换目的:它们都旨在发现数据中的主要变异方向,并减少数据的维度,同时保留尽可能多的信息。
- 实现关系:在数学上,PCA 可以通过 SVD 来实现。当对中心化(每个变量减去其均值)后的数据矩阵进行 SVD 时,SVD得到的奇异向量(U矩阵的列)对应于PCA的主成分。
区别
- 数学操作
PCA 通常针对协方差矩阵或相关矩阵进行特征值分解,而 SVD 是直接对原始数据矩阵进行分解。
-
输出
-
PCA,提供主成分,这些主成分是原始数据在新坐标系中的表示,这个新坐标系由数据方差最大的方向定义。
-
SVD,提供奇异值和对应的奇异向量。数据矩阵 \(M\) 可以被分解为三个矩阵的乘积 \(UΣV^T\),其中\(U\)和\(V\)是正交矩阵,\(Σ\) 是对角矩阵,对角线上的元素是奇异值。
-
计算成本:
-
PCA:当数据维度非常高时,计算协方差矩阵及其特征值可能非常昂贵。
- SVD:可以在不显式计算协方差矩阵的情况下应用于任何矩阵,因此对于大型矩阵来说,SVD 在计算上可能更加有效。