创建时间:2024-09-03
首发时间:2024-09-10
最后编辑时间:2024-09-10
作者:Geeker_LStar
你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~
我是 Geeker_LStar,一名高一学生,热爱计算机和数学,我们一起加油~!
⭐(●’◡’●) ⭐
那就让我们开始吧!
豪德豪德,其实上篇只是个预告片,正片这才刚刚开始!
如果想比较好的理解这一篇的数学细节,需要你具有【矩阵特征值分解】和【矩阵奇异值分解】的前置知识,你可以在这一篇:【高中生讲机器学习】16. 线代小白也能看懂的矩阵奇异值分解!中找到对应的内容~!
同时,
话不多说,我们开始这一篇吧!!
上篇
嗯!如果你没有看过上篇,看这篇可能会有点不知所云,所以建议先过一遍上篇!
链接在这里!
【高中生讲机器学习】17. 讲人话的主成分分析,它来了!(上篇)
okaya,经过上篇的铺垫之后,终于要开始烧脑了了()((
在这里先小小透露一下,主成分分析分为“总体主成分分析”和“样本主成分分析”两种。顾名思义,总体主成分分析就是用所有的数据去做主成分分析,而样本主成分分析就是用部分数据去做主成分分析。两者在计算过程上只有一点点区别。
接下来的部分以总体主成分分析为例,有计算区别的地方我会说。
另外,沿袭之前的传统,这一部分会先讲 “如何做主成分分析”,然后再讲 “为什么这样做是有效的”。
数据预处理
(这一部分需要的一些前置知识在上一篇~~比如协方差和协方差矩阵。)
嗯。。首先我们需要获得协方差矩阵。不过在这之前,我们需要原始数据做一些预处理。
根据上篇前置部分的知识,预处理需要去掉数据的偏置(偏移量),同时消除不同维度数据的量纲对协方差的影响。所以,我们需要做两件事(前置部分说过):减去均值,并除以标准差。
这个流程被称为标准化。
okay,首先拿来原始数据。
还是一样的,我们有
n
n
n 个数据,每个数据有
m
m
m 个维度,对于第
i
i
i 个数据的第
j
j
j 个维度,我们记作
x
i
(
j
)
x_{i}^{(j)}
xi(j)。所有的数据构成一个大矩阵
X
X
X,即:
X
=
[
x
1
(
1
)
x
1
(
2
)
.
.
.
x
1
(
m
)
x
2
(
1
)
x
2
(
2
)
.
.
.
x
2
(
m
)
.
.
.
.
.
.
.
.
.
.
.
.
x
n
(
1
)
x
n
(
2
)
.
.
.
x
n
(
m
)
]
X = \begin{bmatrix} x_1^{(1)} & x_1^{(2)} & ... & x_1^{(m)}\\ x_2^{(1)} & x_2^{(2)} & ... & x_2^{(m)} \\ ... & ... & ... & ... \\ x_n^{(1)} & x_n^{(2)} & ... & x_n^{(m)} \\ \end{bmatrix}
X=
x1(1)x2(1)...xn(1)x1(2)x2(2)...xn(2)............x1(m)x2(m)...xn(m)
前面说过,对原始数据矩阵进行数据预处理的目的之一是为了消除不同维度量纲不同对最终协方差的影响。所以在进行数据预处理的时候,我们以一列为单位,对这一列进行操作。这样最终处理后的矩阵的每一个列(也就是原始数据的每一个维度)都去除了量纲的影响。
举个例子,对第一个维度(也就是
X
X
X 的第一列)进行预处理:
首先计算这个维度的均值:
μ
x
(
1
)
=
1
n
∑
i
=
1
n
X
i
(
1
)
\mu_x^{(1)}=\frac{1}{n} \sum_{i=1}^nX_i^{(1)}
μx(1)=n1i=1∑nXi(1)
然后计算这个维度的标准差(方差的算术平方根):
σ
x
(
1
)
=
1
n
∑
i
=
1
n
(
X
i
(
1
)
−
μ
x
(
1
)
)
2
\sigma_x^{(1)}=\sqrt{\frac{1}{n} \sum_{i=1}^n(X_i^{(1)}-\mu_x^{(1)})^2}
σx(1)=n1i=1∑n(Xi(1)−μx(1))2
en,这两个计算公式还是比较简单的,就不多解释了。
接下来我们还是以第一个维度为例,“减去均值,除以标准差”。
X
:
,
1
=
X
:
,
1
−
μ
x
(
1
)
σ
x
(
1
)
X_{:,1}=\frac{X_{:,1}-\mu_x^{(1)}}{\sigma_x^{(1)}}
X:,1=σx(1)X:,1−μx(1)
其中 X : , 1 X_{:,1} X:,1 就是 X X X 的第一列。
嗯,类似的,我们可以对整个矩阵做这样的操作。
这种情况下,“均值” 和 “标准差” 都是一个向量,矩阵的每一列减去向量的每一个分量的时候,会执行广播操作,把向量变成和矩阵一样的形状,然后对应位置相减/除。(简单来说就是把均值向量和标准差向量都复制
n
n
n 份变成一个和
X
X
X 一样的
n
∗
m
n*m
n∗m 的矩阵)
ok,现在我们已经得到了预处理后的数据矩阵,还是记作 X X X 吧(因为不想打下标(((()。
嗯。。。现在可以来计算协方差矩阵了!
Cov
(
X
,
X
)
=
1
n
[
X
T
X
]
\text{Cov}(X,X)=\frac{1}{n}[X^TX]
Cov(X,X)=n1[XTX]
好的,其实样本主成分分析和总体主成分分析的区别就在这里,下面是样本主成分分析的公式:
Cov
(
X
,
X
)
=
1
n
−
1
[
X
T
X
]
\text{Cov}(X,X)=\frac{1}{n-1}[X^TX]
Cov(X,X)=n−11[XTX]
其实差异就在于是取我们通常理解的均值(1/n),还是 1/n-1。
简单解释一下为什么样本主成分分析用 1/n-1.
啊好吧发现无法“简单解释”,so 写了一个小短文:【随记】终于知道样本方差无偏估计中 n-1 的来源了!
豪嘟,我们把得到的协方差矩阵记作
C
C
C,然后快速溜到下一节((((
特征值分解
好的,现在我们已经拿到协方差矩阵 C C C 了,我们接下来对它进行特征值分解。
首先再回顾一下,上篇中讲过,协方差矩阵 C C C 是一个实对称矩阵,这简直就是为特征值分解而生的()))
根据 【高中生讲机器学习】16. 线代小白也能看懂的矩阵奇异值分解! 这一篇里的内容,我们有:
C = Q A Q T C = QAQ^T C=QAQT
其中 Q Q Q 为特征向量矩阵, A A A 为特征值矩阵。
其实主成分分析的计算到现在就已经做完了。是的你可能感觉很震惊,但是事实就是我们对协方差矩阵 C C C 进行特征值分解后,主成分分析就已经算完了(((
具体来说, Q Q Q 的每一列,也就是 C C C 的每一个特征向量,都是原始数据的主成分,而 A A A 的主对角线上的每一个值,都是对应特征向量(主成分)方向上的方差。
数学化一点,对于主成分分析的计算,我们可以按照下述步骤进行:
- 获得原始数据矩阵,为了和下文统一,这里用 X T X^T XT 表示,形状为 m ∗ n m*n m∗n
- 计算 X T X^T XT 的协方差矩阵 C C C,形状为 m ∗ m m*m m∗m
- 计算 C C C 的特征值分解 C = Q A Q T C = QAQ^T C=QAQT,分解出的三个矩阵的形状均为 m ∗ m m*m m∗m
- 特征向量矩阵的 Q Q Q 的第 1 列到第 m m m 列是 m m m 个相互正交的单位向量,它们分别是 X T X^T XT 的第1 到第 m m m 主成分
- 特征值矩阵主对角线上的第 1 到第 m m m 个数字(从大到小)分别是对应主成分方向上的方差
呃啊啊啊()好吧好吧,我猜你现在在想,行行行,说是这么说的,但这总得有点道理呀()
soooooo((
重头戏现在开始!!!
为什么可以这么算?(重点!!!)
okay,又来到了一个激动人心的部分!
读者内心:一上来就告诉我用特征值分解,你也不说说为什么可以这么算。。。((
好吧好吧这不来了嘛((
(其实我当时也很好奇为什么可以这么算(
嗯,话不多说,做好面对数学的准备((天啊怎么这么多括号))))
首先,我们再次明确主成分分析在干什么——它选择原始数据中方差最大的一些方向(同时确保这些方向相互正交),并以这些方向为新的坐标轴(主成分)的方向。
那么我们现在抛开特征值分解,而是从主成分分析的目的出发,看看应该怎么计算。
首先我们有原始数据矩阵
X
X
X,它是一个
n
∗
m
n*m
n∗m 的矩阵,如下:
(其实和前面的是一样的)
X
=
[
x
1
(
1
)
x
1
(
2
)
.
.
.
x
1
(
m
)
x
2
(
1
)
x
2
(
2
)
.
.
.
x
2
(
m
)
.
.
.
.
.
.
.
.
.
.
.
.
x
n
(
1
)
x
n
(
2
)
.
.
.
x
n
(
m
)
]
X = \begin{bmatrix} x_1^{(1)} & x_1^{(2)} & ... & x_1^{(m)}\\ x_2^{(1)} & x_2^{(2)} & ... & x_2^{(m)} \\ ... & ... & ... & ... \\ x_n^{(1)} & x_n^{(2)} & ... & x_n^{(m)} \\ \end{bmatrix}
X=
x1(1)x2(1)...xn(1)x1(2)x2(2)...xn(2)............x1(m)x2(m)...xn(m)
这个大矩阵中的每一行都是一个 m m m 维的数据。
接下来,我们要寻找数据矩阵中方差最大的方向,并把这个方向作为(其中一个)新的坐标轴的方向。或者说我们要找第一主成分。
ok wait,这等价于什么,这其实就是在对原始矩阵做变换呀,这种变换可以使用一个向量
a
\mathbf{a}
a 来表示。具体来说,我们有:
x
‾
=
a
T
X
T
\overline{x}=\mathbf{a}^TX^T
x=aTXT
其中
a
T
\mathbf{a}^T
aT 是一个
1
∗
m
1*m
1∗m 的向量(
a
\mathbf{a}
a 是一个
m
∗
1
m*1
m∗1 的向量);
X
T
X^T
XT 是原始数据矩阵的转置,形状为
m
∗
n
m*n
m∗n,它的每一列都是一个数据(
m
m
m 维),一共
n
n
n 列;
x
‾
\overline{x}
x 是变换后的数据,形状为
1
∗
n
1*n
1∗n.
注意,这里有一个非常重要的点!
——在乘
a
T
\mathbf{a}^T
aT 变换之后,我们得到的
x
‾
\overline{x}
x 其实是原始数据
X
X
X 在
a
T
\mathbf{a}^T
aT 方向上投影的值。(至于为什么,我很快会写一篇文章来解释这个事情)
所以说,我们其实可以换一个方式来看这个变换:原始数据并没有变,但是原始数据所在的坐标系变了,新得到的值就是原始数据在新的坐标轴上的投影的值(或者说在新的坐标轴上的坐标)。
举个例子,要不然一堆字母实在是有点抽象()
我现在有 4 个数据,每个数据有 5 个特征,那么我的原始数据矩阵
X
X
X 的形状就是
4
∗
5
4*5
4∗5,转置后的矩阵
X
T
X^T
XT 的形状就是
5
∗
4
5*4
5∗4。那么我们要找的向量
a
T
\mathbf{a}^T
aT 的形状就是
1
∗
5
1*5
1∗5,最终得到的
a
T
X
T
=
x
‾
\mathbf{a}^TX^T=\overline{x}
aTXT=x 的形状是
1
∗
4
1*4
1∗4。这可以看作是一个行向量,这个行向量当中的每一个分量都是原始数据(4 个)在
a
T
\mathbf{a}^T
aT 方向上的坐标(投影的值)。
好的,解释完这个非常重要的点,现在问题比较明确了:
1
∗
m
1*m
1∗m 的向量那么多,我怎么知道哪个向量是最好的?
或者说,我怎么知道哪个向量
a
\mathbf{a}
a 的转置
a
T
\mathbf{a}^T
aT 代表的变换 对应着 把原始坐标轴(之一) 旋转到 原始数据中 方差最大的方向?
如果你不明白这句话的意思,可以再看看下面这张图。图中
y
1
y_1
y1(第一主成分)的方向就代表着原始坐标轴之一
x
1
x_1
x1 旋转后的方向,也即是原始数据中方差最大的方向。
x
‾
=
a
T
X
T
\overline{x}=\mathbf{a}^TX^T
x=aTXT 得到的结果就是原始数据
X
X
X 在
y
1
y_1
y1 轴上投影的值。从
x
1
x_1
x1 到
y
1
y_1
y1 的变换可以用一个向量
a
T
\mathbf{a}^T
aT 表示,我们的目标就是找到这个向量的原始形式
a
\mathbf{a}
a。(因为其实知道
a
\mathbf{a}
a 和知道
a
T
\mathbf{a}^T
aT 是等价的)
豪德,现在我们来到了最关键的部分了。
这个向量
a
\mathbf{a}
a,到底怎么找?怎么用严格的数学证明去找到它?
嗯,再再再强调一遍思路:我们要找到一个向量 a \mathbf{a} a,使得 a T X T \mathbf{a}^TX^T aTXT 的方差最大。
嗯…因为我们知道, X X X 经过向量 a T \mathbf{a}^T aT 变换后新得到的值 x ‾ \overline{x} x 就是原始数据在变换后方向上投影的值,或者说就是在变换后的坐标轴上的坐标。那既然我们都知道在新坐标轴上的坐标了,求方差这事情还不好办嘛!在正常的 x x x 坐标轴上怎么求,在新的坐标轴上就怎么求就可以了呀!
豪德,那么我们可以开始计算了。(wooow 这一部分真的很妙!)
数据在新坐标轴上的坐标为
a
T
X
T
\mathbf{a}^TX^T
aTXT,形状为
1
∗
n
1*n
1∗n,计算方差的话首先需要获得它的均值,记作
μ
(
a
T
X
T
)
\mu(\mathbf{a}^TX^T)
μ(aTXT)。
根据线性运算的性质,我们有 E ( a X ) = a E ( X ) \mathbb{E}(\mathbf{a}X)=\mathbf{a}\mathbb{E}(X) E(aX)=aE(X)(好吧这个东西我考虑放在随记里进行一些证明…)
根据这个性质,我们得到 μ ( a T X T ) = a T μ ( X T ) \mu(\mathbf{a}^TX^T)=\mathbf{a}^T\mu(X^T) μ(aTXT)=aTμ(XT),这个东西会在接下来的计算中用到。
为了计算方差,我们需要从原始矩阵中减去均值。利用矩阵乘法的分配律,我们有:
D
=
a
T
X
T
−
a
T
μ
(
X
T
)
=
a
T
(
X
T
−
μ
(
X
T
)
)
D=\mathbf{a}^TX^T-\mathbf{a}^T\mu(X^T)=\mathbf{a}^T(X^T-\mu(X^T))
D=aTXT−aTμ(XT)=aT(XT−μ(XT))
D
D
D 的形状依然是
1
∗
n
1*n
1∗n。
很好,接下来,我们用这一坨东西的转置和它自身相乘(对应元素相乘,相当于平方,符合方差的计算方式),计算最终的方差,即:
σ
(
a
T
X
T
)
=
D
D
T
=
[
a
T
(
X
T
−
μ
(
X
T
)
)
]
∗
[
a
T
(
X
T
−
μ
(
X
T
)
)
]
T
\sigma{(\mathbf{a}^TX^T)}=DD^T=\big[\mathbf{a}^T(X^T-\mu(X^T))\big]*\big[\mathbf{a}^T(X^T-\mu(X^T))\big]^T
σ(aTXT)=DDT=[aT(XT−μ(XT))]∗[aT(XT−μ(XT))]T
豪德,这玩意现在看着有点一言难尽()我们来尝试化简它。
首先先看后半部分,两次转置等于不转置,同时根据矩阵的转置规则
(
A
B
)
T
=
B
T
A
T
({AB})^T=B^TA^T
(AB)T=BTAT,我们有:
[
a
T
(
X
T
−
μ
(
X
T
)
)
]
T
=
(
X
T
−
μ
(
X
T
)
)
T
(
a
T
)
T
=
(
X
−
μ
X
)
a
\big[\mathbf{a}^T(X^T-\mu(X^T))\big]^T=(X^T-\mu(X^T))^T({\mathbf{a}^T})^T=(X-\mu{X})\mathbf{a}
[aT(XT−μ(XT))]T=(XT−μ(XT))T(aT)T=(X−μX)a
very goooood! 这样的话,我们把化简后的后半部分带进去,得到:
σ
(
a
T
X
T
)
=
a
T
(
X
T
−
μ
(
X
T
)
)
(
X
−
μ
X
)
a
\sigma{(\mathbf{a}^TX^T)}=\mathbf{a}^T(X^T-\mu(X^T))(X-\mu{X})\mathbf{a}
σ(aTXT)=aT(XT−μ(XT))(X−μX)a
看看中间那个部分!!!熟悉吗?这块其实在前面出现过!
yes!! 这个算出来的是什么,是什么,是什么,不就是 X X X 的协方差矩阵 C C C 吗!!
oyeee! 这样我们可以进一步进行化简:
σ
(
a
T
X
T
)
=
a
T
C
a
\sigma{(\mathbf{a}^TX^T)}=\mathbf{a}^TC\mathbf{a}
σ(aTXT)=aTCa
其中 a T \mathbf{a}^T aT 是我们要找的代表变换的向量, C C C 代表原始数据 X X X 的协方差矩阵。
很好!我们现在距离成功不远了!
回顾一下我们最开始的目的,我们要让这个方差 σ ( a T X T ) \sigma{(\mathbf{a}^TX^T)} σ(aTXT) 最大。
也就是说,我们要让 a T C a \mathbf{a}^TC\mathbf{a} aTCa 最大。
这是一个优化问题!
emmm 不过等等()在我们开始搞这个优化问题之前…我们需要加一个约束条件。
——我们需要让
a
\mathbf{a}
a 是单位向量!
豪嘟,在这里解释一下 why。
其实也蛮好理解的,我们找让
a
T
C
a
\mathbf{a}^TC\mathbf{a}
aTCa 最大的
a
\mathbf{a}
a,其实在这里我们关心的是
a
\mathbf{a}
a 的方向,而希望忽略
a
\mathbf{a}
a 的长度的影响。所以我们令
a
\mathbf{a}
a 为单位向量,相当于不再考虑
a
\mathbf{a}
a 的长度。
所以,我们实际上要做的是一个有约束的优化问题。如下:
m
a
x
a
a
T
C
a
s
.
t
.
a
T
a
=
1
\underset{\mathbf{a}}{max} \ \ \mathbf{a}^TC\mathbf{a} \\ s.t. \ \ \mathbf{a}^T\mathbf{a}=1
amax aTCas.t. aTa=1
okay!!! 非常完美!!我们只需要解出这个优化问题就可以了!!
好的,现在我们要引入一个叫做拉格朗日乘子法的东西了,这个东西在高数下册出现了()
关于这个东西的解释,我会在随记中说明(and 在这里放上链接),现在我们先用它。
(大概解释一下,拉格朗日乘子法是处理约束最优化问题的一种方法,它通过把约束条件加入到优化式子中来保证在满足约束条件的情况下最优化式子)
我们设拉格朗日乘子为
λ
\lambda
λ,则根据拉格朗日乘子法的规则,我们得到了新的优化问题:
m
a
x
a
a
T
C
a
−
λ
(
a
T
a
−
1
)
\underset{a}{max} \ \ \mathbf{a}^TC\mathbf{a}-\lambda(\mathbf{a}^T\mathbf{a}-1)
amax aTCa−λ(aTa−1)
豪德,现在我们要求出这个优化问题的解,也就是说,我们要分别对乘子
λ
\lambda
λ 和所求向量
a
a
a 求偏导数,并让它们为 0,即:
∂
L
∂
a
=
2
C
a
−
2
λ
a
=
0
2
C
a
=
2
λ
a
C
a
=
λ
a
\frac{\partial \mathcal{L}}{\partial \mathbf{a}} = 2 C \mathbf{a} - 2 \lambda \mathbf{a} = 0 \\ 2 C \mathbf{a} = 2 \lambda \mathbf{a} \\ C \mathbf{a} = \lambda \mathbf{a}
∂a∂L=2Ca−2λa=02Ca=2λaCa=λa
这个式子保证我们求出的值是原函数的局部最大值(因为这个函数不一定是一个凹函数,所以偏导数为 0 不一定就是全局最大值)。
同时:
∂
L
∂
λ
=
−
(
a
T
a
−
1
)
=
0
a
T
a
=
1
\frac{\partial \mathcal{L}}{\partial \lambda} = -(\mathbf{a}^T \mathbf{a} - 1)=0 \\ \mathbf{a}^T \mathbf{a} = 1
∂λ∂L=−(aTa−1)=0aTa=1
这个式子保证约束条件被满足。
好的,现在我们注意, C a = λ a C \mathbf{a} = \lambda \mathbf{a} Ca=λa 这个式子,这个形式是不是非常眼熟!!!
yessss! 这不就是特征值分解的形式吗! C C C 是矩阵, λ \lambda λ 是它的特征值, a \mathbf{a} a 是特征值 λ \lambda λ 对应的特征向量!
嗯,接下来就有新的问题了,既然现在求出的只是局部最大值,那有没有什么办法能够求出全局最大值?
或者说,现在的情况是,只要
a
\mathbf{a}
a 是协方差矩阵
C
C
C 的特征向量,那这个式子就有局部最大值。但是,到底哪个特征向量能让这个式子取得全局最大值?
好的,接下来我们回到最开始的要最大化的目标: a T C a \mathbf{a}^TC\mathbf{a} aTCa.
根据上面推出的
C
a
=
λ
a
C \mathbf{a} = \lambda \mathbf{a}
Ca=λa,我们可以进一步得到:
a
T
C
a
=
a
T
λ
a
\mathbf{a}^TC \mathbf{a} = \mathbf{a}^T\lambda \mathbf{a}
aTCa=aTλa
也就是说现在的问题变成了最大化
a
T
λ
a
\mathbf{a}^T\lambda \mathbf{a}
aTλa,注意这里的
λ
\lambda
λ 是一个标量,这个式子的运算符合向量和标量的乘法法则。
这就很简单了,向量和标量的乘法是满足交换律的,so:
a
T
λ
a
=
λ
(
a
T
a
)
=
λ
\mathbf{a}^T\lambda \mathbf{a}=\lambda (\mathbf{a}^T\mathbf{a})=\lambda
aTλa=λ(aTa)=λ
也就是说,方差 a T C a \mathbf{a}^TC\mathbf{a} aTCa 的计算结果就是矩阵 C C C 的某个特征向量 a \mathbf{a} a 对应的特征值!
那么,我现在要这个方差最大,也就是,要这个特征值最大。
那这事不就搞定了吗??!要选的特征值是最大的特征值,而 a \mathbf{a} a 就是这个特征值对应的特征向量呀!
这不就推出来了嘛!!第一主成分的方向就是协方差矩阵最大特征值对应的特征向量的方向!!!(其实也就是特征值矩阵的第一行(构成的行向量)的方向)
至此,我们已经取得了非常大的成功!第一个算是完整推出来了!!
嗯不过()等等()不是说推出这个就 ok 了,后面其实还有((
现在第一主成分的推导已经有了,我们把这个特征向量(第一主成分)记作
a
1
\mathbf{a}_1
a1,对应的特征值(其实也就是
a
1
\mathbf{a}_1
a1 方向上的方差)记作
λ
1
\lambda_1
λ1。即,第一主成分
a
1
\mathbf{a}_1
a1 满足关系:
C
a
1
=
λ
1
a
1
C\mathbf{a}_1 = \lambda_1\mathbf{a}_1
Ca1=λ1a1
接下来,我们来找 a 2 \mathbf{a}_2 a2,即第二主成分, a 2 \mathbf{a}_2 a2 应该满足:
- 是单位向量(这是最基本的要求但是有些时候容易被忽略(比如我就是最后才想起来还有这个约束条件
- a 2 \mathbf{a}_2 a2 和 a 1 \mathbf{a}_1 a1 正交(因为我们前面说了,原始坐标系中的标准正交基在变换后依然需要是标准正交基,也就是 a 2 T \mathbf{a}_2^T a2T 和 a 1 T \mathbf{a}_1^T a1T 正交,等价于 a 2 \mathbf{a}_2 a2 和 a 1 \mathbf{a}_1 a1 正交)
- a 2 \mathbf{a}_2 a2 的方向是原始数据 X X X 中方差第二大的方向(因为方差第一大的方向是 a 1 \mathbf{a}_1 a1 的方向)
这些要求都算好理解,就不再赘述了。
嗯,还是推导有趣,我们继续推导吧(((什么欠揍的话啊不是
这玩意其实也就是个约束最优化问题啊,只不过约束条件变多了而已。约束条件在上面已经说过了。这里直接写式子,一个需要最大化的式子和两个约束条件:
m
a
x
a
2
a
2
T
C
a
2
s
.
t
.
a
2
T
a
2
=
1
s
.
t
a
2
T
a
1
=
a
1
T
a
2
=
0
\underset{\mathbf{a}_2}{max} \ \ \mathbf{a}_2^TC\mathbf{a}_2 \\ s.t. \ \mathbf{a}_2^T \mathbf{a}_2 = 1 \\ s.t \ \mathbf{a}_2^T \mathbf{a}_1 = \mathbf{a}_1^T\mathbf{a}_2 = 0
a2max a2TCa2s.t. a2Ta2=1s.t a2Ta1=a1Ta2=0
豪德,还是用拉格朗日乘子法。
m
a
x
a
2
a
2
T
C
a
2
−
λ
(
a
2
T
a
2
−
1
)
−
ϕ
(
a
2
T
a
1
)
\underset{\mathbf{a}_2}{max} \ \ \mathbf{a}_2^TC\mathbf{a}_2-\lambda(\mathbf{a}_2^T\mathbf{a}_2-1)-\phi(\mathbf{a}_2^T \mathbf{a}_1)
a2max a2TCa2−λ(a2Ta2−1)−ϕ(a2Ta1)
嗯,还是求偏导。。这次是对 a 2 \mathbf{a}_2 a2 求偏导,并让偏导等于 0。
2 C a 2 − 2 λ a 2 − ϕ a 1 = 0 2C\mathbf{a}_2-2\lambda\mathbf{a}_2-\phi\mathbf{a}_1=0 2Ca2−2λa2−ϕa1=0
嗯,怎么感觉最后一项看着这么令人不适()这个 a 1 \mathbf{a}_1 a1 好碍事()
好的于是我们采取《一些措施》来去掉它…(我去我现在好困我感觉我打出来的字要变形了())
我们不妨在等式两边同时乘一个
a
1
T
\mathbf{a}_1^T
a1T,右边还是 0,左边变成:
2
a
1
T
C
a
2
−
2
a
1
T
λ
a
2
−
ϕ
a
1
T
a
1
=
0
2\mathbf{a}_1^TC\mathbf{a}_2-2\mathbf{a}_1^T\lambda \mathbf{a}_2-\phi\mathbf{a}_1^T\mathbf{a}_1 = 0
2a1TCa2−2a1Tλa2−ϕa1Ta1=0
豪德,现在我们来分析一下这个式子:
左边的第一项:
a
1
T
C
a
2
=
(
C
T
a
1
)
T
a
2
=
(
C
a
1
)
T
a
2
=
(
λ
a
1
)
T
a
2
=
λ
a
1
T
a
2
=
λ
⋅
0
=
0
\mathbf{a}_1^TC\mathbf{a}_2=(C^T\mathbf{a}_1)^T\mathbf{a}_2=(C\mathbf{a}_1)^T\mathbf{a}_2 \\ =(\lambda\mathbf{a}_1)^T\mathbf{a}_2=\lambda\mathbf{a}_1^T\mathbf{a}_2=\lambda · 0 = 0
a1TCa2=(CTa1)Ta2=(Ca1)Ta2=(λa1)Ta2=λa1Ta2=λ⋅0=0
左边的第二项:
a
1
T
λ
a
2
=
λ
a
1
T
a
2
=
λ
⋅
0
=
0
\mathbf{a}_1^T\lambda \mathbf{a}_2=\lambda\mathbf{a}_1^T\mathbf{a}_2=\lambda · 0 = 0
a1Tλa2=λa1Ta2=λ⋅0=0
嗯,现在这个式子,前两项为 0,最终的结果也是 0,说明第三项也就是
ϕ
a
1
T
a
1
\phi\mathbf{a}_1^T\mathbf{a}_1
ϕa1Ta1 也等于 0。但是我们知道,
a
1
T
a
1
=
1
\mathbf{a}_1^T\mathbf{a}_1=1
a1Ta1=1,这说明什么,说明
ϕ
\phi
ϕ 只能是 0。那么上面的式子就变成了:
2
a
1
T
C
a
2
−
2
a
1
T
λ
a
2
=
0
2\mathbf{a}_1^TC\mathbf{a}_2-2\mathbf{a}_1^T\lambda \mathbf{a}_2 = 0
2a1TCa2−2a1Tλa2=0
再把
2
a
1
T
2\mathbf{a}_1^T
2a1T 消去,这个式子不就是:
C
a
2
=
λ
a
2
C\mathbf{a}_2 = \lambda\mathbf{a}_2
Ca2=λa2
又是熟悉的形式()()
好的,那么还是带回到原方差的式子:
a
2
T
C
a
2
\mathbf{a}_2^TC\mathbf{a}_2
a2TCa2
即:
a
2
T
C
a
2
=
a
2
T
λ
a
2
=
λ
\mathbf{a}_2^TC\mathbf{a}_2=\mathbf{a}_2^T\lambda\mathbf{a}_2=\lambda
a2TCa2=a2Tλa2=λ
嗯,那现在要找让 λ \lambda λ 最大的 a 2 \mathbf{a}_2 a2,那很显然就是协方差矩阵 C C C 的第二个特征向量呀,我们把这个值记作 a 2 \mathbf{a}_2 a2,也就是我们的第二主成分((呃呃呃呃,这里就把变量和变量的最优解用一个符号表示了)。then,我们把这个第二主成分对应的特征值,也就是原始数据 X X X 在该方向上的方差,记作 λ 2 \lambda_2 λ2.
第二主成分
a
2
\mathbf{a}_2
a2 满足关系:
C
a
2
=
λ
2
a
2
C\mathbf{a}_2=\lambda_2\mathbf{a}_2
Ca2=λ2a2
好的!!!第二个也就这么推出来了!!
后面就不用推了,计算过程都是同理。我大概写一下对于第 m m m 主成分,要最大化的式子和约束条件:
- 我们要最大化的是 a m T C a m \mathbf{a}_m^TC\mathbf{a}_m amTCam,即 m a x a m a m T C a m \underset{\mathbf{a}_m}{max} \ \ \mathbf{a}_m^TC\mathbf{a}_m ammax amTCam
- a m \mathbf{a}_m am 是一个单位向量,即 a m T a m = 1 \mathbf{a}_m^T\mathbf{a}_m=1 amTam=1
- a m \mathbf{a}_m am 和第一到第 m − 1 m-1 m−1 主成分都正交,即 a 1 T a m = 0 \mathbf{a}_1^T\mathbf{a}_m=0 a1Tam=0, a 2 T a m = 0 \mathbf{a}_2^T\mathbf{a}_m=0 a2Tam=0, … , a ( m − 1 ) T a m = 0 \mathbf{a}_{(m-1)}^T\mathbf{a}_m=0 a(m−1)Tam=0
嗯,然后总结一下,In General!!:
一般地,原始数据
X
T
X^T
XT 的第
k
k
k 主成分是
a
k
\mathbf{a}_k
ak,并且
v
a
r
(
a
k
T
X
T
var(\mathbf{a}_k^TX^T
var(akTXT)=
λ
k
\lambda_k
λk(即原始数据在
a
k
\mathbf{a}_k
ak 方向上的方差等于
λ
k
\lambda_k
λk)。这里的
λ
k
\lambda_k
λk 是
X
T
X^T
XT 的协方差矩阵
C
C
C 的第
k
k
k 大的特征值,
a
k
\mathbf{a}_k
ak 则是这个特征值对应的单位特征向量。
豪德,我想现在你应该明白【对原始数据 X X X 进行总体主成分分析】和【对原始数据 X X X 的协方差矩阵 C C C 进行特征值分解】之间的关系了!!
okay! 现在,你已经搞明白了主成分分析中最核心的内容了!!Nice!!
数学推导总结
eeeee()()上一部分的数学推导强度貌似有那么点大()so 我们先小小总结一下,抛开计算细节,简单梳理一下我们是怎么推导出主成分分析和原始数据协方差矩阵特征值分解之间的关系的。
首先我们明确了目的:寻找一个单位向量 a \mathbf{a} a,使得原始数据 X T X^T XT 经过向量 a \mathbf{a} a 变换后的得到的数据的方差最大,这个方差记作 σ ( a T X T ) \sigma({\mathbf{a}^TX^T}) σ(aTXT) 来表示。
然后,我们对 σ ( a T X T ) \sigma(\mathbf{a}^TX^T) σ(aTXT) 进行了一波变形,得到这玩意等于 a T C a \mathbf{a}^TC\mathbf{a} aTCa,其中 C C C 是 X T X^T XT 对应的协方差矩阵。
然后我们的问题就变成了在约束条件(单位向量)下最大化
a
T
C
a
\mathbf{a}^TCa
aTCa,我们使用拉格朗日乘子法,解得
C
a
=
λ
a
C\mathbf{a}=\lambda\mathbf{a}
Ca=λa,这表明
a
\mathbf{a}
a 是协方差矩阵
C
C
C 的特征向量,
λ
\lambda
λ 是这个特征向量对应的特征值。
同时,
a
T
C
a
=
λ
\mathbf{a}^TC\mathbf{a}=\lambda
aTCa=λ。这样一来,我们的问题就变成了:找到一个特征向量
a
\mathbf{a}
a,使得它对应的特征值
λ
\lambda
λ 尽可能大。
这样,自然地, λ \lambda λ 的解就是协方差矩阵 C C C 的最大特征值,而 a \mathbf{a} a 的解就是这个最大特征值对应的特征向量,也即是第一主成分。
对于第二及后续的主成分,我们都可以使用类似的方法求出,唯一的区别是约束条件会变多一点,但是这些也都可以使用拉格朗日乘子法进行解决。
这样,我们就可以通过对原始数据求协方差矩阵,并对协方差矩阵进行特征值分解的方式,求出第一一直到第 m m m 主成分啦!!
嗯,然后再强调一下,第 k k k 主成分(第 k k k 个特征向量) a k \mathbf{a}_k ak 对应的特征值 λ k \lambda_k λk 为 a k \mathbf{a}_k ak 方向的方差(还记得吗,我们最后把方差 a k T C a k \mathbf{a}_k^TC\mathbf{a}_k akTCak 化简成 λ k \lambda_k λk 了)(我们后面会用到这个)
好的!!现在,你应该已经对主成分分析的数学计算及其推导有了深入的了解!下面我们开启一个新的 part——现在分解是分解完了,可然后呢???
矩阵近似 / 数据降维
嗯,搞完上面那一大大大长串的计算 & 推导流程,我们总得知道计算完的东西怎么进一步处理吧()()
豪德,现在让我们唤醒一下久远的记忆。。。。(感觉有些时候搞完数学推导就忘了自己本来要干啥了((((
——主成分分析要干什么来着?!(上篇里说的)
——哦!要给数据降维,要捕捉数据中最重要的特征…
所以。。。我们怎么实现这个()?
通常来讲,有两种方法:累计方差解释比例 & 碎石图(emm 我也感觉这个名字十分诡异()或许它还有我不知道的比较正常的叫法()它的英文是 scree plot)
先看累计方差比例。
前面不远的地方刚刚说过, λ k \lambda_k λk 是第 k k k 主成分 a k \mathbf{a}_k ak 方向上的方差。如果我们一共有 m m m 个主成分(原始坐标系一共有 m m m 条坐标轴),那么 ∑ i = 1 m λ k = ∑ i = 1 m σ 2 \sum_{i=1}^{m}\lambda_k=\sum_{i=1}^{m}\sigma^2 i=1∑mλk=i=1∑mσ2
也就是说,【经过空间变换后的所有主成分方向上】的方差加起来就等于【空间变换前的原始坐标系的各坐标轴上】的方差加起来,相当于就是原始方差,没变,只是换了个方式。
只不过,和原始坐标系各坐标轴上的方差不同的是,主成分方向上的方差是彼此无关的(彼此独立的),每个主成分方向上的方差都只反映这一个方向的信息。
啊扯远了()所以累计方差比例是什么??
嗯,这个东西本身很好理解,它就是我们 【选择的主成分方向上的方差之和】与【总方差】的比例。比如我们选择了前
k
k
k 个主成分,则计算公式如下:
Cumulative variance proportion
=
∑
i
=
1
k
λ
i
∑
i
=
1
m
λ
i
\text{Cumulative variance proportion}=\frac{\sum_{i=1}^{k}\lambda_i}{\sum_{i=1}^{m}\lambda_i}
Cumulative variance proportion=∑i=1mλi∑i=1kλi
嗯…不过计算这个东西的意义,或者说作用,是什么?
weeeell,well,主成分分析要给数据降维,对吧,也就是说我们不能选择所有主成分(那样相当于换了一种方式表示数据,但是维度还是没变)。所以我们得选择那些包含了最重要信息的主成分,并用它们对原始数据进行近似。(详情请看上篇)
前面说过很多次了,排的靠前的主成分的方向代表了数据中方差最大(特征最鲜明)的方向,所以在我们选择主成分的时候,肯定是从第一主成分开始选。
但是,现在的问题是,从第一主成分开始,到第多少主成分结束?
豪德这就是累计方差比例上场的时候了——选到第多少主成分,取决于我们想要保留多少信息。
(因为主成分对应的特征值反映的就是主成分方向的方差,而方差反映的就是原始数据的信息)
比如说,我们想要保留 80% 的原始信息,那么我们就需要做到【选择的主成分方向的方差(特征值)的和】是【总方差】的 80%。即:
∑ i = 1 k λ k ∑ i = 1 m λ k = 0.8 \frac{\sum_{i=1}^{k}\lambda_k}{\sum_{i=1}^{m}\lambda_k}=0.8 ∑i=1mλk∑i=1kλk=0.8
其实蛮好理解的,累计方差比例就是帮我们决定需要选择多少个主成分。只要这些主成分方向的方差(特征值)的和达到了规定的累计方差比例,就 ok 了。
放个图,从上上篇里贴过来的:
emm 这个图展示的其实是奇异值分解,不完全一样,不过我们忽略图内部具体的数值,只是用它来看一下主成分分析中主成分的选择。
我们暂且把红框里的数字看作特征值(对应的矩阵就是特征值矩阵),也就是第一到第四主成分方向上的方差。那么总方差就是四个数值加起来,最后算出 32.65。
假设我们需要的累计方差比例是 0.8,也就是说我们选择的主成分要满足对应的特征值加起来除以总方差 >= 0.8(同时主成分数量要尽可能少)。
well,
21.2
/
32.65
=
0.64
21.2 / 32.65=0.64
21.2/32.65=0.64,不满足 0.8;
21.2
+
6.4
/
32.65
=
0.84
>
0.8
21.2+6.4 / 32.65 = 0.84 > 0.8
21.2+6.4/32.65=0.84>0.8。
so 我们需要选择第一主成分和第二主成分!
就这么简单()
嗯,现在应该非常清晰了!
豪嘟()那么我们来看看下一个,scree plot,它又是怎么搞的?(好吧主要是碎石图这个名字实在是太诡异了,所以咱们还是英文称呼吧())
好吧这个名字实在是有点抽象 so 我们直接上一张图吧()我估计看完你就能猜到这玩意是怎么回事了()
嗯…这太明显了,图片中有一个 “拐点”,类似于手肘一样的地方,没错就是 factor number = 2 的地方。
这个地方暗示了什么呢?很简单,它表示从 factor 2 开始,后续的部分对于最终的方差贡献就很小了,或者说我们就可以忽略后面的部分了(细节,这个图的纵轴 eigenvalue,就是特征值,放到我们的语境里就是方差)。
在实际当中,我们也可以利用 scree plot,选择拐点之前的所有主成分作为最终需要的主成分。
这两种方法都可以实现对主成分的选择,进而实现对数据的降维!
最终放一个非常直观的降维结果,从三维到二维。
嗯!那么到此为止,主成分分析的数学计算方法、数学原理推导、主成分选择方法都讲完了!!!
或者说,主成分分析已经讲完了((((
简单做一下概括,我们可以通过对原始数据的协方差矩阵进行特征值分解,得到所有主成分及对应方向上的方差,这种做法的有效性和合理性是可以被证明的。获得所有主成分后,我们可以通过累计方差比例或 scree plot 对主成分进行选择,最终实现数据降维。
en…恭喜你!!! 你已经搞定了这个很难的算法!!!
嗯!那这一篇就到这里啦!我们下一篇再见!!
(aaaa 在三篇高强度文章之后,下一篇我打算写点轻松的,for eg,聚类??(我考虑考虑)(它简单且直观()不像 PCA 简直要人命()())
这篇文章给出了主成分分析的计算方法及非常详细的数学推导,希望对你有所帮助!⭐
欢迎三连!!一起加油!🎇
——Geeker_LStar