文章目录

  • 1. t-SNE的基本概念
  • 2. t-SNE介绍
    • 2.1 SNE(随机邻域嵌入)
    • 2.2 t-SNE
    • 2.3 t-SNE的优缺点
      • 2.3.1 t-SNE优点
      • 2.3.2 t-SNE的缺点
  • 3. 代码实现
    • 3.1 接口参数解释:
    • 3.2方法

1. t-SNE的基本概念

t-SNE(t-distributed stochastic neighbor embedding) 是一种非线性降维算法,非常适用于高维数据降维到2维或者3维,并进行可视化。

2. t-SNE介绍

t-SNE是由SNE(Stochastic Neighbor Embedding, SNE; Hinton and Roweis, 2002)发展而来。

2.1 SNE(随机邻域嵌入)

SNE首先将数据点之间的高维欧几里德距离转换为表示相似性的条件概率,如(1)式。对于附近的数据点,pj|i相对较高,而对于广泛分离的数据点,pj|i几乎是无穷小的。

高维数据点xi和xj 的低维对应项yi和yj,可以计算类似的条件概率,我们用qj|i表示。

如果映射点yi和yj正确地建模了高维数据点xi和xj之间的相似性,则条件概率pj|i和qj|i将相等。受这一观察结果的启发,SNE的目标是找到一种低维数据表示法,以最小化pj|i和qj|i之间的不匹配。qj|i建模pj|i的信度的自然度量是KullbackLeibler散度。SNE使用梯度下降法最小化所有数据点上的Kullback-Leibler发散之和。成本函数C由下式给出:

其中Pi表示给定数据点xi的所有其他数据点上的条件概率分布,Qi表示给定图点yi的所有其他地图点上的条件概率分布。由于Kullback-Leibler散度是非对称的,因此低维映射中成对距离中的不同类型的误差加权不相等。特别是,使用广泛分离的地图点来表示附近的数据点(即使用一个小的qj|i来模拟一个大的pj|i),但是使用附近的地图点来表示广泛分离的数据点的成本很小。这个小成本来自于在相关Q分布中浪费一些概率质量。换句话说,SNE成本函数侧重于在地图中保留数据的局部结构。

SNE的缺点:
尽管SNE构建了相当好的可视化效果,但它受到
①难以优化的成本函数
②拥挤问题
拥挤问题就是说各个簇聚集在一起,无法区分。比如有一种情况,高维度数据在降维到10维下,可以有很好的表达,但是降维到两维后无法得到可信映射,比如降维如10维中有11个点之间两两等距离的,在二维下就无法得到可信的映射结果(最多3个点)。

2.2 t-SNE

t-SNE旨在缓解SNE的缺点。t-SNE使用的成本函数在两个方面不同于SNE使用的成本函数:
(1)它使用了具有更简单梯度的SNE成本函数C的对称版本

(2)它使用Student-t分布不是高斯分布计算低维空间中两点之间的相似性

2.3 t-SNE的优缺点

2.3.1 t-SNE优点

对于不相似的点,用一个较小的距离会产生较大的梯度来让这些点排斥开来。
这种排斥又不会无限大(梯度中分母),避免不相似的点距离太远。
t-SNE在低维空间采用重尾分布,以缓解SNE的拥挤问题和优化问题。

2.3.2 t-SNE的缺点

尽管我们已经证明,t-SNE与其他数据可视化技术相比具有优势,但tSNE有三个潜在的弱点:
(1)t-SNE在一般降维任务中的表现尚不清楚,
目前尚不清楚t-SNE将如何执行更一般的降维任务(即当数据的维度不是降到两个或三个维度,而是降到d>3个维度时)。为了简化评估问题,本文只考虑使用t-SNE进行数据可视化。
(2)t-SNE的相对局部性使其对数据的固有维数的诅咒非常敏感,
而且t-SNE倾向于保存局部特征,对于本征维数(intrinsic dimensionality)本身就很高的数据集,是不可能完整的映射到2-3维的空间。(部分)解决该问题的一种可能方法是,对从模型中获得的数据表示进行t-SNE,如自编码器。这种深层体系结构可以以更简单的方式表示复杂的非线性函数,因此,学习合适的解决方案需要更少的数据点。例如,对自动编码器生成的数据表示执行t-SNE可能会提高构建的可视化的质量,因为自动编码器比局部方法(如t-SNE)更好地识别高度变化的线性。
(3)t-SNE不保证收敛到其代价函数的全局最优。
t-SNE的一个主要缺点是代价函数C不是凸的,因此需要选择几个优化参数。构造的解决方案取决于这些优化参数的选择,并且每次从映射点的初始随机配置运行t-SNE时可能会有所不同。
(4)t-SNE没有唯一最优解,且没有预估部分。
如果想要做预估,可以考虑降维之后,再构建一个回归方程之类的模型去做。但是要注意,t-sne中距离本身是没有意义,都是概率分布问题。
(5)训练太慢。
与许多其他可视化技术一样,t-SNE的计算和内存复杂性是数据点数量的二次方。这使得将标准版本的t-SNE应用于包含超过10000个点的数据集是不可行的。t-SNE的计算复杂度和内存复杂度都是O(n2),有很多基于树的算法在t-sne上做一些改进。

