基于t-SNE的Digits数据集降维与可视化

基于t-SNE的Digits数据集降维与可视化

描述

t-SNE(t-分布随机邻域嵌入)是一种基于流形学习的非线性降维算法,非常适用于将高维数据降维到2维或者3维,进行可视化观察。t-SNE被认为是效果最好的数据降维算法之一,缺点是计算复杂度高、占用内存大、降维速度比较慢。

本任务的实践内容包括:

1、 基于t-SNE算法实现Digits手写数字数据集的降维与可视化

2、 对比PCA/LCA与t-SNE降维前后手写数字识别模型的性能

源码下载

环境

  • 操作系统:Windows 10、Ubuntu18.04

  • 工具软件:Anaconda3 2019、Python3.7

  • 硬件环境:无特殊要求

  • 依赖库列表

    matplotlib   	3.3.4
    scikit-learn	0.24.2
    

分析

Digits手写数字数据集包括1797张手写数字图片,每张图片代表0~9之间的1个数字,图片大小为8*8,即特征维度为64。任务中我们分别使用PCA、LDA和t-SNE三种算法将数据集降为2维,并可视化观察其数据分布情况,之后通过K-最近邻算法(K-NN)对三种算法降维后的数据集进行分类,对比其准确性。

本任务涉及以下几个环节:

a)加载Digits数据集

b)分别使用PCA、LDA、t-SNE算法进行降维(由64维降2维)

c)使用K-NN分类器分别在三种算法降维后的数据上建模

d)对比评估模型的准确性

实施

1、加载Digits数据集

import matplotlib.pyplot as plt
from time import time
from sklearn.datasets import load_digits
from sklearn.manifold import TSNE
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis 

# 加载Digits数据集
digits = load_digits()
data = digits.data
target = digits.target
print(data.shape) # 查看数据维度(64)

# 可视化降维后的数据
def show_pic(new_data, target, label):
    plt.title(label)
    plt.scatter(new_data[:, 0], new_data[:, 1], c=target)
    plt.show()

结果如下:

(1797, 64)

Digits数据集包括1797张图片样本,特征维度为64(图片大小8×8)。

2、使用不同算法将数据降为2维,并可视化

首先,分别使用PCA、LDA、t-SNE三种算法将Digits数据集由64维降为2维,然后调用上面自定义的show_pic方法将降维后的数据可视化。

# 使用不同的算法将数据降为2维
# 1、PCA降维可视化
pca = PCA(n_components=2).fit(data)
pca_data = pca.transform(data) # 降维转换
show_pic(pca_data, target, 'PCA')

# 2、LDA降维可视化
lda = LinearDiscriminantAnalysis(n_components=2).fit(data, target)
lda_data = lda.transform(data) # 降维转换
show_pic(lda_data, target, 'LDA')

# 3、TSNE降维可视化(计算复杂度高,较慢)
print('  t-SNE降维中,请耐心等待......')
start = time() # 开始时间
tsne = TSNE(n_components=2, init='pca', random_state=0)
tsne_data = tsne.fit_transform(data)
end = time() # 完成时间
show_pic(tsne_data, target, 't-SNE (cost {:.1f} seconds)'.format(end-start))

输出结果:

请添加图片描述

请添加图片描述
请添加图片描述

可以看到,将数据由64维降成2维后,PCA的数据已经混在一起,LDA数据可分性稍好一些,t-SNE的数据可分性最高,数据集中10种手写数字的样本彼此独立。t-SNE的降维效果十分出色,但算法的时间复杂度高。

3、评估三种算法降维后的分类准确性

接下来,使用K-NN分类器分别在上面三种算法降维后的数据上建立分类模型,并对比评估模型的准确性。

from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

