t-SNE可视化-Python实现

article/2025/9/29 13:23:33

t-SNE

本文主要是对An Introduction to t-SNE with Python Example博客的翻译记录,和一些入门的Python代码,可以的话推荐阅读原文。

主要参考

介绍:
An Introduction to t-SNE with Python Example
GitHub:
sas-python-work/tSneExampleBlogPost.ipynb
t-SNE-tutorial
tSNE
tsne-pytorch
PintheMemory/tsnelib.py
加速包:
Multicore-TSNE
tsne-cuda

t-SNE介绍

t-Distributed Stochastic Neighbor Embedding (t-SNE) 是一种无监督的非线性技术,主要用于数据探索和高维数据的可视化。 简单来说,t-SNE 让您对数据在高维空间中的排列方式有一种感觉或直觉。 它由 Laurens van der Maatens 和 Geoffrey Hinton 于 2008 年开发。

简单来说就是高维数据可视化,目的是观察高维数据的之间的分布情况

t-SNE与PCA的区别

首先要注意的是,PCA 是在 1933 年开发的,而 t-SNE 是在 2008 年开发的。自 1933 年以来,数据科学领域发生了很大变化,主要是在计算和数据大小方面。 其次,PCA 是一种线性降维技术,旨在最大化方差并保持较大的成对距离。 换句话说,不同的事物最终会相距甚远。 这会导致可视化效果不佳,尤其是在处理非线性流形结构时。 将流形结构视为任何几何形状,例如:圆柱体、球体、曲线等。
t-SNE 与 PCA 的不同之处在于仅保留小的成对距离或局部相似性,而 PCA 关注的是保留大的成对距离以最大化方差。 Laurens 使用图 1 [1] 中的 Swiss Roll 数据集很好地说明了 PCA 和 t-SNE 方法。 您可以看到,由于这个玩具数据集(流形)的非线性和保留较大的距离,PCA 会错误地保留数据的结构。

PCA的可视化我也写了一个单独的博客,可以参考:网络特征之PCA可视化-Python实现

t-SNE原理

t-SNE 算法计算高维空间和低维空间中实例对之间的相似性度量。 然后,它尝试使用成本函数优化这两个相似性度量。 让我们将其分解为 3 个基本步骤:

  1. 第一步,测量高维空间中点之间的相似度。 想想散布在二维空间上的一堆数据点(图 2)。 对于每个数据点 (xi),我们将在该点上以高斯分布为中心。 然后我们测量该高斯分布下所有点 (xj) 的密度。 然后对所有点重新归一化。 这为我们提供了所有点的一组概率 (Pij)。 这些概率与相似性成正比。 这意味着,如果数据点 x1 和 x2 在这个高斯圆下具有相等的值,那么它们的比例和相似性是相等的,因此它们在这个高维空间的结构中具有局部相似性。 高斯分布或圆可以使用所谓的 perplexity 来操纵,它会影响分布的方差(圆的大小)以及最近邻的数量。 perplexity 的正常范围在 5 到 50 之间 [2]。
  2. 第 2 步与第 1 步类似,但不是使用高斯分布,而是使用具有一个自由度的学生 t 分布,也称为柯西分布(图 3)。 这为我们提供了低维空间中的第二组概率(Qij)。 如图所示,学生 t 分布的尾部比正态分布更重。 厚重的尾巴可以更好地模拟远距离。
  3. 最后一步是我们希望这些来自低维空间 (Qij) 的概率集尽可能地反映高维空间 (Pij) 的概率。 我们希望这两个地图结构相似。 我们使用 Kullback-Liebler 散度 (KL) 测量二维空间的概率分布之间的差异。最后,我们使用梯度下降来最小化我们的 KL 成本函数。

t-SNE的Python实现

入门例子