3. 代码实现

from sklearn.manifold import TSNE
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 加载数据集
iris = load_iris()
# 共有150个例子, 数据的类型是numpy.ndarray
print(iris.data.shape)#(150,4)
# 对应的标签有0,1,2三种
print(iris.target.shape)#(150,)
# 使用TSNE进行降维处理。从4维降至2维。
tsne = TSNE(n_components=2, learning_rate=100).fit_transform(iris.data)# 使用PCA 进行降维处理
pca = PCA().fit_transform(iris.data)
# 设置画布的大小
plt.figure(figsize=(12, 6))
plt.subplot(121)
plt.scatter(tsne[:, 0], tsne[:, 1], c=iris.target)
plt.subplot(122)
plt.scatter(pca[:, 0], pca[:, 1], c=iris.target)
plt.colorbar()
plt.show()

运行结果:

3.1 接口参数解释:

sklearn.manifold.TSNE(n_components=2, perplexity=30.0, early_exaggeration=12.0, learning_rate=200.0, n_iter=1000, n_iter_without_progress=300, min_grad_norm=1e-07, metric=’euclidean’, init=’random’, verbose=0, random_state=None, method=’barnes_hut’, angle=0.5)
参数:
n_components:int,可选(默认值:2)嵌入式空间的维度。
perplexity:float,可选(默认:30)较大的数据集通常需要更大的perplexity。考虑选择一个介于5和50之间的值。由于t-SNE对这个参数非常不敏感,所以选择并不是非常重要。
early_exaggeration:float,可选(默认值:4.0)这个参数的选择不是非常重要。
learning_rate:float,可选(默认值:1000)学习率可以是一个关键参数。它应该在100到1000之间。如果在初始优化期间成本函数增加,则早期夸大因子或学习率可能太高。如果成本函数陷入局部最小的最小值,则学习速率有时会有所帮助。
n_iter:int,可选(默认值:1000)优化的最大迭代次数。至少应该200。
n_iter_without_progress:int,可选(默认值:300,必须是50倍数)在我们中止优化之前,没有进展的最大迭代次数。
0.17新版​​功能:参数n_iter_without_progress控制停止条件。
min_grad_norm:float,可选(默认值:1E-7)如果梯度范数低于此阈值,则优化将被中止。
metric:字符串或可迭代的,可选,计算特征数组中实例之间的距离时使用的度量。如果度量标准是字符串,则它必须是scipy.spatial.distance.pdist为其度量标准参数所允许的选项之一,或者是成对列出的度量标准.PAIRWISE_DISTANCE_FUNCTIONS。如果度量是“预先计算的”,则X被假定为距离矩阵。或者,如果度量标准是可调用函数,则会在每对实例(行)上调用它,并记录结果值。可调用应该从X中获取两个数组作为输入,并返回一个表示它们之间距离的值。默认值是“euclidean”,它被解释为欧氏距离的平方。
init:字符串,可选(默认值:“random”)嵌入的初始化。可能的选项是“随机”和“pca”。 PCA初始化不能用于预先计算的距离,并且通常比随机初始化更全局稳定。
random_state:int或RandomState实例或None(默认)
伪随机数发生器种子控制。如果没有,请使用numpy.random单例。请注意,不同的初始化可能会导致成本函数的不同局部最小值。
method:字符串(默认:‘barnes_hut’)
默认情况下,梯度计算算法使用在O(NlogN)时间内运行的Barnes-Hut近似值。 method ='exact’将运行在O(N ^ 2)时间内较慢但精确的算法上。当最近邻的误差需要好于3%时,应该使用精确的算法。但是,确切的方法无法扩展到数百万个示例。0.17新版​​功能:通过Barnes-Hut近似优化方法。
angle:float(默认值:0.5)
仅当method ='barnes_hut’时才使用这是Barnes-Hut T-SNE的速度和准确性之间的折衷。 ‘angle’是从一个点测量的远端节点的角度大小(在[3]中称为theta)。如果此大小低于’角度’,则将其用作其中包含的所有点的汇总节点。该方法对0.2-0.8范围内该参数的变化不太敏感。小于0.2的角度会迅速增加计算时间和角度,因此0.8会快速增加误差。

3.2方法


这部分不用了解太多,知道几个主要的参数如n_components、n_iter、init等以及主要的方法fit_transform就好了。

