UCI手写数字的数据降维

2024-04-24 02:20
文章标签 数据 降维 手写 数字 uci

本文主要是介绍UCI手写数字的数据降维,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


目录

  • 1. 引言
  • 2. 降维算法
  • 3. 数据降维
  • 4. 降维结果
    • 4.1 数字3的降维结果
    • 4.2 数字0-9的降维结果
  • 5. 源码地址


1. 引言

降维是一种常用的数据分析技术,它能够将高维数据转换为低维表示,以便更好地可视化和理解数据。这里我们使用了三种降维方法:主成分分析(PCA)、t-SNE和UMAP,对手写数字图像进行了降维分析。通过比较不同方法的结果,我们评估了它们在保留图像特征的同时减少数据维度方面的效果。

2. 降维算法

  • PCA:PCA是一种线性降维技术,通过寻找数据中最大方差的方向来进行降维。它通过计算数据的协方差矩阵的特征向量来确定主成分,并将数据投影到这些主成分上。PCA能够保留数据中的主要变化信息,并将其表示为一组新的低维特征。
  • t-SNE:t-SNE是一种非线性降维方法,它能够在保留样本之间的局部关系的同时,将高维数据映射到低维空间。t-SNE通过计算样本之间的相似度来构建一个高维空间和低维空间之间的映射,使得相似的样本在低维空间中距离更近。
  • UMAP:UMAP是一种新兴的非线性降维方法,它结合了t-SNE的优点,并通过近邻关系来更好地保留全局结构。UMAP使用了一种基于图的方法,通过构建样本之间的局部连接关系和全局拓扑结构,将高维数据映射到低维空间。

3. 数据降维

我们选择了一个手写数字图像数据集(UCI Optical Recognition of Handwritten Digits Data Set)作为实验数据集,其中包含大量的手写数字图像样本。每个样本都表示为一个高维特征向量。我们的目标是将这些样本映射到二维空间,并比较不同降维方法的效果。

或者使用sklearn的内置函数加载数据集:

from sklearn import datasetsdigits = datasets.load_digits()

步骤如下:

  • 从手写数字图像数据集中选择数字为3(或者全部样本)的样本。
  • 使用PCA、t-SNE和UMAP三种方法对选定的样本进行降维。
  • 将降维后的数据可视化,并根据手写数字的标签进行着色。如果只针对数字3进行降维,则在降维空间中均匀采样25个点并可视化采样点对应的数字3的图像。
  • 比较不同方法的降维结果,评估它们在保留图像特征和可视化效果方面的差异。

4. 降维结果

4.1 数字3的降维结果

图1呈现数字3的降维结果:

  • PCA:通过应用PCA降维,我们观察到手写数字3在二维空间中呈现出一定的聚类结构。相似的结构往往在降维后的空间中更接近,例如a图中靠降维空间左边区域的3的上半部分会向左倾斜,而越往空间右边的3则呈现向右倾斜的趋势。这说明PCA在保留手写数字图像的整体结构方面具有一定效果。然而,PCA是一种线性降维方法,可能无法捕捉到数据中的非线性关系。
  • t-SNE:对于t-SNE降维,可以看到3在二维空间中形成了更明显的聚类结构。b图的上半部分空间代表向右倾斜,而下半部分则向左倾斜,同时二者聚类层次比PCA更加明显。这是由于t-SNE能够更好地捕捉到手写数字图像的局部结构和相似性,但可能存在一些过拟合的风险。
  • UMAP:UMAP综合了t-SNE的优点,能够更好地保持全局结构,并且能够更好地处理数据中的噪声和异常点。相对于t-SNE,UMAP可能在保留整体数据结构方面更具优势。在c图中左侧部分区域为向左倾斜的聚类,右侧为向右倾斜,层次比PCA明显,但仅在数字3上无法体现UMAP和t-SNE之间的降维效果差异。

请添加图片描述

Fig. 1. 数字3的降维结果. a, PCA. b, t-SNE. c, UMAP. 左列为降维散点图, 右列为采样点的图像.

