t-SNE(t-stochastic neighourhood embedding) 数据降维及可视化

news2024/10/7 20:33:38

文章目录

    • 算法原理
    • 示例一
    • 示例二

算法原理

t-SNE 的基本思想是将高维数据映射到低维空间,同时保留数据间的局部结构。具体而言,给定一个高维数据集 X = { x 1 , … , x n } \mathbf{X}=\{\mathbf{x}_1,\dots,\mathbf{x}_n\} X={x1,,xn},其中 x i ∈ R D \mathbf{x}_i\in\mathbb{R}^D xiRD,要将其映射到一个 d d d 维的空间 Y = { y 1 , … , y n } \mathbf{Y}=\{\mathbf{y}_1,\dots,\mathbf{y}_n\} Y={y1,,yn},其中 y i ∈ R d \mathbf{y}_i\in\mathbb{R}^d yiRd,且 d ≪ D d\ll D dD

与其他降维算法不同的是,t-SNE 旨在保持数据点之间的局部相似性,即将高维空间中距离接近的点映射到低维空间中距离仍然较近的位置。为了实现这个目标,t-SNE 建立了一个概率模型,用于将数据点从高维空间映射到低维空间。具体地,它假设在高维空间中距离接近的点在低维空间中也有更大的概率被选择为临近点。

在 t-SNE 中,每个高维数据点 x i \mathbf{x}_i xi 对应一个在低维空间中的概率分布 q i q_{i} qi,用于描述 x i \mathbf{x}_i xi 在低维空间中的位置。与此同时,为了保留其局部结构,还需要为每个 x i \mathbf{x}_i xi 建立一个概率分布 p i p_{i} pi,用于描述 x i \mathbf{x}_i xi 与其它数据点之间的相似性。在 t-SNE 中,用采用的是高斯分布,即

p i , j = p ( x i ∣ x j ) ∑ k ≠ i p ( x i ∣ x k ) , p_{i,j} = \frac{p(\mathbf{x}_i|\mathbf{x}_j)}{\sum_{k\neq i}p(\mathbf{x}_i|\mathbf{x}_k)}, pi,j=k=ip(xixk)p(xixj),

其中 p ( x i ∣ x j ) p(\mathbf{x}_i|\mathbf{x}_j) p(xixj) 表示在高维空间中, x i \mathbf{x}_i xi 在以 x j \mathbf{x}_j xj 为中心的局部高斯分布中出现的概率密度。它的定义为:

p ( x i ∣ x j ) = exp ⁡ ( − ∥ x i − x j ∥ 2 / ( 2 σ j 2 ) ) ∑ k ≠ j exp ⁡ ( − ∥ x i − x k ∥ 2 / ( 2 σ j 2 ) ) p(\mathbf{x}_i|\mathbf{x}_j) = \frac{\exp(-\|\mathbf{x}_i-\mathbf{x}_j\|^2/(2\sigma_j^2))}{\sum_{k\neq j}\exp(-\|\mathbf{x}_i-\mathbf{x}_k\|^2/(2\sigma_j^2))} p(xixj)=k=jexp(xixk2/(2σj2))exp(xixj2/(2σj2))

其中 σ j \sigma_j σj 是一个尺度参数,用于控制局部邻域的大小。

同样地,我们也需要定义一个低维空间中的概率分布 q i , j q_{i,j} qi,j。在 t-SNE 中,这个概率分布是由一个类似于 softmax 的归一化因子给出的,形式为:

q i , j = ( 1 + ∥ y i − y j ∥ 2 ) − 1 ∑ k ≠ l ( 1 + ∥ y k − y l ∥ 2 ) − 1 q_{i,j}=\frac{(1+\|\mathbf{y}_i-\mathbf{y}_j\|^2)^{-1}}{\sum_{k\neq l}(1+\|\mathbf{y}_k-\mathbf{y}_l\|^2)^{-1}} qi,j=k=l(1+ykyl2)1(1+yiyj2)1

其中 ( 1 + ∥ y i − y j ∥ 2 ) − 1 (1+\|\mathbf{y}_i-\mathbf{y}_j\|^2)^{-1} (1+yiyj2)1 可以解释成一个 t-分布。

t-SNE 的目标函数定义为两个概率分布之间的 KL 散度,即

KL ⁡ ( P ∣ ∣ Q ) = ∑ i ∑ j p i , j log ⁡ p i , j q i , j \operatorname{KL}(P||Q)=\sum_i\sum_j p_{i,j}\log\frac{p_{i,j}}{q_{i,j}} KL(P∣∣Q)=ijpi,jlogqi,jpi,j

为了最小化 KL 散度,可以采用梯度下降法来求解。因为 KL 散度没有解析解,所以梯度需要通过自动微分或其他数值方法进行计算。

t-SNE 的基本思想是在高维数据空间和低维嵌入空间中分别构建高斯分布和 t-分布,在两个空间中寻找相同的邻居,并最小化两个概率分布之间的差异。