#流程
tsne = TSNE(perplexity=50) #调用TSNE函数
X_embedded = tsne.fit_transform(X0) #输入数据
plt.figure(figsize=(12, 6))
plt.scatter(X_embedded[:,0], X_embedded[:,1],c=y0,cmap='Reds')# 根据y值进行可视化 选择颜色值
plt.colorbar() #显示色棒
plt.show()
tsne.embedding_ #返回二维数据点的对应的坐标

参考链接:https://distill.pub/2016/misread-tsne/

tsne原理以及代码实现(学习笔记)相关推荐

  1. monodepth-pytorch代码实现学习笔记(一)

    monodepth-pytorch代码实现学习笔记(一) 前言 一.前期准备 1. 数据集 2. 训练与测试 二.数据预处理 1. data_loader.py 1.1 __init__(self,r ...

  2. 《区块链原理与技术》学习笔记(六) — 区块链安全

    <区块链原理与技术>学习笔记 第六部分 四.区块链网络层 1. 网络层安全 1.1 分布式拒绝服务攻击(DDos) 1.2 延展性攻击 1.3 日蚀攻击 1.4 分割攻击 1.5 延迟攻击 ...

  3. 步步为营 .NET 代码重构学习笔记 九

    步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...

  4. 步步为营 .NET 代码重构学习笔记 十一

    步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...

  5. 步步为营 .NET 代码重构学习笔记 十

    步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...

  6. 【相机标定与三维重建原理及实现】学习笔记1——相机模型数学推导详解

    目录 前言 一.小孔成像模型 二.坐标系的变换 1.世界坐标系到相机坐标系的变换(刚体变换)[xw^→xc^\boldsymbol {\hat{x_{w}}}\rightarrow \boldsymb ...

  7. 决策树模型(ID3/C4.5/CART)原理和底层代码解读 学习笔记

    本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流. 未经本人允许禁止转载 如下为个人的学习笔记,使用latex编写,再写成文本太麻烦 ...

  8. 《浏览器工作原理与实践》学习笔记

    浏览器原理 前言 本文是学习李兵老师的<浏览器工作原理与实践>过程中记录笔记,详细链接见文末 进程vs线程 进程:一个应用程序的运行实例就是一个进程,详细来说就是:启动一个应用程序的时候, ...

  9. python基础代码事例-学习笔记:python3,代码。小例子习作(2017)

    http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...

  10. STARK代码详细学习笔记

    STARK代码学习笔记 前言 一.环境安装 二.设置项目路径 三.训练STARK 四.测试STARK 1. 下载预训练模型 2. 准备测试数据集 五.STARK代码细节 六.测试过程可视化 前言 本文 ...

最新文章

  1. python 内置方法赋值_Python内置函数
  2. IE浏览器Cookie信息提取工具Galleta
  3. redis+aop防重复提交
  4. java出代码1601_LeetCode 1601. 最多可达成的换楼请求数目
  5. 《大话软件工程—需求分析与软件设计》,给出了分析与设计过程中需要的理论、方法、工具和标准
  6. 在电脑上怎么打印文件_电脑上怎么mov格式怎么转换成mp4
  7. SAP澄清概念、理清思路、组织机构
  8. 楼对面的男士夏天就光膀子,请问大家,男士真的都爱光膀子吗?
  9. 三层实例--加入信息
  10. 【路径规划】基于matlab任意架次植保无人机作业路径规划【含Matlab源码 322期】
  11. 股市集合竞价藏了很多秘密
  12. 一元二次方程解法的实现(Python)
  13. Windows 10, version 21H2 (released Nov 2021) 简体中文版、英文版(企业版)下载
  14. 高中上计算机专业用买电脑吗,我是高中毕业生,要上大学该买什么电脑?
  15. Moos-IvP 实验室7 Helm Autonomy 任务详解
  16. 嵌入式课程设计:socket通信模拟服务器客户端实现文件传送(基于c++语言)
  17. SQL Sever 2012
  18. 模糊数学学习笔记 1:模糊集
  19. 华为ensp 启动ar设备失败,错误代码 :40
  20. iphone手机里的计算机没有了怎么办,iphone连接电脑无反应怎么办

热门文章

  1. 网络同步在游戏历史中的发展变化(六)—— 优化技术总结(完结篇)
  2. 锐龙适合java开发_荣耀锐龙版笔记本怎么样?开箱评测了解一下
  3. mysql存入订单号不重复_MSSQL高并发下生成连续不重复的订单号
  4. 『津津乐道播客』#035. 签证和被拒签的那些事儿
  5. 二手矿机买卖生意经:熟人的生意,生人的坑
  6. PCA降维原理(主成分分析)小结
  7. IDEA中如何配置Git?
  8. Python(14)查找算法
  9. html页面之间跳转失败,js跳转到上一页面失败的解决方法
  10. 如何在 Keynote 讲演中添加神奇移动效果?