# 评估三种算法降维后(均降成2维)的分类准确性(基于KNN算法)
def eval_model(new_data, target, label):
    X_train, X_test, y_train, y_test = train_test_split(new_data, target, random_state=0) # 拆分数据集
    model = KNeighborsClassifier(3).fit(X_train, y_train)
    score = model.score(X_test, y_test) # 在测试集上评估模型成绩
    print(label, score) # 打印模型成绩
    
print('Digits数据集由64维降成2维后,使用K-NN分类准确性对比:')

eval_model(pca_data, target, 'PCA accuracy:')
eval_model(lda_data, target, 'PDA accuracy:')
eval_model(tsne_data, target, 't-SNE accuracy:')

结果如下:

Digits数据集由64维降成2维后,使用K-NN分类准确性对比:
PCA accuracy: 0.5888888888888889
PDA accuracy: 0.6422222222222222
t-SNE accuracy: 0.9955555555555555

可以看到,在三种降维算法中,t-SNE降维后的数据分类准确性最高,该算法是目前效果最好的降维算法之一,Digits数据集即便被降成2维,依然保持了良好的可分性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/11817.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运行时内存数据区之程序计数器

内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时选行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。 不同的VM对于内存的划分方式和管理机制存在着部分差…

英特尔CEO基辛格:开创可持续计算新时代

近日,帕特基辛格作为英特尔CEO后,第一次来华访问。在2023英特尔可持续发展高峰论坛上,笔者有幸聆听他的演讲。他严谨又不乏幽默地给我们分享了英特尔如何践行可持续发展的思考和举措。 基辛格表示,身处科技行业,我们不…

DeepFM论文翻译

1.摘要 为了最大化推荐系统的CTR,学习用户行为的复杂交叉特征很关键。 尽管有很大进步,现有的方法无论对低阶还是高阶的交叉特征,似乎还是有很强的bias, 或者需要专门的特征工程。 本文,我们证明了得出一个能强化高阶和低阶交叉特…

钢网是SMT生产使用的一种工具,如何制作?

钢网是SMT生产使用的一种工具,其主要功能是将锡膏准确地涂敷在有需要焊接的PCB焊盘上。 钢网的好坏,直接影响印刷工作的质量,目前一般使用的金属钢网,是由薄薄的、带有小孔的金属板制作成的,在开孔处,锡膏…

记录网关zuul处理跨域/XSS问题

一,疑问 1.之前遇到跨域问题是在NG中解决的,添加跨域请求头和域名配置。那么与网关处理跨域问题关系是什么,NG处理了,为什么还需要在网关中处理 二,前置知识 zuul概念与原理 zuul 的概念和原理 - 知乎 Zuul工作原…

全球首个完全开源的指令跟随大模型;T5到GPT-4最全盘点

1. Dolly 2.0:世界上第一个完全开源的指令跟随LLM 两周前,Databricks发布了类ChatGPT的大型语言模型 (LLM)Dolly,其训练成本不到 30 美元。今天,他们发布了 Dolly 2.0,这是业内第一个开源的指令跟随LLM,并根…

gdb 跟踪调式core

自己编译的问题出现段错误: 编译:使用gdb调试core文件来查找程序中出现段错误的位置时,要注意的是可执行程序在编译的时候需要加上-g编译命令选项。 gdb调试core文件的步骤 gdb调试core文件的步骤常见的有如下几种,推荐第一种。 具体步骤一: (1)启动gdb,进入core文…

Midjourney详细注册和使用教程

来源:Midjoureny详细注册使用教程【探索ChatGPT】 Midjourney,用户只需要输入一段图片的文字描述,即可生成精美的绘画,相信了解Midjourey的小伙伴已经对它强大之处而赞叹! 下面是用通俗易懂的步骤教会大家如何注册和…

企业网站架构部署与优化

系列文章目录 文章目录系列文章目录一、LAMP概述与简介1.LAMP2.各组件的主要作用如下:二、1.编译安装Apache http服务2.编译安装 Mysql 服务3.编译安装 PHP 解析环境总结一、LAMP概述与简介 1.LAMP LAMP架构是目前成熟的企业网站应用模式之一,指的是协…

