前言
主成分分析 ( P r i n c i p a l (Principal (Principal C o m p o n e n t Component Component A n a l y s i s , P C A ) Analysis,PCA) Analysis,PCA)是最常用的一种降维算法,它属于无监督学习方法,主要用于发现数据中的基本结构,即数据中变量(特征)之间的关系,是数据分析中超有力的工具。
1. 降维
在开始之前,先说说何为数据的维度(Dimensions)
,在我的理解中是这样的:
对于二维数据,像Excel
表格那样,它的shape
是(m,n)
,也就是m行n列
,一般认为m行
表示的就是m
个样本,n列
表示n
个特征,这个时候维度就是n
,降维就是压缩n
,取个极限就是n
被压缩到1,此时就是二维数据讲到了一位数据。
对于三维数据,像图像那样,除了有高度(height)
和宽度(weight)
这两个维度外,还有通道(channel)
,此时的降维就是空间映射,将三维空间映射到二维空间,说白了就是将数据从三维坐标系中转变到二维坐标系中。
由于三维空间无法表示超过三维的高维空间,可以想象一下,对于更高维的数据,像深度学习中很常见的张量(batch,height,weight,channel)
,以图像为例可以理解为(图像数量,图像的高度,图像的宽度,图像的通道数)
,降维也是如此。
标量 ( s c a l a r ) (scalar) (scalar):一个数,零维数组,其shape为(),一般用小写字母表示 x x x;
向量 ( v e c t o r ) (vector) (vector):一列数,一维数组,其shape为(m,),一般用加粗的小写字母表示 x \bm x x;
矩阵 ( m a t r i x ) (matrix) (matrix):m行n列,二维数组,其shape为(m,n)一般用大写字母表示 X X X;
张量 ( t e n s o r ) (tensor) (tensor):三维及以上数组,其shape为(height,weight,channel)或(batch,height,weight,channel)。
降维 ( D i m e n s i o n (Dimension (Dimension R e d u c t i o n ) Reduction) Reduction),即通过某种数学变换将原始的高维特征空间转变为一个低维的子空间,在这个子空间中样本密度大幅提高,特征数量减少,计算起来更为容易。
2. 奇异值分解SVD
奇异值分解
(
S
i
n
g
u
l
a
r
(Singular
(Singular
V
a
l
u
e
Value
Value
D
e
c
o
m
p
o
s
i
t
i
o
n
,
S
V
D
)
Decomposition,SVD)
Decomposition,SVD)是一种矩阵因子分解方法,除了被应用于推荐系统、自然语言处理等领域外,还被应用于降维算法中进行特征分解。
矩阵的奇异值分解是指,对任意一个非零的
m
×
n
m\times n
m×n实矩阵
A
,
A
∈
R
m
×
n
A,A\in \mathbb {R^{m\times n}}
A,A∈Rm×n,都可以表示为以下三个实矩阵的乘积形式,即进行矩阵的因子分解:
A
=
U
Σ
V
T
A=U\Sigma V^T
A=UΣVT 其中
U
U
U是
m
m
m阶正交矩阵,
V
V
V是
n
n
n阶正交矩阵,
Σ
\Sigma
Σ是
m
×
n
m\times n
m×n对角矩阵,对角线上的元素由降序排列的非负的矩阵
A
A
A的奇异值组成的,
U
Σ
V
T
U\Sigma V^T
UΣVT称为矩阵
A
A
A的奇异值分解,又称为完全奇异值分解。
正交矩阵 ( o r t h o g o n a l (orthogonal (orthogonal m a t r i x ) matrix) matrix),满足 A A T = I , 即 A T = A − 1 AA^T=I,即A^T=A^{-1} AAT=I,即AT=A−1的矩阵(任意一个列向量的内积为1,任意两个列向量的内积为0,即正交矩阵是由两两正交的单位向量组成的,也可以说是由规范正交基组成的)。
对角矩阵 ( d i a g o n a l (diagonal (diagonal m a t r i x ) matrix) matrix),除主对角线之外,其余元素皆为0的矩阵。
奇异值 ( s i n g u l a r (singular (singular v a l u e ) value) value),通俗点说就是特征值的平方根,可见奇异值都是非负的。在线性代数中,特征值与特征向量是这样定义的: A x = λ x A\bm x=\lambda \bm x Ax=λx 其中, x \bm x x为方阵 A A A的特征向量, λ \lambda λ为方阵 A A A的特征值。
而求解奇异值时不要求矩阵 A A A是方阵,因为矩阵 A A A是 m × n m\times n m×n实矩阵,那么矩阵 A T A A^TA ATA则是 n n n阶实对称矩阵,实对称矩阵必然可以对角化,即一定存在一个 n n n阶正交矩阵 V V V,使得 V T ( A T A ) V = Λ V^T(A^TA)V=\Lambda VT(ATA)V=Λ,其中 Λ \Lambda Λ是 n n n阶对角矩阵,其对角线上的元素由实对称矩阵 A T A A^TA ATA的特征值组成。
由此,可以先求出实对称矩阵 A T A A^TA ATA的特征值 λ i \lambda_i λi,然后开根号即可得矩阵 A A A的奇异值,即 σ i = λ i \sigma_i=\sqrt {\lambda_i} σi=λi
2.1 紧奇异值分解
紧奇异值分解 ( c o m p a c t (compact (compact s i n g u l a r singular singular v a l u e value value d e c o m p o s i t i o n ) decomposition) decomposition)是与原始矩阵等秩的奇异值分解。假设有 m × n m\times n m×n实矩阵 A A A,其秩为 r a n k ( A ) = r , r ≤ m i n ( m , n ) rank(A)=r,r\leq min(m,n) rank(A)=r,r≤min(m,n),则称 U r Σ r V r T U_r\Sigma_r V_r^T UrΣrVrT为矩阵 A A A的紧奇异值分解,即 A = U r Σ r V r T A=U_r\Sigma_r V_r^T A=UrΣrVrT 其中 U r U_r Ur是 m × r m\times r m×r矩阵,由完全奇异值分解中 U U U的前 r r r列组成, V r V_r Vr是 n × r n\times r n×r矩阵,由完全奇异值分解中 V V V的前 r r r列组成, Σ r \Sigma_r Σr是 r r r阶对角矩阵,由完全奇异值分解中 Σ \Sigma Σ的前 r r r个对角线元素组成。
2.2 截断奇异值分解
在矩阵的奇异值分解中,如果只取最大的
k
k
k个奇异值
(
k
<
r
)
(k<r)
(k<r)对应的部分,那么得到的就是这个矩阵的截断奇异值分解
(
t
r
u
n
c
a
t
e
d
(truncated
(truncated
s
i
n
g
u
l
a
r
singular
singular
v
a
l
u
e
value
value
d
e
c
o
m
p
o
s
i
t
i
o
n
)
decomposition)
decomposition),实际应用中提到的矩阵奇异值分解时,通常指的就是截断奇异值分解。
假设有
m
×
n
m\times n
m×n实矩阵
A
A
A,其秩为
r
a
n
k
(
A
)
=
r
,
且
0
<
k
<
r
rank(A)=r,且0<k<r
rank(A)=r,且0<k<r,则称
U
k
Σ
k
V
k
T
U_k\Sigma_k V_k^T
UkΣkVkT为矩阵
A
A
A的截断奇异值分解,即
A
≈
U
r
Σ
k
V
k
T
A\approx U_r\Sigma_k V_k^T
A≈UrΣkVkT 其中
U
k
U_k
Uk是
m
×
k
m\times k
m×k矩阵,由完全奇异值分解中
U
U
U的前
k
k
k列组成,
V
k
V_k
Vk是
n
×
k
n\times k
n×k矩阵,由完全奇异值分解中
V
V
V的前
k
k
k列组成,
Σ
k
\Sigma_k
Σk是
k
k
k阶对角矩阵,由完全奇异值分解中
Σ
\Sigma
Σ的前
k
k
k个对角线元素组成。
2.3 几何解释
下面从线性变化的角度来理解一下奇异值分解,
m
×
n
m\times n
m×n矩阵
A
A
A表示从
n
n
n维空间
R
n
\mathbb {R^n}
Rn到
m
m
m维空间
R
m
\mathbb {R^m}
Rm的一个线性变换:
T
:
x
→
A
x
T: \bm x\to A\bm x
T:x→Ax 线性变换可以理解为三个简单的变换:一个坐标系的旋转变换、一个坐标轴的缩放变换、另一个坐标系的旋转变换。
对任意一个向量
x
∈
R
n
\bm x\in \mathbb {R^n}
x∈Rn,经过基于
A
=
U
Σ
V
T
A=U\Sigma V^T
A=UΣVT的线性变换,等价于经过坐标系旋转变换
V
T
V^T
VT,坐标轴的缩放变换
Σ
\Sigma
Σ,以及坐标系的旋转
U
U
U,得到向量
A
x
∈
R
m
A\bm x\in \mathbb {R^m}
Ax∈Rm。
A
x
=
U
Σ
V
T
=
∑
i
=
1
r
u
i
σ
i
v
i
T
A\bm x=U\Sigma V^T=\sum_{i=1}^ru_i\sigma_iv_i^T
Ax=UΣVT=i=1∑ruiσiviT 首先,
V
V
V是正交矩阵,它的列向量
v
1
,
v
2
,
…
,
v
n
v_1,v_2,\dots,v_n
v1,v2,…,vn构成
R
n
\mathbb {R^n}
Rn空间的一组标准正交基,表示
R
n
\mathbb {R^n}
Rn空间中的正交坐标系的旋转,那么
v
i
T
x
v_i^T\bm x
viTx表示将
x
\bm x
x在
v
i
v_i
vi方向上进行投影,相当于对坐标系进行旋转,得到的实数值
v
i
T
x
v_i^T\bm x
viTx表示的就是在旋转后的坐标系上的取值;
然后,再乘以一个
σ
i
\sigma_i
σi对旋转后的坐标系坐标轴进行缩放变换,控制各个方向上的分量大小;
最后,再将缩放
σ
i
\sigma_i
σi倍的坐标系投影到
u
i
u_i
ui规定的方向上,相当于又一次坐标系旋转。
2.4 代码实现
# numpy实现
import numpy as np
A=np.asarray([[1,0,0,0],[0,0,0,4],[0,3,0,0],[0,0,0,0],[2,0,0,0]],dtype=np.int32)
U, S, VT=np.linalg.svd(A)
# sklearn实现
from sklearn.decomposition import TruncatedSVD
# n_components就是我们上面说的k, 取k个奇异值
svd = TruncatedSVD(n_components=2)
svd.fit_transform(A)
# 查看奇异值
svd.singular_values_
有关
TruncatedSVD
的详细参数说明可参考官方手册。
3. 主成分分析PCA
在统计分析中,数据的变量之间可能存在相关性,相当于数据出现了近乎相同的变量,相关性的增加会给分析带来难度。主成分分析是利用正交变换把由线性相关变量表示的观测数据转换为少数几个由线性无关变量表示的数据,线性无关的变量称为主成分。
主成成分分析首先对数据进行规范化,时的数据每一变量的平均值为0,方差为1,也就是进行标准正态化处理,之后对数据进行正交变换,其实就是对原坐标系进行旋转,并将数据在新坐标系中表示,原来由线性相关变量表示的数据,通过正交变换变成有若干个线性无关的新变量表示的数据。新变量是正交变换中变量的方差和最大
的,方差表示的是新变量上信息的大小,想象一下,如果数据的方差为0,那么这些数据有可能都“挤在了一堆”,这样数据又出现了冗余,用一个数据就可以表示这一堆数据。根据新变量方差由大到小依次称为第一主成分、第二主成分等等。
look,上图数据由
x
1
x_1
x1和
x
2
x_2
x2两个变量表示,在这个二维空间中,也就是在这个坐标系中,每个点表示一个样本,这些样本分布在以原点为中心的坐下至右上倾斜的椭圆之内。很明显,这两个边变量是线性相关的,即知道其中一个变量的取值,可以预测出两一个变量的取值。
下面把坐标系旋转一下,如下图所示:
旋转坐标系(也就是正交变换)之后,数据在原坐标系中由
x
1
x_1
x1和
x
2
x_2
x2表示变成了由
y
1
y_1
y1和
y
2
y_2
y2表示,变换之后,变量
y
1
y_1
y1和
y
2
y_2
y2是线性无关的(很明显,它们是正交的)。
假设有两个变量
x
1
x_1
x1和
x
2
x_2
x2,三个样本点
A
,
B
,
C
A,B,C
A,B,C,样本分布在由
x
1
x_1
x1和
x
2
x_2
x2轴组成的坐标系中,对坐标系进行旋转,得到新的坐标轴
y
1
y_1
y1,表示新的变量
y
1
y_1
y1,样本点
A
,
B
,
C
A,B,C
A,B,C
y
1
y_1
y1轴上的投影为
A
′
,
B
′
,
C
′
A^{\prime},B^{\prime},C^{\prime}
A′,B′,C′,如下图所示。由此可以就得样本在变量
y
1
y_1
y1上的方差值和,可以用坐标值的平方表示,即
O
A
′
2
+
O
B
′
2
+
O
C
′
2
OA^{\prime 2}+OB^{\prime 2}+OC^{\prime 2}
OA′2+OB′2+OC′2,在旋转过程中,样本点到原点的距离的平方和是不变的,即
O
A
2
+
O
B
2
+
O
C
2
OA^2+OB^2+OC^2
OA2+OB2+OC2不变,根据勾股定理,
O
A
′
2
+
O
B
′
2
+
O
C
′
2
OA^{\prime 2}+OB^{\prime 2}+OC^{\prime 2}
OA′2+OB′2+OC′2最大化等价于
A
A
′
2
+
B
B
′
2
+
C
C
′
2
AA^{\prime 2}+BB^{\prime 2}+CC^{\prime 2}
AA′2+BB′2+CC′2最小化,即主成分分析在旋转变换中选取的是离样本点的距离平方和最小的轴
作为第一主成分,第二主成分在与第一坐标轴正交的轴中选取。
4. 代码实现
这里使用sklearn.decomposition
里的PCA
进行主成分分析建模来解决分类问题,数据集为sklearn
自带的鸢尾花数据集iris
,数据集详情大致如下:
该数据集有4个特征,3个类别,详情可打印
irisdata.DESCR
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
irisdata = load_iris()
data = irisdata.data
target = irisdata.target
# 数据降维
model = PCA(n_components=2)
data_reduce = model.fit_transform(data)
# 可视化
plt.figure()
plt.scatter(data_reduce[target==0, 0], data_reduce[target==0, 1], c="blue", label=irisdata.target_names[0])
plt.scatter(data_reduce[target==1, 0], data_reduce[target==1, 1], c="green", label=irisdata.target_names[1])
plt.scatter(data_reduce[target==2, 0], data_reduce[target==2, 1], c="orange", label=irisdata.target_names[2])
plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()
我们将鸢尾花数据集的四个特征压缩到了两个,虽然不知道压缩后的两个特征表示的是什么意思,但是这两个特征却能够很好地将三个类别划分了出来。
有关
PCA
的详细参数说明可参考官方手册。
结束语
持续充电中,博客内容也在不断更新补充中,如有错误,欢迎来私戳小编哦!共同进步,感谢Thanks♪(・ω・)ノ