【33】t-SNE原理介绍与对手写数字MNIST的可视化结果

article/2025/9/29 11:31:39

如有错误,恳请指出。


这篇博客将会介绍一个无监督的降维算法——t-SNE,其是一个常用的降维可视化工具,下面会记录一下李宏毅老师对其的原理介绍,然后我做了一个实验,用其来对手写数字(MNIST数据集)进行降维的一个效果展示。

文章目录

  • 1. t-SNE原理介绍
    • 1.1 manifold介绍
    • 1.2 LLE
    • 1.3 t-SNE
  • 2. t-SNE可视化效果
    • 2.1 2D可视化效果
    • 2.2 3D可视化效果
  • 3. t-SNE降维后对MNIST数据集进行分类

1. t-SNE原理介绍

t-SNE全称是t-distributed Stochastic Neighbor Embedding,所以manifold方法的一种。

1.1 manifold介绍

什么是manifold,比如地球的表面就是一个maniflod,其本身是一个二维的平面,但是却被塞到了一个三维的平面中。所以此时只有比较接近的距离时,这个空间的欧式距离(Euclidean distance)才会成立,但是如果两个点距离比较远,那么这个欧式几何就不一定会成立。
在这里插入图片描述
如这个图为例,在高维空间中,直接计算欧式距离来比较两个样本的相似程度很大概率上是出错的。所以manifold learning要做的事情是把S型的这块东西展开,就是把塞到高维空间的地位空间摊平。
在这里插入图片描述
这样摊平之后就可以进行欧式距离计算,也就是降维的目标。下面会介绍两种方法:LLE与t-SNE。

1.2 LLE

paper:Think Globally, Fit Locally: Unsupervised Learning of Low Dimensional Manifolds

对样本xi,进行一个∑|| xi - ∑j wij*xj || 的二范数优化,固定住参数Wij,然后重新找一个新的向量z,满足∑|| zi - ∑j wij*zj ||,如下所示:
在这里插入图片描述
处理的效果:
在这里插入图片描述

1.3 t-SNE

在LLE中解决的问题是,想要想接近的点都是应该相邻的,但是其没有补充不同的点不同的类别需要分开。所以不同的目标其实是挤在一起的。
在这里插入图片描述
首先对原来的数据中,计算所以其他样本xjxi的一个相似程度:S(xi, xj),然后再做一个normalization,就是用S(xi, xj)除以一个正则项。其会summation over除了xi以外所有其他的点和xi之间所算出来的距离。对于另外的一个低维的数据分布也可以计算出一个Q(zi,zi)

这个normalization是必要的,因为无法知道在高维中的S(xi, xj)与低维空间中的S'(zi, zj)的scale是否是一致的。那么如果做了normalization,最后就可以把这个数值变成是几率的含义。

但是现在zi与zj是不知道的,所以希望可以找到zi与zj可以使得P(xj | xi)Q(zj | zi)这两个数据分布尽可能的相同,越接近越好。也就是根据similarity在S这个原来的space算出来的distribution与这个降维后的space算出来的distribution越接近越好。而衡量两个数据分布的相似程度的方法,就是KL divergence
在这里插入图片描述
那么,现在所需要做的事情就是找到一组z,其可以做到xi对其他样本点的distribution与zi对其他样本点的distribution,这两个distribution的KL divergence越小越好。然后summation over所以的样本点,就是损失函数的定义。最后目的是使这个损失越小越好。

损失计算的处理其实就梯度下降法,把公式带进去然后对z作微分即可,但是t-SNE的一个问题就是其需要对所以的样本点做一个相似度,所以如果样本太多可能跑不动。一个常见的做法是相用一些其他的降维算法比如PCA,然后再用t-SNE进一步的降维。但是如果现在有一个新的样本来融入原来的样本,可以发现t-SNE其实是无法解决这个问题的,所以也就是t-SNE不适合做training与testing的训练,其实其只适合做一个可视化的结果,来看看对于这个高维的数据降维后的过是怎么样的。

最后,补充一下在t-SNE中similarity的选择:
在这里插入图片描述
一个很直观的解释是:如果本来距离比较近,那么其实影响是比较小的,高维的分布与降维后的分布也算是比较接近的;但是如果本来就有一段距离,那么从原来的高维distribution变为了t-distribution之后,他会被拉得很远。t-distribution的尾巴特别长,所以如果你本来的距离比较远的话,降维变成t-distribution之后,其距离会变得更远。也就说,如果在原来的高维空间中,如果距离很近,降维后其实还算很近;但是原来如果在高维空间中就有一个距离了,那么降维后其会被拉得很远。


2. t-SNE可视化效果