Linux内核之网络协议栈以及套接字sk_buff分析

网络协议栈以及套接字sk_buff分析一、Linux 内核网络协议栈构架二、网络协议栈常见的数据结构2.1、TCP/IP 参考模型及 ISO/OSI 参考模型2.2、套接字 sk_buff 分析2.3、套接字缓冲区管理数据2.4、Linux 内核提供套接字缓冲区标准 API 函数2.5、使用一个表头来实现套接字缓冲区的…

Scala - 时间工具类 LocalDateTime 常用方法整理

目录 一.引言 二.LocalDateTime 获取与格式化 1.获取当前时间 LocalDateTime 2.根据时间戳获取 LocalDateTime 3.指定时间获取 LocalDataTime 4.LocalDataTime 格式化 三.LocalDateTime 读取时间细节 1.获取年-Year 2.获取月-Month 3.获取日-Day 4.获取时-Hour 5.获…

一文读懂域名注册

本文深入浅出讲解域名的注册、建站和管理,通过文章可以了解以下问题: 域名注册及建站流程;域名注册的技术原理;域名管理(修改 DNS 服务器、转入转出、自定义 DNSHost、whois 信息)。 众所周知,…

轨迹相似度整理

1 基于点之间的距离 1.1 欧几里得距离 优点:线性计算时间缺点:轨迹长度必须一样 1.2 DTW DTW 笔记: Dynamic Time Warping 动态时间规整 (&DTW的python实现) 【DDTW,WDTW】_UQI-LIUWJ的博客-CSDN博客 …

限流算法(计数器、滑动时间窗口、漏斗、令牌)原理以及代码实现

文章目录前言1、计数器(固定时间窗口)算法原理代码实现存在的问题2、滑动时间窗口算法原理代码实现存在的问题3、漏桶算法原理代码实现存在的问题4、令牌桶算法原理代码实现最后本文会对这4个限流算法进行详细说明,并输出实现限流算法的代码示…

【Redis笔记03】Redis运行环境之Cluster集群模式

这篇文章,主要介绍Redis运行环境之Cluster集群模式。 目录 一、Cluster集群模式 1.1、集群模式原理 (1)普通集群 (2)什么是分片??? (3)如何分片存储&…

【操作系统复习】第4章 进程同步

进程同步的概念 主要任务 ➢ 使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。 进程间的制约关系 ➢ 间接相互制约关系(互斥关系) • 进程互斥使用临界资源 ➢ 直接相互制约关系(同步关系) •…

在线绘制思维导图

思维导图是一种可视化的思维工具,它可以将放射性思考具体化为可视的图像和图表。 思维导图利用图文并重的技巧,把各级主题的关系用相互隶属与相关的层级图表现出来,把主题关键词与图像、颜色等建立记忆链接。 它运用图像和颜色等多种元素&…

真题详解(Flynn分类)-软件设计(四十六)

真题详解(计算机总线)-软件设计(四十五)https://blog.csdn.net/ke1ying/article/details/130046829 Flynn分类将计算机分为四类。 单指令流单数据流机器(SISD):早期的机器,在某个时钟周期&…

某程序员哀叹:月薪四五万,却每天极度焦虑痛苦,已有生理性不适,又不敢裸辞,怎么办?...

高薪能买来快乐吗?来看看这位程序员的哀叹:实在是扛不住了,每天都在极度焦虑和痛苦中度过,早上起来要挣扎着做心理建设去上班,已经产生生理性的头晕恶心食欲不振。有工作本身的原因,更多是自己心态的问题&a…

商务接待广州考斯特商务租车详解!

进入四月份以来,全国各个地区都有很多商务活动举办,广州也不例外,广州很多地区都有商务活动的需求。因此不少主办方都需要商务租车来接待客户,而丰田考斯特是市面上常见的一款高端中巴车,主要是因为考斯特的可靠性、安…