当前位置: 首页 > news >正文

TensorFlow深度学习实战(17)——主成分分析详解

TensorFlow深度学习实战(17)——主成分分析详解

    • 0. 前言
    • 1. 主成分分析
    • 2. 使用 TensorFlow 实现 PCA
    • 3. TensorFlow 嵌入 API
    • 小结
    • 系列链接

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 进行一些基本的矩阵计算,以及 MatplotlibMatplotlibSeaborn 进行可视化:

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) 对数据进行预处理。首先对数据进行归一化,使所有数据值介于 01 之间,然后将图像由尺寸为 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

可以看到,相同颜色(即相同标签)的点聚集在一起。因此,可以认为已经成功地使用 PCAMNIST 图像的维度降低。每个原始图像的大小为 28 × 28。使用 PCA 方法,我们可以将其减少到更小的尺寸。通常,对于图像数据,降维是必要的,因为图像的大小很大,并且包含大量冗余数据。

3. TensorFlow 嵌入 API

TensorFlow 提供了一个嵌入 API,使用 TensorBoard 查找和可视化 PCAtSNE 聚类,可以查看 MNIST 图像上的实时 PCA

MNIST PCA

可以使用 TensorBoard 来处理数据,TensorBoard 包含了一个称为 Embedding Projector 的工具,允许用户交互式地可视化嵌入。Embedding Projector 工具有三个面板:

  • 数据 (Data) 面板:可以在此面板中选择数据、标签等
  • 投影 (Projection) 面板:可以在此面板选择所需的投影类型,提供了 4 种选择:UMAPPCAt-SNE 和自定义 (CUSTOM)
  • 检查 (Inspector) 面板:可以在此面板搜索特定的点,并查看最近邻的列表

Embedding Projector

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)——注意力机制详解

相关文章:

  • Python爬虫实战:研究Grab 框架相关技术
  • Linux系统编程 | IPC对象---消息队列
  • 同步/异步电路;同步/异步复位
  • 二叉树结构与遍历
  • 2025有铜半孔工艺参数设计规范
  • rt-linux下的底层锁依赖因cgroup cpu功能导致不相干进程的高时延问题
  • 引领“零碳会议”新风尚!第十届国际贸易发展论坛——绿色发展专场,在京举办
  • Linux探秘:驾驭开源,解锁高性能——基础指令(续集)
  • 【RocketMQ 生产者和消费者】- 生产者启动源码-创建 MQClientInstance(2)
  • 硬件,软件和进程
  • 【Linux】进程间通信(四):System V标准(共享内存、消息队列、信息量)
  • 通过Python 在Excel工作表中轻松插入行、列
  • Mysql 刷题Day09
  • nvm版本管理下pnpm 安装失败问题解决
  • 智能赋能与人文滋养:人工智能时代高中数字化教育的范式重构
  • 【视频】使用海康SDK保存的MP4无法在浏览器(html5)中播放
  • 解决前端路由切换导致Keycloak触发页面刷新问题
  • landsat卫星遥感影像下载、处理教程
  • 数据结构 -- B树和B+树
  • 学习vue3:跨组件通信(provide+inject)
  • 外包公司做网站有哪些内容/深圳网络推广代运营
  • 济南做网站多少钱/企业管理软件
  • 简阳建设网站公司/网页优化seo公司
  • 衡水注册公司流程和费用/独立站seo
  • 长期供应小企业网站建设/百度关键词搜索量排名
  • 张家界有没有做网站的公司/湖北网站seo