下面是我用手写数字识别,使用t-SNE作的图:

2.1 2D可视化效果

在这里插入图片描述

2.2 3D可视化效果

在这里插入图片描述

不同的颜色会代表不同的数值,那么会发现无论是降到2维还是3维,不同的数字都是一群一群的。这部分的代码在我的上一篇博文中,有兴趣的的可以查看:《Scikit-learn学习系列 | 5. sklearn特征降维可视化展示(t-SNE、PCA、KernelPCA、MDS、SpectralEmbedding)》。除了t-SNE之外,里面还包含了对PCA,kernelPCA,MSD与SpectralEmbedding的降维效果展示。

  • 李宏毅老师的结果
    在这里插入图片描述

所以,总的来说,t-SNE是一个很好的可视化工具,但是其不适合做训练与测试的任务。就是就拿手写数字识别任务来是哦,如果你用t-SNE来进行降维然后再用一个分类算法比如svm或者随机森林来进行分类,其实效果是不好的。这也是无监督算法的一个毛病就是,你已经把他聚类成了10个簇,但其实这时候不知道哪个簇是哪一类,能做到的只是将数据样本区分开。


3. t-SNE降维后对MNIST数据集进行分类

在刚刚的理论部分也已经提及,t-SNE其实适合做一个可视化的结果,其不适合做一个training与testing的任务的。这里用t-SNE降维后的数据进行一个分类处理,验证一下理论。

  • 数据集准备
from sklearn import preprocessing
from sklearn.manifold import TSNEimport torch
import torchvisiontraindata = torchvision.datasets.MNIST(root='./dataset/', train=True, download=True)
testdata = torchvision.datasets.MNIST(root='./dataset/', train=False, download=True)X_train = traindata.data
y_train = traindata.targets
X_test = testdata.data
y_test = testdata.targets
# X_train.shape, y_train.shape, X_test.shape, y_test.shape
# 输出:
# (torch.Size([60000, 28, 28]),
#  torch.Size([60000]),
#  torch.Size([10000, 28, 28]),
#  torch.Size([10000]))
  • 数据降维
X_train = X_train.view(len(X_train), -1)
X_test = X_test.view(len(X_test), -1)# t-SNE降维处理
tsne = TSNE(n_components=3, verbose=1 ,random_state=42)
result = tsne.fit_transform(X_train)# 归一化处理
scaler = preprocessing.MinMaxScaler(feature_range=(-1,1))
result = scaler.fit_transform(result)
  • 可视化结果
import matplotlib.pyplot as pltfig = plt.figure(figsize=(20, 20))
ax = fig.add_subplot(projection='3d')
ax.set_title('t-SNE process')
ax.scatter(result[:,0], result[:,1], result[:,2] , c=y_train, s=10)
  • 训练集的3D可视化效果
    在这里插入图片描述

  • 模型训练与验证

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import numpy as np# 查看随机森林拟合训练集的结果
y_train = np.array(y_train)
clf = RandomForestClassifier(random_state=42)
clf.fit(result, y_train)
clf.score(result, y_train)# 需要重新降维,这就是不适合做训练任务的原因
test = tsne.fit_transform(X_test)
test = scaler.transform(test)# 测试数据的可视化结果
fig = plt.figure(figsize=(20, 20))
ax = fig.add_subplot(projection='3d')
ax.set_title('t-SNE process')
ax.scatter(test[:,0], test[:,1], test[:,2] , c=y_test, s=10)# 模型测试
train_pred = clf.predict(result)
test_pred  = clf.predict(test)# 查看训练效果
y_test = np.array(y_test)
testscore = accuracy_score(y_test, test_pred)
trainscore = accuracy_score(y_train, train_pred)
print("trainscore:{}, testscore:{}".format(trainscore, testscore))
  • 测试集的3D可视化效果
    在这里插入图片描述

打印出来的结果:trainscore:1.0, testscore:0.0523

所以可以看见效果是非常的惨不忍睹,但是其可视化效果是挺好的。所以使用t-SNE降维后再分类其实效果是不好的,因为t-SNE本身就是一个无监督的分类算法。

ps:随便用一个随机森林的算法对MNIST数据集进行分类的结果都有97+%

clf = RandomForestClassifier(random_state=42)
clf.fit(X_train, y_train)
train_pred = clf.predict(X_train)
test_pred  = clf.predict(X_test)
testscore = accuracy_score(y_test, test_pred)
trainscore = accuracy_score(y_train, train_pred)
print("trainscore:{}, testscore:{}".format(trainscore, testscore))

打印出来的结果:trainscore:1.0, testscore:0.9705


参考资料:

1. Scikit-learn学习系列 | 5. sklearn特征降维可视化展示

2. MINST数据集的分类与效果验证

3. 机器学习 第16讲 无监督学习 Neighbor Embedding T-SNE

4. 更多关于t-SNE的github参考资料


http://chatgpt.dhexx.cn/article/6nDpjerb.shtml

相关文章

【论文学习之SNE-RoadSeg】跑通SNE-RoadSeg代码

0 序言 作为一个论文学习的小白,第一次去跑一篇论文代码可谓是下了老大功夫。从一开始的陌生,到现在逐渐熟练,对于如何正确跑通论文代码也有了较为清晰的方法步骤。这段时间跟着学长学习研究论文SNE-RoadSeg,所以接下来我将围绕此…

降维系列之 SNE与t-SNE

t-SNE是一种经典的降维和可视化方法,是基于SNE(Stochastic Neighbor Embedding,随机近邻嵌入)做的,要了解t-SNE就要先了解SNE。本文同样既是总结,又是读论文笔记。 SNE 随机近邻嵌入 SNE的的第一步是用条…

t-SNE算法详解

前言 此处只作为自己学习理解的笔记之用,转载于https://blog.csdn.net/sinat_20177327/article/details/80298645 t-SNE(t-distributed stochastic neighbor embedding)是用于降维的一种机器学习算法,是由 Laurens van der Maaten 和 Geoffrey Hinton在…

t-SNE数据降维可视化

t-SNE数据降维可视化 – 潘登同学的Machine Learning笔记 文章目录 t-SNE数据降维可视化 -- 潘登同学的Machine Learning笔记 t-SNE的基本思想SNE(Stochastic Neighbor Embedding)SNE的主要缺点距离不对称存在拥挤现象 如何确定 σ \sigma σ总结t-sne代码实现 对比t-sne与UMAP…

【机器学习】基于t-SNE数据可视化工程

一、说明 t-SNE (t-Distributed Stochastic Neighbor Embedding)是一种常用的非线性降维技术。它可以将高维数据映射到一个低维空间(通常是2D或3D)来便于可视化。Scikit-learn API提供TSNE类,以使用T-SNE方法可视化数据。在本教程中,我们将简要学习如何在 Python 中使用 TS…

t-SNE:如何理解与高效使用

摘要 尽管t-SNE对于可视化高维数据非常有用,但有时其结果可能无法解读或具有误导性。通过探索它在简单情况下的表现,我们可以学会更有效地使用它。 探索高维数据的一种流行方法是t-SNE,由 van der Maaten 和 Hinton[1] 在 2008 年提出。该技术…

How to Use t-SNE Effectively.(翻译:如何高效地使用t-SNE)

Translation: How to use t-SNE effectively 1. 这些超参数真的很重要2. 在t-SNE图中,簇大小没有任何意义3. 集群之间的距离可能没有任何意义4. 随机噪声并不总是随机的。5. 有时你会看到一些形状6. 对于拓扑,你可能需要多个绘图7. 结论 尽管t-SNE在可视…

t-SNE原理与推导

t-SNE(t-distributed stochastic neighbor embedding)是用于降维的一种机器学习算法,由 Laurens van der Maaten 和 Geoffrey Hinton在08年提出。t-SNE 作为一种非线性降维算法,常用于流形学习(manifold learning)的降维过程中并与LLE进行类比&#xff0…

t-SNE降维

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

t-SNE 可视化

背景 t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非常流行的非线性降维技术,主要用来对高维数据进行可视化,了解和验证数据或者模型。t-SNE属于流行学习(manifold learning),假…

用于语义分割模型的t-SNE可视化

前言 在之前的博客t-SNE可视化-Python实现中,对t-SNE的原理进行了一个简单的介绍,也给出了一个简单的使用案例。这篇博客在之前的基础上实现在语义分割模型上的t-SNE可视化。 语义分割模型中使用t-SNE的目的是,从模型的特征层面进行一定的可…

T SNE降维matlab程序,关于t-SNE降维方法

关于t-SNE降维方法 论文原图是这样的: image.png 1. 什么是t-SNE: 全名是t-distributed Stochastic Neighbor Embedding(t-SNE),翻译过来应该可以叫学生t分布的随机邻点嵌入法。 t-SNE将数据点之间的相似度转换为概率。原始空间中的相似度由高斯联合概率表示,嵌入空间的相似…

t-SNE可视化-Python实现

t-SNE 本文主要是对An Introduction to t-SNE with Python Example博客的翻译记录,和一些入门的Python代码,可以的话推荐阅读原文。 主要参考 介绍: An Introduction to t-SNE with Python Example GitHub: sas-python-work/tS…

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…