示例一

生成一批符合高斯分布的高维样本,把它们降到二维来可视化。这些高斯分布的样本符合以下三个特征:

  1. 所有的数据点分别属于三个类别,
  2. 每一个样本点是三维的,
  3. 第一类样本均值为(0,0,0), 第二类均值为(1,1,0),第三类均值为(-1,1,1)
from sklearn.datasets import make_blobs
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import numpy as np

# 生成三个高斯分布,每个高斯分布包含100个样本点
X, y = make_blobs(n_samples=300, centers=[[0, 0, 0], [1, 1, 0], [-1, 1, 1]], cluster_std=0.2)

# 初始化 t-SNE 模型,设置降维后的维度为 2 维
tsne = TSNE(n_components=2)

# 对数据进行降维
X_tsne = tsne.fit_transform(X)

# 将三个类别的数据点分别提取出来
class_1 = X_tsne[y == 0]
class_2 = X_tsne[y == 1]
class_3 = X_tsne[y == 2]

# 可视化结果
plt.scatter(class_1[:, 0], class_1[:, 1], label='class 1')
plt.scatter(class_2[:, 0], class_2[:, 1], label='class 2')
plt.scatter(class_3[:, 0], class_3[:, 1], label='class 3')
plt.legend()
plt.show()

在这里插入图片描述

示例二

把MINIST直接展开可视化

from sklearn.manifold import TSNE
from sklearn.datasets import fetch_openml
import matplotlib.pyplot as plt

# 获取 MNIST 数据集
mnist = fetch_openml('mnist_784')

# 取前1000张图片和对应的标签作为数据进行处理
X = mnist.data[:1000]
y = mnist.target[:1000]

# 初始化 t-SNE 模型,设置降维后的维度为 2 维
tsne = TSNE(n_components=2)

# 对数据进行降维
X_tsne = tsne.fit_transform(X)

# 绘制结果
plt.figure(figsize=(10, 10))
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y.astype(int), cmap='jet')
plt.colorbar()
plt.show()

参考资料:

[1] van der Maaten, L.J.P., Postma, E.O. and van den Herik, H.J., 2009. Dimensionality reduction: A comparative review. Journal of Machine Learning Research, 10, pp.66-71.

[2] Maaten, L.v.d. and Hinton, G., 2008. Visualizing data using t-SNE. Journal of machine learning research, 9(Nov), pp.2579-2605.
[3]https://distill.pub/2016/misread-tsne
[4]https://scikit-learn.org/stable/auto_examples/manifold/plot_t_sne_perplexity.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macm1环境下IDEA项目切换jdk版本

macm1环境下IDEA项目切换jdk版本 本文目录 macm1环境下IDEA项目切换jdk版本背景需求下载对应版本jdk配置IDEA中指定项目的JDK版本配置 Project Structure配置 Settings 可能报错同时安装JDK8和JDK17并切换 背景需求 项目基于 springboot3.0.7Nacos2.2.3seata1.6.1 由spring官…

TensorFlow2安装备忘

系统配置 Ubuntu18.04 Anaconda4.9.2 Cuda10.0Cudnn7.6.5 CPU版本 执行pip install tensorflow默认安装的是CPU版本,并且安装后会有较多import依赖问题,部分记录如下,基本都属于"No module named xxxx"。 1.找不到wrapt 通过…

