文章目录
1.PCA(principal component analysis)主成分分析定义
PCA主要思想是将N维特征映射到K维上,这里的K维是全新的正交特征,是相互垂直的线性无关向量,也称为主成分,K维是在原有的N维特征的基础上重新构造出来的K维特征。PCA的工作是从原始的空间中顺序的找到一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。
2.PCA中心思想:一个中心,两个基本点
- 一个中心:原始特征空间的重构;
将特征数据由线性相关转换成线性无关 ( 线性相关 ↦ 线性无关 ) (线性相关\mapsto线性无关) (线性相关↦线性无关) - 两个基本点:最大投影方差和最小重构距离
两种对原始特征空间的重构特征方式,我们通过要求转换后的数据拥有最大投影方差和最小重构距离来实现最好的线性相关到线性无关的转换。
注:当数据向 u 1 方向投影的时候,可以看出数据的投影距离比较扩散,相当于方差较大,所以 u 1 方向好√ 注:当数据向u_1方向投影的时候,可以看出数据的投影距离比较扩散,相当于方差较大,所以u_1方向好√ 注:当数据向u1方向投影的时候,可以看出数据的投影距离比较扩散,相当于方差较大,所以u1方向好√
注:当数据向 u 2 方向投影的时候,可以看出数据的投影距离比较集中,相当于方差较小,所以 u 2 方向差 × 注:当数据向u_2方向投影的时候,可以看出数据的投影距离比较集中,相当于方差较小,所以u_2方向差× 注:当数据向u2方向投影的时候,可以看出数据的投影距离比较集中,相当于方差较小,所以u2方向差×
因为数据在 u 1 u_1 u1方向的重构距离更小,投影方差最大,所以满足最小重构距离和最大投影方差这两个特性
3.PCA数学建模-最大投影方差
3.1数据中心化处理-最大投影方差
将数据移动到原点,使得期望为零,方便计算
X
i
−
X
ˉ
;
中心化处理
(1)
X_i-\bar{X}\tag{1};中心化处理
Xi−Xˉ;中心化处理(1)
定义
L
i
为向量
X
i
−
X
ˉ
在
u
1
方向的投影
,
为方便计算,我们定义
∣
∣
u
1
∣
∣
=
∣
∣
u
1
T
u
1
∣
∣
=
1
定义L_i为向量X_i-\bar{X}在u_1方向的投影,为方便计算,我们定义||u_1||=||u_1^Tu_1||=1
定义Li为向量Xi−Xˉ在u1方向的投影,为方便计算,我们定义∣∣u1∣∣=∣∣u1Tu1∣∣=1
L
i
=
(
X
i
−
X
ˉ
)
T
u
1
;
s
t
∣
∣
u
1
T
u
1
∣
∣
=
1
(2)
L_i=(X_i-\bar{X})^Tu_1;st ||u_1^Tu_1||=1 \tag{2}
Li=(Xi−Xˉ)Tu1;st∣∣u1Tu1∣∣=1(2)
我们的目标是满足:最大投影方差,所以我们定义目标函数J
由于
L
i
为投影,并且数据已经中心化了,所以
L
i
2
为投影方差
由于L_i为投影,并且数据已经中心化了,所以L_i^2为投影方差
由于Li为投影,并且数据已经中心化了,所以Li2为投影方差
J
=
a
r
g
m
a
x
∑
i
=
1
N
1
N
L
i
2
=
a
r
g
m
a
x
1
N
∑
i
=
1
N
(
(
X
i
−
X
ˉ
)
T
u
1
)
2
;
s
t
:
∣
∣
u
1
T
u
1
∣
∣
=
1
(3)
J=argmax \sum_{i=1}^{N} \frac{1}{N}L_i^2=argmax \frac{1}{N}\sum_{i=1}^{N}((X_i-\bar{X})^Tu_1)^2;\quad st: \quad ||u_1^Tu_1||=1\tag{3}
J=argmaxi=1∑NN1Li2=argmaxN1i=1∑N((Xi−Xˉ)Tu1)2;st:∣∣u1Tu1∣∣=1(3)
J
=
a
r
g
m
a
x
1
N
∑
i
=
1
N
u
1
T
⋅
(
X
i
−
X
ˉ
)
⋅
(
X
i
−
X
ˉ
)
T
⋅
u
1
s
t
:
∣
∣
u
1
T
u
1
∣
∣
=
1
(4)
J=argmax \frac{1}{N}\sum_{i=1}^{N}u_1^T\cdot (X_i-\bar{X})\cdot (X_i-\bar{X})^T \cdot u_1\quad st: \quad ||u_1^Tu_1||=1\tag{4}
J=argmaxN1i=1∑Nu1T⋅(Xi−Xˉ)⋅(Xi−Xˉ)T⋅u1st:∣∣u1Tu1∣∣=1(4)
J
=
a
r
g
m
a
x
u
1
T
[
1
N
∑
i
=
1
N
(
X
i
−
X
ˉ
)
⋅
(
X
i
−
X
ˉ
)
T
]
u
1
s
t
:
∣
∣
u
1
T
u
1
∣
∣
=
1
(4)
J=argmax u_1^T [\frac{1}{N}\sum_{i=1}^{N}(X_i-\bar{X})\cdot (X_i-\bar{X})^T]u_1\quad st: \quad ||u_1^Tu_1||=1\tag{4}
J=argmaxu1T[N1i=1∑N(Xi−Xˉ)⋅(Xi−Xˉ)T]u1st:∣∣u1Tu1∣∣=1(4)
J
=
a
r
g
m
a
x
(
u
1
T
⋅
S
⋅
u
1
)
s
t
:
∣
∣
u
1
T
u
1
∣
∣
=
1
(5)
J=argmax(u_1^T \cdot S \cdot u_1)\quad st: \quad ||u_1^Tu_1||=1\tag{5}
J=argmax(u1T⋅S⋅u1)st:∣∣u1Tu1∣∣=1(5)
我们的目标是为了找到方向
u
1
u_1
u1,所以我们用拉格朗日乘子法求解带约束问题:
u
^
=
a
r
g
m
a
x
(
u
1
T
⋅
S
⋅
u
1
)
;
s
t
∣
∣
u
1
T
u
1
∣
∣
=
1
(6)
\hat{u}=argmax(u_1^T \cdot S \cdot u_1)\quad ;st ||u_1^Tu_1||=1 \tag{6}
u^=argmax(u1T⋅S⋅u1);st∣∣u1Tu1∣∣=1(6)
转换成:
L
(
u
1
,
λ
)
=
u
1
T
⋅
S
⋅
u
1
+
λ
(
1
−
u
1
T
u
1
)
(7)
L(u_1,\lambda)=u_1^T \cdot S \cdot u_1+\lambda(1-u_1^Tu_1) \tag{7}
L(u1,λ)=u1T⋅S⋅u1+λ(1−u1Tu1)(7)
对上式
L
(
u
1
,
λ
)
求导:
L(u_1,\lambda)求导:
L(u1,λ)求导:
∂
L
(
u
1
,
λ
)
∂
u
1
=
2
S
u
1
−
2
λ
u
1
=
0
(8)
\frac{\partial L(u_1,\lambda)}{\partial u_1}=2Su_1-2\lambda u_1=0 \tag{8}
∂u1∂L(u1,λ)=2Su1−2λu1=0(8)
3.2 结论-最大投影方差
结论:
S
u
1
^
=
λ
u
1
^
(9)
结论:S\hat{u_1}=\lambda \hat{u_1} \tag{9}
结论:Su1^=λu1^(9)
注:
u
1
^
=
方差矩阵
S
所对应的特征向量;
λ
=
特征向量对应的特征值
注:\hat{u_1}=方差矩阵S所对应的特征向量;\lambda=特征向量对应的特征值
注:u1^=方差矩阵S所对应的特征向量;λ=特征向量对应的特征值
我们要求的最大投影方差所在的向量为样本方差
S
所在的特征向量
u
1
^
我们要求的最大投影方差所在的向量为样本方差S所在的特征向量\hat{u_1}
我们要求的最大投影方差所在的向量为样本方差S所在的特征向量u1^
4.PCA数学建模-最小重构距离
4.1 核心思想
最小重构距离的含义是:首先我们将原始空间的特征向量进行重构,转换成由一组线性无关的向量组成,最小重构就是我们要求转换后的数据
X
^
与原来的数据
X
之间的损失最小
,
即我们用新的坐标轴去恢复数据的时候损失最小。
\hat{X}与原来的数据X之间的损失最小,即我们用新的坐标轴去恢复数据的时候损失最小。
X^与原来的数据X之间的损失最小,即我们用新的坐标轴去恢复数据的时候损失最小。
J
=
1
N
∑
i
=
1
N
∣
∣
X
i
−
X
i
^
∣
∣
2
(10)
J=\frac{1}{N}\sum_{i=1}^{N}||X_i-\hat{X_i}||^2 \tag{10}
J=N1i=1∑N∣∣Xi−Xi^∣∣2(10)
4.2 坐标转换
(我们定义数据是实现样本X中心化后:
X
i
−
X
ˉ
,
u
1
为此方向的单位向量;大小:
L
i
=
(
X
i
−
X
ˉ
)
T
u
1
;方向:
u
1
X_i-\bar{X},u_1为此方向的单位向量;大小:L_i=(X_i-\bar{X})^Tu_1;方向:u_1
Xi−Xˉ,u1为此方向的单位向量;大小:Li=(Xi−Xˉ)Tu1;方向:u1
假设样本数据
X
i
X_i
Xi在原来的坐标系
x
1
,
x
2
上的坐标为
(
x
1
,
x
2
)
,
我们将其转换至新的坐标系
u
1
,
u
2
上,可得:
x_1,x_2上的坐标为(x_1,x_2),我们将其转换至新的坐标系u_1,u_2上,可得:
x1,x2上的坐标为(x1,x2),我们将其转换至新的坐标系u1,u2上,可得:
X
u
1
=
(
(
X
i
−
X
ˉ
)
T
u
1
)
u
1
(11)
X_{u1}=((X_i-\bar{X})^Tu_1)u_1 \tag{11}
Xu1=((Xi−Xˉ)Tu1)u1(11)
同理对于第k个方向,我们可以得到
u
k
u_k
uk方向的新坐标:
X
u
k
=
(
(
X
i
−
X
ˉ
)
T
u
k
)
u
k
(12)
X_{uk}=((X_i-\bar{X})^Tu_k)u_k \tag{12}
Xuk=((Xi−Xˉ)Tuk)uk(12)
那么我们定义原来的数据X在新的坐标系下的表示(p维):
X
i
=
∑
k
=
1
p
(
(
X
i
−
X
ˉ
)
T
u
k
)
u
k
(13)
X_i=\sum_{k=1}^{p}((X_i-\bar{X})^Tu_k)u_k \tag{13}
Xi=k=1∑p((Xi−Xˉ)Tuk)uk(13)
那么我们定义降维后的数据
X
^
\hat{X}
X^在新的坐标系下的表示(q维):
X
i
^
=
∑
k
=
1
q
(
(
X
i
−
X
ˉ
)
T
u
k
)
u
k
(14)
\hat{X_i}=\sum_{k=1}^{q}((X_i-\bar{X})^Tu_k)u_k \tag{14}
Xi^=k=1∑q((Xi−Xˉ)Tuk)uk(14)
那么我们可以将J表示如下:
J
=
1
N
∑
i
=
1
N
∣
∣
X
i
−
X
i
^
∣
∣
2
(15)
J=\frac{1}{N}\sum_{i=1}^{N}||X_i-\hat{X_i}||^2 \tag{15}
J=N1i=1∑N∣∣Xi−Xi^∣∣2(15)
J
=
1
N
∑
i
=
1
N
∣
∣
∑
k
=
1
p
(
(
X
i
−
X
ˉ
)
T
u
k
)
u
k
−
∑
k
=
1
q
(
(
X
i
−
X
ˉ
)
T
u
k
)
u
k
∣
∣
2
(16)
J=\frac{1}{N}\sum_{i=1}^{N}||\sum_{k=1}^{p}((X_i-\bar{X})^Tu_k)u_k-\sum_{k=1}^{q}((X_i-\bar{X})^Tu_k)u_k||^2 \tag{16}
J=N1i=1∑N∣∣k=1∑p((Xi−Xˉ)Tuk)uk−k=1∑q((Xi−Xˉ)Tuk)uk∣∣2(16)
J
=
1
N
∑
i
=
1
N
∣
∣
∑
k
=
q
+
1
p
(
(
X
i
−
X
ˉ
)
T
u
k
)
u
k
∣
∣
2
(17)
J=\frac{1}{N}\sum_{i=1}^{N}||\sum_{k=q+1}^{p}((X_i-\bar{X})^Tu_k)u_k||^2 \tag{17}
J=N1i=1∑N∣∣k=q+1∑p((Xi−Xˉ)Tuk)uk∣∣2(17)
J
=
1
N
∑
i
=
1
N
∑
k
=
q
+
1
p
[
(
X
i
−
X
ˉ
)
T
u
k
]
2
(18)
J=\frac{1}{N}\sum_{i=1}^{N}\sum_{k=q+1}^{p}[(X_i-\bar{X})^Tu_k]^2 \tag{18}
J=N1i=1∑Nk=q+1∑p[(Xi−Xˉ)Tuk]2(18)
J
=
∑
k
=
q
+
1
p
∑
i
=
1
N
1
N
[
(
X
i
−
X
ˉ
)
T
u
k
]
2
(19)
J=\sum_{k=q+1}^{p} \sum_{i=1}^{N} \frac{1}{N}[(X_i-\bar{X})^Tu_k]^2 \tag{19}
J=k=q+1∑pi=1∑NN1[(Xi−Xˉ)Tuk]2(19)
由于
∑
i
=
1
N
1
N
[
(
X
i
−
X
ˉ
)
T
u
k
]
2
=
u
k
T
S
u
k
;
且,
u
k
T
u
k
=
1
由于\sum_{i=1}^{N} \frac{1}{N}[(X_i-\bar{X})^Tu_k]^2=u_k^TSu_k;且,u_k^Tu_k=1
由于∑i=1NN1[(Xi−Xˉ)Tuk]2=ukTSuk;且,ukTuk=1
J
=
∑
k
=
q
+
1
p
u
k
T
S
u
k
;
s
t
:
u
k
T
u
k
=
1
;
(20)
J=\sum_{k=q+1}^{p}u_k^TSu_k;\quad st:u_k^Tu_k=1;\tag{20}
J=k=q+1∑pukTSuk;st:ukTuk=1;(20)
同样我们用拉格朗日乘子法:
J
=
a
r
g
m
i
m
(
u
q
+
1
,
⋯
,
u
p
,
λ
)
∑
k
=
q
+
1
p
u
k
T
S
u
k
+
λ
(
1
−
u
k
T
u
k
)
(21)
J=argmim_{(u_{q+1},\cdots,u_p,\lambda)}\sum_{k=q+1}^{p}u_k^TSu_k+\lambda(1-u_k^Tu_k) \tag{21}
J=argmim(uq+1,⋯,up,λ)k=q+1∑pukTSuk+λ(1−ukTuk)(21)
损失函数最小取在S特征向量对应的特征值中剩下最小的几个值之和。
5. PCA 和最小二乘法的关系
5.1 PCA主成分分析
- PCA 步骤如下:
– step1: 将样本 X标准化
X σ = X − μ σ (22) X_{\sigma}= \frac{X-\mu}{\sigma} \tag{22} Xσ=σX−μ(22)
– step2: 求协方差矩阵 X σ X σ T X_{\sigma}X_{\sigma}^T XσXσT:本质上是构建投影向量 u 0 u_0 u0,投影方程如下:
L = u 0 T X σ X σ T u 0 , s t : u 0 T u 0 = 1 (23) L=u_0^TX_{\sigma}X_{\sigma}^Tu_0,st:u_0^Tu_0=1 \tag{23} L=u0TXσXσTu0,st:u0Tu0=1(23)
– step3:应用拉格朗日乘子法可得:
L = u 0 T X σ X σ T u 0 + λ ( 1 − u 0 T u 0 ) (24) L=u_0^TX_{\sigma}X_{\sigma}^Tu_0+\lambda(1-u_0^Tu_0) \tag{24} L=u0TXσXσTu0+λ(1−u0Tu0)(24)
– step4: 求偏导:
∂ L ∂ u 0 = 2 X σ X σ T u 0 − 2 λ u 0 = 0 → X σ X σ T u 0 = λ u 0 (25) \frac{\partial{L}}{\partial{u_0}}=2X_{\sigma}X_{\sigma}^Tu_0-2\lambda u_0=0\to X_{\sigma}X_{\sigma}^Tu_0=\lambda u_0 \tag{25} ∂u0∂L=2XσXσTu0−2λu0=0→XσXσTu0=λu0(25)
– step5: 也就是说协方差矩阵 X σ X σ T X_{\sigma}X_{\sigma}^T XσXσT的特征值和特征向量就是使得投影尺寸最大或者最小,如果我们选择特征值大的k部分和对应的特征向量,那么我们就能得到最大投影尺寸,也就是最小重构尺寸。
– step6: 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵,将协方差矩阵 X σ X σ T X_{\sigma}X_{\sigma}^T XσXσT的最大值k和对应的特征向量构成新的矩阵 X k X_k Xk
– step7: 将数据转换到k个特征向量构建的新空间中
5.2 最小二乘法
最小二乘法步骤:
– step1: 构建损失函数:
L
=
(
A
x
−
b
)
T
(
A
x
−
b
)
=
(
x
T
A
T
−
b
T
)
(
A
x
−
b
)
=
x
T
A
T
A
x
−
2
x
T
A
T
b
+
b
T
b
(26)
L=(Ax-b)^T(Ax-b)=(x^TA^T-b^T)(Ax-b)=x^TA^TAx-2x^TA^Tb+b^Tb \tag{26}
L=(Ax−b)T(Ax−b)=(xTAT−bT)(Ax−b)=xTATAx−2xTATb+bTb(26)
- step2: 求偏导:
∂ L ∂ u 0 = 2 A T A x − 2 A T b = 0 → A T A x = A T b (25) \frac{\partial{L}}{\partial{u_0}}=2A^TAx-2A^Tb=0\to A^TAx=A^Tb \tag{25} ∂u0∂L=2ATAx−2ATb=0→ATAx=ATb(25) - step3: 如果
A
T
A
A^TA
ATA可逆,那么可得:
∂ L ∂ u 0 = 2 A T A x − 2 A T b = 0 → A T A x = A T b (25) \frac{\partial{L}}{\partial{u_0}}=2A^TAx-2A^Tb=0\to A^TAx=A^Tb \tag{25} ∂u0∂L=2ATAx−2ATb=0→ATAx=ATb(25) - step4: 可得解如下:
x ^ = ( A T A ) − 1 A T b (25) \hat{x}=(A^TA)^{-1}A^Tb \tag{25} x^=(ATA)−1ATb(25)
5.3 关系如图:
5.3 思考
- 思考:
A
v
=
σ
u
Av=\sigma u
Av=σu ,那么可以根据四个子空间得到如下图:
假设我们有一群人, - 最小二乘法求解: 因为v属于行空间,可以理解为主要特征,
A = U Σ V T → A T A = V Σ T Σ V T A=U\Sigma V^T\to A^TA=V\Sigma^T\Sigma V^T A=UΣVT→ATA=VΣTΣVT
1:我们可以按照身高,年龄,性别等主要特征区分,就是按行空间V区分,。每一个v无法组成单独的个体,是每个人的特征===>>> 最小二乘法求解,最小二乘法的目的是为了找到一条直线,这个直线可以近似拟合所有的点,所以最小二乘法是为了找到样本中的点的特征
- PCA 主成分分析: 因为u 属于列空间,就是找几个典型样本代表整体
A = U Σ V T → A A T = U Σ Σ T U T A=U\Sigma V^T\to AA^T=U\Sigma\Sigma^TU^T A=UΣVT→AAT=UΣΣTUT
2:我们可以按每一个样本人来区分就是按照列空间U区分,每一个u都是单独的个体,比如可以按照中国人,日本人区分 ===>>> PCA主成分分析。PCA的目的是为了用小部分的样本来近似替代总体的样本,所以pca主成分分析是为了找到主要的群体,这部分群体占比比较大,可以将这部分人近似的代表总数人。
6. python 代码[有点问题,后续更新]
- 代码:
import numpy as np
np.set_printoptions(suppress=True, precision=3)
from sklearn.decomposition import PCA
class PcaTest(object):
def __init__(self, matrix, k):
self.matrix = matrix
self.k = k
self.standard_matrix = np.zeros_like(self.matrix)
# self.pca_result =
self.xxt_matrix = np.zeros((self.matrix.shape[0], self.matrix.shape[0]))
self.pca_step()
def pca_step(self):
self.get_standard_matrix()
self.get_xxt_matrix()
self.get_xk_matrix()
def get_standard_matrix(self):
matrix_mu = np.mean(self.matrix, axis=0)
# matrix_sigma = np.std(self.matrix, axis=0)
matrix_sigma = np.std(self.matrix, axis=0, ddof=1)
self.standard_matrix = (self.matrix - matrix_mu) / matrix_sigma
print(f"matrix=\n{self.matrix}")
print(f"standard_matrix=\n{self.standard_matrix}")
return self.standard_matrix
def get_xxt_matrix(self):
# self.xxt_matrix = self.standard_matrix @ self.standard_matrix.T /(self.matrix.shape[0]-1)
self.xxt_matrix = np.cov(self.standard_matrix, rowvar=False)
print(f"xxt_matrix=\n{self.xxt_matrix}")
return self.xxt_matrix
def get_xk_matrix(self):
x_k = min(self.k, self.matrix.shape[1])
pca_xxt_matrix = self.get_xxt_matrix()
xxt_evalue, xxt_evector = np.linalg.eig(pca_xxt_matrix)
sorted_index = np.argsort(xxt_evalue)
sorted_evector = xxt_evector[:, sorted_index[:-self.k - 1:-1]]
print(f"xxt_evalue={xxt_evalue}")
print(f"xxt_evector={xxt_evector}")
pca_p = sorted_evector
pca_x = self.standard_matrix
pca_y = pca_x@pca_p
print(f"pca_y=\n{pca_y}")
return xxt_evector
if __name__ == "__main__":
my_matrix = np.arange(20).reshape(4, 5)
k = 3
pca_matrix = PcaTest(my_matrix, k)
sklearn_pca = PCA(n_components=k)
sklearn_pca.fit(my_matrix)
sklearn_y = sklearn_pca.transform(my_matrix)
print(f"sklearn_y=\n{sklearn_y}")
- 结果:
matrix=
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
standard_matrix=
[[-1.162 -1.162 -1.162 -1.162 -1.162]
[-0.387 -0.387 -0.387 -0.387 -0.387]
[ 0.387 0.387 0.387 0.387 0.387]
[ 1.162 1.162 1.162 1.162 1.162]]
xxt_matrix=
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
xxt_matrix=
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
xxt_evalue=[ 5. 0. 0. 0. -0.]
xxt_evector=[[-0.447 -0.444 -0. -0. 0. ]
[-0.447 -0.641 -0.866 0. -0.215]
[-0.447 0.362 0.289 -0. -0.719]
[-0.447 0.362 0.289 -0.707 0.467]
[-0.447 0.362 0.289 0.707 0.467]]
pca_y=
[[ 2.598 0. 0. ]
[ 0.866 0. 0. ]
[-0.866 -0. -0. ]
[-2.598 -0. -0. ]]
sklearn_y=
[[ 16.771 0. 0. ]
[ 5.59 0. 0. ]
[ -5.59 -0. -0. ]
[-16.771 -0. -0. ]]