4.2 数字0-9的降维结果

由于仅在数字3上进行降维实验无法观测到不同降维方法之间的显著差异,所以对全部数据0-9进行了降维可视化(图2),进一步突出非线性降维方法在整体数据结构上的优越性。

可以看到与上一节的分析基本一致:PCA作为一种线性降维方法,无法捕捉到数据中的非线性关系,所以在0-9的10类数字的聚类层面没有突出效果,更类似均匀分布。而t-SNE可以捕捉不同数字之间的局部结构差异和相似性,较为清晰地划分出10个类别,同时具有相似笔画结构的数字在降维空间中分布更加靠近,例如1和8(都存在类似从上到下的竖线笔画),还有2、3、5、8和9(都存在从上往下的弧线笔画)等。最后UMAP相较t-SNE的优势在全数字降维上得以体现,不同数字之间的距离进一步扩大,具有相似结构的数字集群之间的距离较小,但和结构差异大的集群之间距离极大,这进一步体现了手写数字的整体数据结构;同时异常点比t-SNE更少,说明UMAP降维效果更加鲁棒。

请添加图片描述

Fig. 2. 数字0-9的降维结果. a, 数字0-9. b, PCA. c, t-SNE. d, UMAP.
from sklearn.manifold import TSNE
from sklearn.decomposition import PCA
from umap.umap_ import UMAPmethod = ['pca', 'tsne', 'umap']
m = method[1]# 获取数字为3的图片索引
digit_3_indices = np.where(digits.target == 3)[0]# 提取数字为3的图片数据
digit_3_images = digits.data[digit_3_indices]if m == 'pca':# 对数字为3的图片进行PCA降维pca = PCA(n_components=2)result = pca.fit_transform(digit_3_images)# 寻找二维平面上分布呈5x5矩阵样子的25个点min_x, max_x = -15, 20min_y, max_y = -15, 20elif m == 'tsne':# 使用 t-SNE 进行降维和可视化tsne = TSNE(n_components=2, random_state=42)result = tsne.fit_transform(digit_3_images)min_x, max_x = -5, 5min_y, max_y = -10, 10else:# 使用 UMAP 进行降维和可视化result = UMAP(n_neighbors=20, n_components=2, random_state=42).fit_transform(digit_3_images)min_x, max_x = -1, 5min_y, max_y = 13, 15x_coords = np.linspace(min_x, max_x, num=5)
y_coords = np.linspace(min_y, max_y, num=5)selected_indices = []
for y in y_coords:for x in x_coords:dist = np.linalg.norm(result - np.array([x, y]), axis=1)closest_idx = np.argmin(dist)selected_indices.append(closest_idx)selected_indices = np.array(selected_indices)# 绘制左子图,所有3可视化为绿色点
fig1 = plt.figure(figsize=(8, 8))
plt.scatter(result[:, 0], result[:, 1], c='green')
plt.scatter(result[selected_indices, 0], result[selected_indices, 1], color='red', marker='o', facecolors='none', linewidth=3, s=200)
plt.xlabel('First component', fontsize=25)
plt.ylabel('Second component', fontsize=25)
plt.savefig(f'./hw2/{m}.png')# 绘制右子图,挑选出来的25个点对应的3的图片按照空间位置绘制成5*5的图片矩阵
fig2 = plt.figure(figsize=(8, 8))
for i, idx in enumerate(selected_indices):ax = plt.subplot(5, 5, i+1)ax.imshow(digits.images[digit_3_indices[idx]], cmap=plt.cm.gray_r, interpolation='nearest')# 设置边框的样式和宽度for spine in ax.spines.values():spine.set_linewidth(3)spine.set_color('red')# 调整子图布局
plt.tight_layout()plt.savefig(f'./hw2/{m}_selected_images.png')# 显示图形
plt.show()

5. 源码地址

如果对您有用的话可以点点star哦~

https://github.com/Jurio0304/cs-math/blob/main/hw2_pca.ipynb


创作不易,麻烦点点赞和关注咯!

这篇关于UCI手写数字的数据降维的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/930514

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元