【23】SCI易中期刊推荐——神经网络科学及机器人学(中科院3区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

面试官:useEffect和useLayoutEffect有什么区别?

您好&#xff0c;如果喜欢我的文章&#xff0c;可以关注我的公众号「量子前端」&#xff0c;将不定期关注推送前端好文~ Effect数据结构 顾名思义&#xff0c;React底层在函数式组件的Fiber节点设计中带入了hooks链表的概念&#xff08;memorizedState&#xff09;&#xff0…

博弈论——巴什博弈(C++)

博弈论&#xff08;C&#xff09; 前言例题&#xff1a;拍卖会题目描述输入输出格式输入格式&#xff1a;输出格式&#xff1a; 输入输出样例输入样例#1&#xff1a;输出样例#1&#xff1a; 例题的解&#xff1a;巴什博奕&#xff08;Bash Game&#xff09;&#xff1a;代码&am…

CEPH部署

//存储类型 块存储 一对一&#xff0c;只能被一个主机挂载使用&#xff0c;数据以块为单位进行存储&#xff0c;典型代表&#xff1a;硬盘 文件存储 一对多&#xff0c;能被多个主机同时挂载使用&#xff0c;数据以文件的形式存储的&#xff08;元数据和实际数据是分开存储…

【30】核心易中期刊推荐——人工智能图像处理

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

javascript基础二十三:说说 JavaScript 中内存泄漏的几种情况

一、是什么 内存泄漏&#xff08;Memory leak&#xff09;是在计算机科学中&#xff0c;由于疏忽或错误造成程序未能释放已经不再使用的内存 并非指内存在物理上的消失&#xff0c;而是应用程序分配某段内存后&#xff0c;由于设计错误&#xff0c;导致在释放该段内存之前就失…

【数学建模】期末样题(2021年真题)

一、&#xff08;10分&#xff09;某乳制品厂计划生产A、B、C三种酸奶。已知生产单位重量的A需要加工设备3小时&#xff0c;原料甲1千克&#xff0c;原料乙0.2千克&#xff1b;生产单位重量的B需要加工设备5小时&#xff0c;原料甲1千克&#xff0c;原料乙0.3千克&#xff1b;生…

若依之权限处理

若依之权限处理 若依前后端不分离版本使用的是shiro进行权限控制&#xff0c;本文主要是对shiro在若依中的使用进行分析。 RBAC权限模型 RBAC是指基于角色的访问控制。其基本思想是&#xff0c;对系统的各种权限不是直接授予具体的用户&#xff0c;而是在用户集合与权限集合…

【论文总结】Drifuzz: Harvesting Bugs in Device Drivers from Golden Seeds

Drifuzz:从金种子中收获设备驱动程序中的漏洞 摘要: 现代计算机中的外围硬件通常被认为是安全的且不带恶意&#xff0c;并且设备驱动程序以信任从硬件输入的方式实现。然而&#xff0c;最近的漏洞攻击&#xff08;如Broadpwn&#xff09;已经证明攻击者可以通过易受攻击的外围…

Map复习(JDK1.8)

首先考虑的问题任然是高并发的安全问题&#xff1a; HashMap是一个不安全的&#xff0c;多线程会导致数据不一致。 Hashtable是安全的&#xff0c;但是速度比较慢&#xff0c;只要是安全的就是一性能为代价换来的&#xff0c;加锁开锁需要时间&#xff0c;加锁是只能一个线程访…

服务注册与发现总结

文章目录 概要一、服务注册与发现技术要点1.1、服务注册/下线1.1.1、代理注册1.1.2、客户端注册 1.2、健康检查&#xff08;续约&#xff09;1.2.1、主动检测1.2.2、被动检测 1.3、服务发现1.3.1、代理发现1.3.2、客户端发现 1.4、服务变更通知1.4.1、主动通知1.4.2、被动通知 …

linux系统vim编辑器的使用

前言&#xff1a; 前面我们就说过在linux系统下一切都是文件&#xff0c;也可以说在日常使用linux系统过程中使用频率最高工具&#xff0c;基本没有之一&#xff0c;今天就来详情介绍一下我们在日常使用vim编辑器的过程中一些常见的指令&#xff0c;博主始终遵循好记心不如烂笔…

Excel排序

Excel排序 写在前面&#xff1a; Excel是我们最常用的办公工具之一&#xff0c;其中排序是最基础和最重要的一项&#xff0c;如下介绍了两种排序方式&#xff0c;有需要者可以参照这些步骤完成相关任务~ 一、排序方法1 使用Excel自带的排序功能&#xff0c;具体步骤如下&…

pandas菜鸟速学-series

一、pandas是什么 一个基于numpy的数据处理数据分析的工具。 特点&#xff1a; Pandas 的主要数据结构是 Series &#xff08;一维数据&#xff09;与 DataFrame&#xff08;二维数据&#xff09;&#xff0c;这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大…

重学SSE

概述 SSE&#xff08;Server-Sent Events&#xff09;是一种用于实现服务器主动向客户端推送数据的技术&#xff0c;也被称为“事件流”&#xff08;Event Stream&#xff09;。它基于 HTTP 协议&#xff0c;利用了其长连接特性&#xff0c;在客户端与服务器之间建立一条持久化…

暴力递归到动态规划(一)

⭐️前言⭐️ 动态规划是一个很难的模块&#xff0c;如果一道动态规划的题目直接去推出动态转移方程来解题&#xff0c;是很难的&#xff0c;所以应该先想出暴力解决的方法&#xff0c;再去用空间换时间优化&#xff0c;得出动态规划的解法。 &#x1f349;欢迎点赞 &#x1f…

【Java设计模式】—— 享元模式概述和示例

目录 概述享元模式的定义与特点享元模式的结构与实现1. 模式的结构2. 模式的理论实现 享元模式的应用实例代码实现 享元模式的应用场景享元模式的在实际工作中的应用参考文献 概述 在面向对象程序设计过程中&#xff0c;有时会面临要创建大量相同或相似对象实例的问题。创建那…

Linux命令学习之mkdir、rmdir和rm

这篇文章想要学习一下目录的创建&#xff08;mkdir&#xff09;、空目录的删除&#xff08;rmdir&#xff09;、非空目录的删除&#xff08;rm&#xff09;。 mkdir mkdir是新建目录的命令。man mkdir看一下mkdir的使用说明。 按q键退出帮助说明。 mkdir /learnwell在根目录…