概述
- 什么是维度
对于数组和Series来说,维度就是shape返回的结果,返回几个数字就是几维。不分行和列的是一维,有行和列之分的是二维,也称为表,一张表最多有二维。有多张表时就是多维的数据。 每张表都可以是一个特征矩阵或者是DataFrame,这些结构永远只有一张表,它们的维度指的是样本数量或特征数量,一般是指特征的数量。几个特征就是几维。 对于图像来说,维度是图像中特征向量的数量。 降维算法中的降维指的是降低特征向量中特征的数量。 - sklearn中的降维算法
主成分分析PCA
算法原理
PCA的主要思想是将n维2数据特征映射到k维上,这k维是全新的正交特征,也被称为主成分,是在原有n维特征的基础上重新构造出来的,与数据筛选不同,构造出来的k维特征是不可解释的,很难明确具体的意义。
以二维数据映射到一维为例:我们希望找到一个映射的轴使方差
V
a
r
(
x
)
=
1
n
?
1
∑
i
=
1
n
(
x
i
?
x
?
)
2
Var(x)=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-x^{-})^2
Var(x)=n?11?∑i=1n?(xi??x?)2最大,就是保证数据拥有更高的可区分度,同时还保留着部分映射之间的空间信息。 步骤: 1.样本归0。就是让所有样本减去样本均值,样本的分布没有改变,只是坐标轴进行了移动。这样对于方差公式就变成了
V
a
r
(
x
)
=
1
n
?
1
∑
i
=
1
n
(
x
i
)
2
Var(x)=\frac{1}{n-1}\sum_{i=1}^{n}(x_i)^2
Var(x)=n?11?∑i=1n?(xi?)2,计算更加方便。 2.找到样本映射后方差最大的单位向量w。定义轴的方向为w=(w1,w2),使得样本映射到w后,方差最大,即
V
a
r
(
X
p
r
o
j
e
c
t
)
=
1
n
?
1
∑
i
=
1
n
(
X
p
r
o
j
e
c
t
i
)
2
Var(X_{project})=\frac{1}{n-1}\sum_{i=1}^n(X^i_{project})^2
Var(Xproject?)=n?11?i=1∑n?(Xprojecti?)2 括号中是一个向量,可以用模代替:
V
a
r
(
X
p
r
o
j
e
c
t
)
=
1
n
?
1
∑
i
=
1
n
∣
∣
X
p
r
o
j
e
c
t
i
∣
∣
2
Var(X_{project})=\frac{1}{n-1}\sum_{i=1}^n||X^i_{project}||^2
Var(Xproject?)=n?11?i=1∑n?∣∣Xprojecti?∣∣2
映射时,就是从原点向轴做垂线,交点即是映射点
X
i
.
w
=
∣
∣
X
i
∣
∣
?
∣
∣
w
∣
∣
?
c
o
s
θ
X^i.w=||X^i||*||w||*cosθ
Xi.w=∣∣Xi∣∣?∣∣w∣∣?cosθ
X
i
.
w
=
∣
∣
X
i
∣
∣
c
o
s
θ
X^i.w=||X^i||cosθ
Xi.w=∣∣Xi∣∣cosθ
X
i
.
w
=
∣
∣
X
p
r
o
j
e
c
t
i
∣
∣
X^i.w=||X^i_{project}||
Xi.w=∣∣Xprojecti?∣∣ 最终是求w使得
V
a
r
(
X
p
r
o
j
e
c
t
)
=
1
n
?
1
∑
(
X
i
.
w
)
2
Var(X_{project})=\frac{1}{n-1}\sum(X^i.w)^2
Var(Xproject?)=n?11?∑(Xi.w)2最大。
sklearn中的PCA
- 重要参数n_components
n_components是降维后需要的维度,即降维后保留的特征数量。一般输入[0,min(X.shapw)]中的整数。 PCA的操作也是实例化、fit、transform等。。。
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca = pca.fit(X)
X_dr = pca.transform(X)
pca.explained_variance_
pca.explained_variance_ratio_
n_components的选择可以画出累计可解释方差贡献率曲线,来选择最好的n_components的整数取值。
- 极大似然估计自选超参数
除了输入整数,n_components可以用极大似然估计mle来自选超参数,操作如下:
pca_mle = PCA(n_components='mle')
pca_mle = pca_mle.fit(X)
- 按信息量占比选择超参数
输入[0,1]之间的浮点数,并且让参数svd_solver=‘full’,来表示希望降维后的总解释方差占比大于n_components指定得百分比,这里的百分比是降维后特征信息量百分比的累计。
pca_f = PCA(n_components=0.97,svd_solver='full')
PCA中的SVD应用
在PCA计算过程中需要计算协方差矩阵,计算量较大,而SVD的运用可以不计算协方差矩阵直接求出新特征空间和降维后的特征矩阵。 (图片来自菜菜的sklearn教程,仅为学习记录) fit的奇异值分解的结果V(k,n)保存在属性components_中,可以调用查看。
- componsents_中保存的V(k,n)的作用
通常,V(k,n)中的数据很难解释具体的意义,但对于图像而言,生成的V(k,n)仍然是图像信息,且从V(k,n)中可以发现降维时选择的信息是什么。以人脸识别的数据集为例进行观察:
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
faces = fetch_lfw_people(min_faces_per_person=60)
faces.data.shape
faces.images.shape
X = faces.data
fig, axes = plt.subplots(3,8,figsize=(8,4),subplot_kw={'xticks':[],'yticks':[]})
for i, ax in enumerate(axes.flat):
ax.imshow(faces.images[i,:,:],cmap='gray')
pca = PCA(150).fit(X)
V = pca.components_
fig, axes = plt.subplots(3,8,figsize=(8,4),subplot_kw={'xticks':[],'yticks':[]})
for i, ex in enumerate(axes.flat):
ex.imshow(V[i,:].reshape(62,47),cmap='gray')
- inverse_transform(X_dr)返回原来的特征矩阵
这个操作可以返回原来大小的特征矩阵,但并不是原来的特征矩阵。因为在降维时是选择最相关的特征进行降维,而把相关性不高的特征去除了,返回原来大小特征矩阵时也不可能包含那些被去除的信息。由这个特性,可以用来降噪。具体可以在PCA学习曲线中选择转折处的特征数来进行降维,然后再返回原来大小的特征矩阵,就可以实现数据的降噪。
|