什么是主成分分析(PCA)
主成分分析(Principal Component Analysis,简称 PCA)是一种常用的数据降维方法,旨在通过将高维数据投影到低维空间中的主要方向来捕获数据的本质结构。主成分分析可用于降低数据的维度,压缩图像、音频和视频数据,去除冗余信息等。
为什么用主成分分析
- 数据压缩:PCA可以将高维数据投影到低维空间中,用较少的维度来表示数据,将数据的维度降低到原来的一部分,以达到数据压缩的目的。这不仅有助于减少计算开销和存储空间,还可以延长算法的生命周期,因为降维后的数据有更简单的结构,更容易使用和分析。
- 去除冗余信息:PCA可以去除数据中的冗余信息,使数据更加紧凑。这有助于提高数据分析和挖掘的效率,因为我们只需要更少的数据来达到相同的分析目标。
- 数据可视化:PCA可以将高维数据投影到低维平面上,帮助人们更好地可视化数据,揭示它们之间的关系和分布。例如,在图像识别和人脸识别中,可以用PCA来降低维度并展示人脸的主要特征,以更好地识别和分类。
- 数据预处理:在某些分析方法中,高维数据可能会导致过拟合或其他问题,这时可以使用PCA来降低维度以避免这些问题。
- 特征提取:PCA可以发现数据的主要特征,这对于特征提取很有用。例如,在机器学习中,可以使用PCA来选择最有代表性的特征,然后使用这些特征来训练机器学习模型。
主成分分析的数学原理
主成分分析(PCA)是一种线性变换技术,用于减少高维数据的复杂性并保留大部分变化的信息。其基本数学原理是通过对数据进行正交变换,使得每个新的主成分(也称为“特征向量”)都是原始数据的线性组合。原始数据如下图。
换句话说,PCA通过找到数据中的主要方向并将其重构为新的坐标轴,从而使我们能够更好地理解数据的结构。它的目的是将数据投影到一个低维空间上,使得每个主成分都包含了尽可能多的“信息”。
主成分分析后的数据如下图:
在数学上,PCA的探索目标是找到一个新的投影空间,使得在此空间中数据的方差最大。因此,在得出每个主成分(特征向量)后,它们按照其方差的降序排列。因此,在进行主成分分析时,我们需要考虑以下两个步骤:
- 计算协方差矩阵(covariance matrix)。
- 找到协方差矩阵的特征值和特征向量,以便确定新的坐标轴。
通过以上两个步骤,我们可以确定每个主成分的方向和它们在数据集中的重要性(即方差)。通常,我们只使用前N个重要的主成分,这取决于数据本身的复杂性和需要保留多少信息来满足分析目的。
怎么使用主成分分析
以下是使用主成分分析的数学计算过程:
- 数据预处理:如果需要,将数据标准化,使每个变量具有相同的尺度。
- 计算协方差矩阵:计算数据中各变量之间的协方差矩阵(或相关系数矩阵)。
- 计算特征值和特征向量:对协方差矩阵进行特征值分解,得到其特征值和特征向量。
- 选择主成分:根据特征值的大小,选择最高的几个特征向量作为主成分。
- 计算得分:将选定的主成分作为新的变量,用数据集中的每个观测值投影到这些主成分上,得到得分,即降维后的新数据点。
- 可视化结果:可视化降维后的数据点,以及主成分的贡献和方差解释程度等。
以下数据为例:
因素1 | 因素2 | |
---|---|---|
a | 5.4 | 4.4 |
b | -2.6 | -1.6 |
c | -3.6 | -2.6 |
d | 2.4 | 1.9 |
e | -1.6 | -2.1 |
则以上数据用矩阵表示如下
因素1为x =
(
5.4
−
2.6
−
3.6
2.4
−
1.6
)
\begin{pmatrix}5.4 \\-2.6 \\-3.6 \\2.4 \\-1.6\end{pmatrix}
5.4−2.6−3.62.4−1.6
,因素2为y=
(
4.4
−
1.6
−
2.6
1.9
−
2.1
)
\begin{pmatrix}4.4 \\-1.6 \\-2.6 \\1.9 \\-2.1\end{pmatrix}
4.4−1.6−2.61.9−2.1
那么组成的协方差矩阵为:
Q =
(
V
a
r
(
X
)
C
o
v
(
X
,
Y
)
C
o
v
(
X
,
Y
)
V
a
r
(
Y
)
)
\begin{pmatrix} Var(X) & Cov(X,Y) \\ Cov(X,Y) & Var(Y) \end{pmatrix}
(Var(X)Cov(X,Y)Cov(X,Y)Var(Y)) =
1
5
(
X
⋅
X
X
⋅
Y
X
⋅
Y
Y
⋅
Y
)
\frac{1}{5}\begin{pmatrix} X·X & X·Y \\ X·Y & Y·Y \end{pmatrix}
51(X⋅XX⋅YX⋅YY⋅Y) =
1
5
(
57.2
45.2
45.2
36.7
)
\frac{1}{5}\begin{pmatrix} 57.2 & 45.2 \\ 45.2 & 36.7 \end{pmatrix}
51(57.245.245.236.7) =
(
11.44
9.04
9.04
7.34
)
\begin{pmatrix} 11.44 & 9.04 \\ 9.04 & 7.34 \end{pmatrix}
(11.449.049.047.34)根据 |Q - λE|=0,求特征值和特征变量,其中E为单位矩阵,λ为特征值:
则Q - λE =
(
11.44
−
λ
9.04
9.04
7.34
−
λ
)
\begin{pmatrix} 11.44-λ & 9.04 \\ 9.04 & 7.34-λ \end{pmatrix}
(11.44−λ9.049.047.34−λ) = 0,求得特征值为18.66和0.12,
对应的特征向量为e1=
(
0.78
0.62
)
\begin{pmatrix} 0.78 \\ 0.62 \end{pmatrix}
(0.780.62) , e2=
(
0.62
−
0.78
)
\begin{pmatrix} 0.62 \\ -0.78 \end{pmatrix}
(0.62−0.78)
由此可以算出数据的新因素1X和新因素2Y:X = a×e1 = 6.94,Y = a×e2
新因素1 | 新因素2 | |
---|---|---|
a | 6.94 | -0.084 |
b | -3.02 | -0.364 |
c | 4.42 | 0.204 |
d | 3.05 | 0.006 |
e | -2.55 | 0.646 |
从以上数据可以看出,新因素2的数值整体较小,而新因素1的数值较大,可以直接采用新因素1,这样就实现了一定意义上的降维。
python进行主成分分析
我们生成有一个包含5个变量(X1、X2、X3、X4和X5)的数据集data,其中每个变量都具有正态分布。我们将使用scikit-learn库进行主成分分析:
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import pandas as pd
X = np.array(
[[66, 64, 65, 65, 65],
[65, 63, 63, 65, 64],
[57, 58, 63, 59, 66],
[67, 69, 65, 68, 64],
[61, 61, 62, 62, 63],
[64, 65, 63, 63, 63],
[64, 63, 63, 63, 64],
[63, 63, 63, 63, 63],
[65, 64, 65, 66, 64],
[67, 69, 69, 68, 67],
[62, 63, 65, 64, 64],
[68, 67, 65, 67, 65],
[65, 65, 66, 65, 64],
[62, 63, 64, 62, 66],
[64, 66, 66, 65, 67]]
)
# 对数据进行标准化处理
stdScaler = StandardScaler()
X = stdScaler.fit_transform(X)
# 主成分分析,保留2个成分因子
pca = PCA(n_components=2)
# 拟合数据
pca.fit(X)
# 获取主成分分析后的数据
scores = pca.transform(X)
# 输出主成分得分
print(scores)
# 累计方差贡献率
print(sum(pca.explained_variance_ratio_))
在上面的代码中,我们创建了一个名为X的数据集,并将其传递给PCA函数来创建PCA模型。我们指定n_components=2,表示我们只想保留2个主成分。
然后,我们使用fit函数拟合数据,并使用transform函数获取主成分得分。最后,我们输出主成分处理后的数据。
需要注意的是,这里进行的主成分分析没有进行标准化处理,所以我们在进行拟合数据前,需要对数据进行标准化处理,降低数据差异性。
运行上述代码后,您将获得以下输出:
[[ 0.66701255 0.07769953]
[-0.37447048 -0.83884504]
[-3.75614329 2.1735795 ]
[ 2.2827183 -1.17615998]
[-2.52791503 -0.84488665]
[-0.76348234 -1.26625679]
[-0.9896892 -0.54100904]
[-1.31409197 -1.04623075]
[ 0.56040823 -0.51439486]
[ 3.78023389 1.63035825]
[-0.59954801 0.07959016]
[ 2.0183348 -0.48813021]
[ 0.79389686 -0.2458446 ]
[-1.01137617 1.28231499]
[ 1.23411185 1.7182155 ]]
0.9352535375818863
输出的主成分得分代表原始数据点的主成分得分。
后面的分数是累计方差占比,一般采用累计方差占比85%以上的成分。