import numpy as npfrom sklearn.manifold import TSNE
# For the UCI ML handwritten digits dataset
from sklearn.datasets import load_digits# Import matplotlib for plotting graphs ans seaborn for attractive graphics.
import matplotlib.pyplot as plt
import matplotlib.patheffects as pe
import seaborn as snsdef plot(x, colors):# Choosing color palette# https://seaborn.pydata.org/generated/seaborn.color_palette.htmlpalette = np.array(sns.color_palette("pastel", 10))# pastel, husl, and so on# Create a scatter plot.f = plt.figure(figsize=(8, 8))ax = plt.subplot(aspect='equal')sc = ax.scatter(x[:,0], x[:,1], lw=0, s=40, c=palette[colors.astype(np.int8)])# Add the labels for each digit.txts = []for i in range(10):# Position of each label.xtext, ytext = np.median(x[colors == i, :], axis=0)txt = ax.text(xtext, ytext, str(i), fontsize=24)txt.set_path_effects([pe.Stroke(linewidth=5, foreground="w"), pe.Normal()])txts.append(txt)plt.savefig('./digits_tsne-pastel.png', dpi=120)return f, ax, txtsdigits = load_digits()
print(digits.data.shape)
# There are 10 classes (0 to 9) with alomst 180 images in each class 
# The images are 8x8 and hence 64 pixels(dimensions)# Place the arrays of data of each digit on top of each other and store in X
X = np.vstack([digits.data[digits.target==i] for i in range(10)])
# Place the arrays of data of each target digit by the side of each other continuosly and store in Y
Y = np.hstack([digits.target[digits.target==i] for i in range(10)])# Implementing the TSNE Function - ah Scikit learn makes it so easy!
digits_final = TSNE(perplexity=30).fit_transform(X) 
# Play around with varying the parameters like perplexity, random_state to get different plotsplot(digits_final, Y)

生成的图片(分别是husl风格和pastel风格,每次运行结果不一样):
在这里插入图片描述
在这里插入图片描述
在前面的基础上换一种可视化风格:

def plot2(data, x='x', y='y'):sns.set_context("notebook", font_scale=1.1)sns.set_style("ticks")sns.lmplot(x=x,y=y,data=data,fit_reg=False,legend=True,height=9,hue='Label',scatter_kws={"s":200, "alpha":0.3})plt.title('t-SNE Results: Digits', weight='bold').set_fontsize('14')plt.xlabel(x, weight='bold').set_fontsize('10')plt.ylabel(y, weight='bold').set_fontsize('10')plt.savefig('./digits_tsne-plot2.png', dpi=120)import pandas as pd
data = {'x': digits_final[:, 0],'y': digits_final[:, 1],'Label': Y}
data = pd.DataFrame(data)
plot2(data)

生成的图片:
在这里插入图片描述

高级例子

由于篇幅的原因,分割网络模型的t-SNE可视化放在了新的博客上:
用于语义分割模型的t-SNE可视化
欢迎大家留言讨论,谢谢


http://chatgpt.dhexx.cn/article/yff4H4a4.shtml

相关文章

t-SNE完整笔记

t-SNE(t-distributed stochastic neighbor embedding)是用于降维的一种机器学习算法,是由 Laurens van der Maaten 和 Geoffrey Hinton在08年提出来。此外,t-SNE 是一种非线性降维算法,非常适用于高维数据降维到2维或者3维,进行可…

机器学习笔记:t-SNE

0 前言 t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非常常用的数据降维,常用于数据可视化t-SNE/SNE的基本原理是: 在高维空间构建一个概率分布拟合高维样本点间的相对位置关系 在低维空间,也构建 一个…

图像异常检测

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达在机器学习中,处理异常检测任务是很常见的。数据科学家经常遇到必须显示,解释和预测异常的问题。在这篇文章中,我们主要讲述&#xff…

python进行图像边缘检测

边缘检测 图像边缘是指图像中表达物体的周围像素灰度发生阶跃变化的那些像素集合。 图像中两个灰度不同的相邻区域的交界处,必然存在灰度的快速过渡或称为跳变,它们与图像中各区域边缘的位置相对应,边缘蕴含了丰富的内在信息,如方…

用CNN识别CT图像检测肺癌

用CNN识别CT图像检测肺癌 原文:2nd place solution for the 2017 national datascience bowl 翻译参考:知乎用户王小新 Kaggle百万美元大赛优胜者:用CNN识别CT图像检测肺癌 概要 本文为2017年由Kaggle举办的数据科学竞赛的第二名获奖者Juli…

机场航拍图像检测软件(Python+YOLOv5深度学习模型+清新界面)

摘要:机场航拍图像检测软件使用深度学习技术检测机场航拍图像中的飞机目标等,识别航拍目标等结果并记录和保存,辅助机场智能管理运行。在介绍算法原理的同时,给出Python的实现代码、训练数据集,以及PyQt的UI界面。机场…

半监督学习+3D医疗图像检测 FocalMix

目录 Abstract 1.Contributions Introduction 2. Background and Preliminaries背景和准备工作 2.1.1 Anchor boxes 2.1.2 Focal Loss 2.2. Semi-supervised Learning 3. Methodology 3.1. Soft-target Focal Loss 3.2. Anchor-level Target Prediction 3.3. MixUp A…

