TensorFlow深度学习实战(17)——主成分分析详解
0. 前言
主成分分析 (Principal Component Analysis
, PCA
) 是一种强大的降维工具,通过找到数据的主成分,可以有效地减少数据的复杂性,去除冗余特征,并保留数据的主要信息,在数据预处理、特征提取和可视化等方面都有广泛的应用。
1. 主成分分析
主成分分析 (Principal Component Analysis
, PCA
) 是最流行的用于降维的多变量统计技术。它分析由多个相关变量组成的训练数据,并从中提取出重要信息,这些信息以一组新的正交变量(称为主成分, principal components
)的形式呈现。
我们可以通过两种方法来执行 PCA
,包括特征分解 (eigen decomposition
) 和奇异值分解 (singular value decomposition
, SVD
)。PCA
将
n
n
n 维输入数据降维到
r
r
r 维,其中
r
<
n
r < n
r<n。简单来说,PCA
平移原点并旋转坐标轴,使得其中一个轴(主轴)具有数据点的最大方差。通过这种变换,我们从原始数据集中得到一个降维数据集,然后去除低方差的正交轴。在本节中,我们使用 SVD
方法来进行 PCA
降维。假设
X
X
X 是一个
n
n
n 维数据,包含
p
p
p 个点,即
X
X
X 是一个大小为
p
×
n
p \times n
p×n 的矩阵。根据线性代数,我们知道任何实矩阵都可以通过奇异值分解进行分解:
X
=
U
Σ
V
T
X=U\Sigma V^T
X=UΣVT
其中,
U
U
U 和
V
V
V 分别是大小为
p
×
p
p \times p
p×p 和
n
×
n
n \times n
n×n 的正交矩阵(即,
U
U
T
=
V
V
T
=
E
UU^T = VV^T = E
UUT=VVT=E,
E
E
E 为单位矩阵),
Σ
\Sigma
Σ 是一个
p
×
n
p × n
p×n 的对角矩阵。
U
U
U 矩阵被称为左奇异矩阵,
V
V
V 矩阵是右奇异矩阵,而
Σ
\Sigma
Σ 对角矩阵包含
X
X
X 的奇异值作为其对角元素。这里我们假设
X
X
X 矩阵已中心化。
V
V
V 矩阵的列是主成分,而
U
Σ
U\Sigma
UΣ 矩阵的列是经过主成分转换的数据。
为了将数据的维度从
n
n
n 减少到
k
k
k (其中
k
<
n
k < n
k<n),选择
U
U
U 的前
k
k
k 列和
Σ
\Sigma
Σ 的左上角
k
×
k
k × k
k×k 部分。这两者的乘积为降维后的矩阵:
Y
k
=
U
Σ
k
Y_k=U\Sigma_k
Yk=UΣk
得到的数据
Y
Y
Y 将具有降低特征。接下来,使用 TensorFlow
实现 PCA
。
2. 使用 TensorFlow 实现 PCA
(1) 导入所需库,除了 TensorFlow
外,还需要 NumPy
进行一些基本的矩阵计算,以及 Matplotlib
、Matplotlib
和 Seaborn
进行可视化:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
(2) 接下来,加载 MNIST
数据集。由于使用 PCA
进行降维,不需要测试数据集和标签;这里加载标签是为了在降维后验证 PCA
的性能。PCA
应该将相似的数据点聚集在一个簇中;因此,如果使用 PCA
形成的簇与标签相关,表明 PCA
算法工作正常:
((x_train, y_train), (_, _)) = tf.keras.datasets.mnist.load_data()
(3) 对数据进行预处理。首先对数据进行归一化,使所有数据值介于 0
和 1
之间,然后将图像由尺寸为 28 × 28
的矩阵重塑为 784
维的向量,最后通过减去均值进行中心化:
x_train = x_train / 255.
x_train = x_train.astype(np.float32)
x_train = np.reshape(x_train, (x_train.shape[0], 784))
mean = x_train.mean(axis = 1)
x_train = x_train - mean[:,None]
(4) 利用 TensorFlow
的线性代数 (linalg
) 模块计算训练数据集的奇异值分解 (singular value decomposition
, SVD
)。TensorFlow
使用 tf.linalg
中的 svd()
函数执行 SVD
任务。然后使用 diag
函数将
Σ
\Sigma
Σ 数组(奇异值的列表
s
s
s )转换为对角矩阵:
s, u, v = tf.linalg.svd(x_train)
s = tf.linalg.diag(s)
得到一个大小为 784 × 784
的对角矩阵
s
s
s;一个大小为 60,000 × 784
的左奇异矩阵
u
u
u;以及一个大小为 784 × 784
的右奇异矩阵
v
v
v。由于 svd()
函数的 full_matrices
参数默认设置为 False
,因此,它不会生成完整的
U
U
U 矩阵(完整的
U
U
U 矩阵大小为 60,000 × 60,000
);而是如果输入
X
X
X 的大小为
m
×
n
m × n
m×n,它会生成大小为
p
=
m
i
n
(
m
,
n
)
p = min(m,n)
p=min(m,n) 的
U
U
U 矩阵。
(5) 可以通过将
u
u
u 和
s
s
s 的相应切片相乘来生成降维后的数据。我们可以选择将数据减少到小于 784
的任何维度,在本节中,我们将数据从 784
维减少到 3
维,以便后续更容易可视化。使用 tf.Tensor.getitem
对矩阵执行切片:
k = 3
pca = tf.matmul(u[:,0:k], s[0:k,0:k])
(6) 比较原始数据和降维数据的形状:
print('original data shape',x_train.shape)
print('reduced data shape', pca.shape)
# original data shape (60000, 784)
# reduced data shape (60000, 3)
(7) 最后,在三维空间中绘制数据点:
Set = sns.color_palette("Set2", 10)
color_mapping = {key:value for (key,value) in enumerate(Set)}
colors = list(map(lambda x: color_mapping[x], y_train))
print(type(colors))
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(pca[:, 0].numpy(), pca[:, 1].numpy(), pca[:, 2].numpy(), c=colors)
plt.show()
可以看到,相同颜色(即相同标签)的点聚集在一起。因此,可以认为已经成功地使用 PCA
将 MNIST
图像的维度降低。每个原始图像的大小为 28 × 28
。使用 PCA
方法,我们可以将其减少到更小的尺寸。通常,对于图像数据,降维是必要的,因为图像的大小很大,并且包含大量冗余数据。
3. TensorFlow 嵌入 API
TensorFlow
提供了一个嵌入 API,使用 TensorBoard
查找和可视化 PCA
和 tSNE
聚类,可以查看 MNIST
图像上的实时 PCA
。
可以使用 TensorBoard
来处理数据,TensorBoard
包含了一个称为 Embedding Projector
的工具,允许用户交互式地可视化嵌入。Embedding Projector
工具有三个面板:
- 数据 (
Data
) 面板:可以在此面板中选择数据、标签等 - 投影 (
Projection
) 面板:可以在此面板选择所需的投影类型,提供了4
种选择:UMAP
、PCA
、t-SNE
和自定义 (CUSTOM
) - 检查 (
Inspector
) 面板:可以在此面板搜索特定的点,并查看最近邻的列表
PCA
是一个用于可视化数据集和寻找变量之间线性关系的有用工具,还可以用于聚类、异常检测和特征选择。
小结
主成分分析 (Principal Component Analysis
, PCA
) 是一种常用的数据降维技术,主要用于处理高维数据并减少数据的复杂性,同时尽可能保留原始数据中的信息。它通过线性变换将数据从原始坐标系投影到一个新的坐标系,在新的坐标系中,数据的方差最大,且各主成分之间互相正交。
系列链接
TensorFlow深度学习实战(1)——神经网络与模型训练过程详解
TensorFlow深度学习实战(2)——使用TensorFlow构建神经网络
TensorFlow深度学习实战(3)——深度学习中常用激活函数详解
TensorFlow深度学习实战(4)——正则化技术详解
TensorFlow深度学习实战(5)——神经网络性能优化技术详解
TensorFlow深度学习实战(6)——回归分析详解
TensorFlow深度学习实战(7)——分类任务详解
TensorFlow深度学习实战(8)——卷积神经网络
TensorFlow深度学习实战(9)——构建VGG模型实现图像分类
TensorFlow深度学习实战(10)——迁移学习详解
TensorFlow深度学习实战(11)——风格迁移详解
TensorFlow深度学习实战(12)——词嵌入技术详解
TensorFlow深度学习实战(13)——神经嵌入详解
TensorFlow深度学习实战(14)——循环神经网络详解
TensorFlow深度学习实战(15)——编码器-解码器架构
TensorFlow深度学习实战(16)——注意力机制详解