检测 图像中得直线

Radon 变换 介绍 图像投影,就是说将图像在某一方向上做线性积分(或理解为累加求和)。如果将图像看成二维函数f(x, y),则其投影就是在特定方向上的线性积分,比如f(x, y)在垂直方向上的线性积分就是其在x轴上的投影&…

遥感图像目标检测研究综述

遥感图像目标检测 遥感图像特殊性一、目标检测研究综述1.介绍2.传统目标检测3.基于深度学习目标检测R-CNN系列为代表的两阶段算法YOLO、SSD为代表的一阶段算法 二、多尺度目标检测研究综述1.基于图像金字塔的多尺度目标检测基于尺度生成网络的图像金字塔基于尺度归一化的图像金…

工业自动化流水线上的机器视觉检测应用 (二):图像检测

图像检测是用机器代替人眼来做测量和判断,使用工业相机等机器视觉产品将被检测的目标转换成图像信号,传送给专用的图像处理系统,根据像素分布和亮度、颜色等信息,转变成数字化信号,图像处理系统等通过分析这些信号进行…

基于卷积神经网络的多目标图像检测研究(一)

摘 要 目标检测任务简单来说是在图片或视频中指出多个特定目标并以方框形式给出这些物体在图片中的位置和大小。它与我们的生活密切相关,它被广泛应用于安全识别、无人驾驶、医疗诊断、图像检索等领域,并且未来将愈发重要。因此目标检测也是近年来机器学…

图像检测系列之(12)异常检测(13)拼接伪造(14)deepfake | ICCV2021生成对抗GAN汇总梳理...

(1)GAN改进系列 | 最新ICCV2021生成对抗网络GAN论文梳理汇总图像编辑系列之(2)基于StyleGAN(3)GAN逆映射(4)人脸 (5)语义生成 | ICCV2021生成对抗GAN梳理汇总…

文章摘要 如何使用CLIP做图像检测 RegionCLIP:基于区域的文本-图像预训

摘要:使用图像-文本对的对比语言图像预训练模型(CLIP)在零样本和迁移学习环境下的图像分类方面都取得了令人印象深刻的结果。但直接应用CLIP模型识别图像区域进行对象检测效果并不好,这是因为CLIP被训练为将图像作为一个整体与文本…

图像检测之抽烟检测与打电话检测

识别司机是否抽烟和是否打电话的图像算法,通过深度学习实现,其中用到了一些opencv的知识,效果图如下: 相关技术资料请见本人其它博客文章

图像检测技术的研究现状

图像检测技术的研究现状 技术检测 图像处理知识库 2016-01-08 19:59 图像检测技术的研究现状 所谓图像检测,就是通过图像对感兴趣的特征区域(检测目标)进行提取的过程,其中图像是承载检测目标的载体,检测目标需要事先…

YOLT遥感图像检测算法详解

You Only Look Twice: Rapid Multi-Scale Object Detection InSatellite Imagery-论文链接-代码链接 目录 1、需求解读2、遥感图像处理和普通图像处理的区别与联系3、YOLT检测算法分析3.1 遥感图像中的视觉挑战3.2 YOLT检测算法简介 4、YOLT检测算法实现详解4.1 YOLT检测算法网…

opencv 简单的图像检测,识别,标注,

2022/4/19 刚刚做了个升级版,就是第二种读取文件的方式,另外分函数写了 链接: python opencv 简单图像识别,标注 [升级版]_死非死的…

医学图像3D目标检测

医学图像3D目标检测 论文:3D Bounding Box Detection in Volumetric Medical Image Data: A Systematic Literature Review 这篇论文综述了近五年在三维医学数据中进行3D Bouding Box Detection的方法。 1、论文背景 VOI的提取是重要的预处理步骤,例如…

图像检测常用评价指标与数据集

评价指标 1.准确率(Accuracy) 检测时分对的样本数除以所有的样本数。准确率一般被用来评估检测模型的全局准确程度,包含的信息有限,不能完全评价一个模型性能。 2.混淆矩阵(Confusion Matrix) 混淆矩阵是以模型预测的类别数量统计信息为横轴&#xff0c…

基于Yolov5的医学图像检测

yolov5医学图像检测练手项目: 数据集分布如下: 5S改进检测结果如下,可加入注意力机制、多尺度等技术提升检测精度 专注于各个行业的落地应用,如工业检测、医学图像检测等;