降维算法之t-SNE (t-Distributed Stochastic Neighbor Embedding)

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

t-SNE是一种用于探索高维数据结构的非线性降维技术。它特别适用于高维数据的可视化,因为它能够在低维空间中保留原始高维数据的局部结构。由于这个特性,t-SNE在机器学习和数据分析领域越来越受到重视。

1 算法解读

t-SNE的核心思想是在高维空间中为数据点之间定义一种概率分布,表示点与点之间的相似性,然后在低维空间中创建一个相似的概率分布。通过最小化这两个分布之间的差异(使用KL散度),算法将高维数据映射到低维空间,以便我们可以可视化。

2 步骤和细节

Step 1. 计算高维空间中的相似度

我们使用高斯分布(正态分布)来计算点之间的相似性。高斯分布是一种常见的概率分布,其形状呈钟型,由均值和方差(标准差的平方)决定。高斯分布有一个很好的性质:它的形状由均值(中心点)和方差(分布的宽度)决定。当我们围绕一个数据点 x 画一个高斯分布时,这个分布会给予附近的点较高的概率值,而离得远的点则会有较低的概率值。这与我们直觉上对“相似性”的理解相一致:靠近的点更相似,远离的点不相似。

对于每个数据点x_i,我们计算所有其他点x_j与其的条件概率p_{jji}。这个概率反映了点x_j 是 点 x_i 的近邻的可能性。计算公式为:

                                            p_{j|i}=\frac{\exp\left(-\left\|x_i-x_j\right\|^2/2\sigma_i^2\right)}{\sum_{k\neq i}\exp\left(-||x_i-x_k||^2/2\sigma_i^2\right)}

这里,分子部分计算了x_ix_j之间的欧氏距离的平方(即 -\left\|x_i-x_j\right\|^2 ),然后通过高斯分布转换成概率。分母部分是一个归一化因子,确保所有p_{j|i}的和为1。

\sigma_{i}是高斯分布的方差,决定了近邻的范围。不同的点可能有不同的密度,因此\sigma_{i}对于每个 点 x_i可能是不同的,需要通过一种叫做“困惑度”的量来确定。

最后,为了得到一个对称的相似度矩阵,我们取p_{j|i}p_{i|j} 的平均值得到 pij :

                                                        p_{ij}=\frac{p_{j|i}+p_{i|j}}{2n}

这样,我们就得到了一个对称的相似度矩阵,其中的每个元素p_{ij}都反映了数据点x_ix_j 在高维空间中的相似性。

通过这一步,我们成功地量化了高维空间中数据点之间的相似性,为后续的低维空间嵌入奠 定了基础。

Step 2. 初始化低维空间的点

这一步可以是随机初始化,只需保证初始化点的数量和原数据相同,维度更低即可。

Step 3. 计算低维空间的点的相似度

在t-SNE算法中,高维空间的相似度是通过高斯(正态)分布计算的,而低维空间的相似度是通过t分布(具体来说是自由度为1的t分布,也叫做柯西分布)计算的。这种设计的目的是为了解决“拥挤问题”。

当我们将高维空间中的数据点降维到低维空间时,数据点之间的距离会发生变化。特别是在低维空间中,点与点之间可用的空间更少,容易出现拥挤的情况。如果直接使用高斯分布来计算低维空间的相似度,那么低维空间中远离的点之间的相似度可能会被过高地估计,导致降维结果的可视化效果不佳。

t分布(自由度为1)有一个重要的特性:它的尾部比高斯分布更“厚”(heavy-tailed)。这意味着,在低维空间中,即使两个点距离较远,它们之间的相似度(通过t分布计算)也不会迅速减小到0。这有助于缓解拥挤问题,因为低维空间中远离的点之间的相似度会被较低地估计。对t分布不了解的同学详见数学专栏的博文或视频。

在低维空间中,我们计算点 y_i和 y_j之间的相似度q_{ij}如下:
                                                    q_{ij}=\frac{\left(1+\left\|y_i-y_j\right\|^2\right)^{-1}}{\sum_{k\neq l}\left(1+\left\|y_k-y_l\right\|^2\right)^{-1}}

这个公式来源于自由度为 1 的t分布。分子部分计算了y_i 和 y_j 之间的欧氏距离的平方,并转换成了概率。分母部分是一个归一化因子,确保所有的q_{ij} 之和为1。

通过这种方式,我们得到了低维空间中点之间的相似度矩阵 {q_{ij}} 。接下来,t-SNE算法会试图使高维空间的相似度矩阵 {p_{ij}} 和低维空间的相似度矩阵 {q_{ij}} 尽可能地一致,从而得到合适的低维空间表示。

Step 4. 优化低维空间的点的位置

– 通过最小化 Kullback-Leibler 散度 (KL散度) 来优化低维空间中的点的位置。KL散度用于 衡量高维空间和低维空间中的相似度分布之间的差异。

                                                 C=\sum_{i\neq j}p_{ij}\log\frac{p_{ij}}{q_{ij}}

– 使用梯度下降方法来最小化 KL散度,更新低维空间中的点的位置。  

                           \begin{aligned}\frac{\delta C}{\delta y_i}&=4\sum_j\left(p_{ij}-q_{ij}\right)\left(y_i-y_j\right)\left(1+\left\|y_i-y_j\right\|^2\right)^{-1}\end{aligned}

在梯度下降的计算中,输入是低维空间中每个点的坐标 {y_i} 。这些坐标是我们要优化的参数。输出是低维空间中点与点之间的相似度 {q_{ij}} 。这些相似度是由当前的低维坐标 {y_i} 计 算出来的。标签是高维空间中点与点之间的相似度 {p_{ij}} 。这些相似度是已知的,因为它们是由原始 高维数据计算得出的。

我们的目标是通过调整低维空间中的点的坐标{ { y_i} } (即输入),使得由这些坐标计算出的相 似度 {q_{ij}} (即输出)尽可能接近已知的高维空间的相似度 {p_{ij}} (即标签)。

为了实现这个目标,我们计算损失函数(即 KL 散度)相对于每个低维坐标的梯度,并使用这 个梯度来更新低维坐标。这个过程会重复进行,直到达到预定的迭代次数,或者低维坐标的 变化小于某个阈值。

3 举例

    我们可以考虑一个更复杂的例子。假设我们有四个四维的数据点,我们想将它们降维到二维空间:

                                                \left.X=\left\{\begin{array}{cccc}1&2&3&4\\5&6&7&8\\9&10&11&12\\13&14&15&16\end{array}\right.\right\}

3.1 计算高维空间中的相似度

计算两点间的欧氏距离的平方:


           \begin{gathered} d_{12}^2=(1-5)^2+(2-6)^2+(3-7)^2+(4-8)^2=64 \\ d_{13}^2=(1-9)^2+(2-10)^2+(3-11)^2+(4-12)^2=256 \\ d_{14}^2=(1-13)^2+(2-14)^2+(3-15)^2+(4-16)^2=576 \\ d_{23}^2=(5-9)^2+(6-10)^2+(7-11)^2+(8-12)^2=64 \\ d_{24}^2=(5-13)^2+(6-14)^2+(7-15)^2+(8-16)^2=256 \\ l_{34}^{2}=(9-13)^{2}+(10-14)^{2}+(11-15)^{2}+(12-16)^{2}=64 \end{gathered}

计算条件概率

由于 σ=1 ,我们有:


                                    \begin{aligned}p_{12}&=\frac{e^{-\frac{64}2}}{e^{-\frac{64}2}+e^{-\frac{256}2}+e^{-\frac{576}2}}\approx0.9933\\p_{13}&=\frac{e^{-\frac{256}2}}{e^{-\frac{64}2}+e^{-\frac{256}2}+e^{-\frac{576}2}}\approx0.0067\\p_{14}&=\frac{e^{-\frac{576}2}}{e^{-\frac{64}2}+e^{-\frac{256}2}+e^{-\frac{576}2}}\approx0\end{aligned}

类似地,我们可以计算其他的p_{ij} 。

对称化

我们得到对称的相似度矩阵 P ,其形式为:

                       \left.P=\frac18\left[\begin{array}{cccc}0&0.9933&0.0067&0\\0.9933&0&0.9933&0.0067\\0.0067&0.9933&0&0.9933\\0&0.0067&0.9933&0\end{array}\right.\right]

3.2 计算低维空间中的相似度

我们随机初始化低维空间中的点,例如:

                                        \left.Y=\left[\begin{array}{cc}0.1&0.2\\0.3&0.4\\0.5&0.6\\0.7&0.8\end{array}\right.\right]

计算低维空间中的相似度

计算低维空间中两点间的距离:
                    \begin{aligned}d_{12}^\mathrm{low}&=(0.1-0.3)^2+(0.2-0.4)^2=0.04+0.04=0.08\\d_{13}^\mathrm{low}&=(0.1-0.5)^2+(0.2-0.6)^2=0.16+0.16=0.32\\d_{14}^\mathrm{low}&=(0.1-0.7)^2+(0.2-0.8)^2=0.36+0.36=0.72\\d_{23}^\mathrm{low}&=(0.3-0.5)^2+(0.4-0.6)^2=0.04+0.04=0.08\\d_{24}^\mathrm{low}&=(0.3-0.7)^2+(0.4-0.8)^2=0.16+0.16=0.32\\d_{34}^\mathrm{low}&=(0.5-0.7)^2+(0.6-0.8)^2=0.04+0.04=0.08\end{aligned}

 计算低维空间中的相似度:

q_{12}=\frac{\left(1+d_{12}^\mathrm{low}\right)^{-1}}{\sum_{k\neq1}\left(1+d_{1k}^\mathrm{low}\right)^{-1}}=\frac{(1+0.08)^{-1}}{(1+0.08)^{-1}+(1+0.32)^{-1}+(1+0.72)^{-1}}\approx0.620

q_{13}=\frac{\left(1+d_{13}^\mathrm{low}\right)^{-1}}{\sum_{k\neq1}\left(1+d_{1k}^\mathrm{low}\right)^{-1}}=\frac{(1+0.32)^{-1}}{(1+0.08)^{-1}+(1+0.32)^{-1}+(1+0.72)^{-1}}\approx0.238

q_{14}=\frac{\left(1+d_{14}^\mathrm{low}\right)^{-1}}{\sum_{k\neq1}\left(1+d_{1k}^\mathrm{low}\right)^{-1}}=\frac{(1+0.72)^{-1}}{(1+0.08)^{-1}+(1+0.32)^{-1}+(1+0.72)^{-1}}\approx0.142

类似地,我们可以计算其他的 q_{ij},然后对称化得到矩阵 Q

                               \left.Q=\dfrac{1}{8}\left[\begin{array}{cccc}0&0.620&0.238&0.142\\0.620&0&0.620&0.238\\0.238&0.620&0&0.620\\0.142&0.238&0.620&0\end{array}\right.\right]

优化低维空间的点位置

我们使用梯度下降来优化低维空间中的点的位置。其中,

– 输入:这里的输入是低维空间中的点的坐标(初始通常是随机的),我们通过梯度下降来更 新这些坐标,使得低维空间中的相似度矩阵 Q 接近高维空间的相似度矩阵 P 。

– 输出: 经过优化后,低维空间中的点的坐标就是我们的输出。

– 标签: 在这个优化问题中,我们可以将高维空间中的点的相似度 P 视作是“标签”,因为我们 的目标是使低维空间中的点的相似度 Q 尽可能地接近 P 。

在这个意义上,我们是以低维空间的相似度为输入,以高维空间的相似度为标签,通过梯度下降来调整低维空间中的点的坐标,使得两者尽可能一致。

4. 代码实现

import numpy as np
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
# 定义高维数据点
X = np.array([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]
])
# 初始化 t-SNE
tsne = TSNE(n_components=2, random_state=42, perplexity=3)
# 进行 t-SNE 降维
X_tsne = tsne.fit_transform(X)
# 可视化结果
plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
for i, txt in enumerate(['Point 1', 'Point 2', 'Point 3', 'Point 4']):plt.annotate(txt, (X_tsne[i, 0], X_tsne[i, 1]))
plt.title('t-SNE Visualization')
plt.xlabel('Dimension 1')
plt.ylabel('Dimension 2')
plt.show()

import numpy as np
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.cm as cm
# 生成一个三维数据集
np.random.seed(0)
X_3D = np.random.rand(50, 3)
# 创建一个颜色映射
colors = cm.rainbow(np.linspace(0, 1, len(X_3D)))
# 可视化三维数据
fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(121, projection='3d')
ax.scatter(X_3D[:, 0], X_3D[:, 1], X_3D[:, 2], c=colors, marker='o')
ax.set_title('Original 3D Data')
# 使用t-SNE降维到2维
tsne = TSNE(n_components=2, random_state=42)
X_2D = tsne.fit_transform(X_3D)
# 可视化降维后的2D数据
ax2 = fig.add_subplot(122)
ax2.scatter(X_2D[:, 0], X_2D[:, 1], c=colors, marker='o')
ax2.set_title('2D Data after t-SNE')
plt.tight_layout()
plt.show()

算法评价

优点

  • 保持局部结构:t-SNE 优秀于保持高维数据中的局部结构到低维空间,这意味着在原始空间中相互靠近的点在低维空间中也会靠近。
  • 可视化效果佳:t-SNE 算法通常能够产生较好的可视化效果,尤其是对于高维数据,如图像、文本等。
  • 对拥挤问题的处理:t-SNE 采用了 t 分布来计算低维空间中的相似度,这有助于缓解拥挤问题(即在低维空间中相互靠近的点过于拥挤)。
  • 鲁棒性:t-SNE 对高维空间中的异常点较为鲁棒,能够在某种程度上减小它们对降维结果的影响。

缺点

  • 计算复杂度高:t-SNE 算法的计算复杂度较高,特别是当处理大规模数据集时,可能需要较长的计算时间。
  • 随机性:t-SNE 的结果受到初始点的随机选择的影响,不同的运行可能会产生不同的结果。
  • 超参数敏感:t-SNE 算法有一些超参数,如困惑度(perplexity),需要手动设置。这些参数的选择会影响算法的性能,但很难给出一个通用的最优设置。
  • 无法保持全局结构:t-SNE 主要侧重于保持局部结构,但这可能会以损害全局结构为代价,例如可能会将远离的群组拉得过近。
  • 不适用于新数据点:t-SNE 没有提供直接的方式来嵌入新的数据点,如果要添加新的数据点,通常需要重新运行整个算法。
  • 可能产生拥挤簇:虽然 t-SNE 在一定程度上处理了拥挤问题,但在某些情况下,仍然可能会出现簇的拥挤和重叠。
  • 解释性:t-SNE 的可视化结果虽然直观,但由于算法的非线性特性,可能较难解释。例如,低维空间中的距离不一定与高维空间中的距离成正比。

6. 算法变体

t-SNE 是一种流行的降维算法,已经产生了许多变体,这些变体旨在解决 t-SNE 的某些限制,例如计算效率、稳定性和可扩展性。下面是两个 t-SNE 的变体及其参考文献:

大规模 t-SNE(LargeVis):

论文标题:Visualizing Large-scale and High-dimensional Data

作者:Zhao, J., & Cao, N.

出版年份:2016

链接:arXiv:1602.00370

LargeVis 是为了处理大规模和高维数据而提出的 t-SNE 变体。与 t-SNE 相比,LargeVis 在构建 k-近邻图时采用了一种不同的方法,并使用了负采样技术来优化目标函数,从而显著提高了算法的计算效率。LargeVis 不仅能够快速处理大规模数据集,还能够保持良好的可视化效果。

UMAP(Uniform Manifold Approximation and Projection):

论文标题:UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction

作者:McInnes, L., Healy, J., & Melville, J.

出版年份:2018

链接:arXiv:1802.03426

UMAP 是一种基于流形学习的降维算法,它可以被视为 t-SNE 的一种变体,但具有更广泛的应用场景。UMAP 在保持局部和全局结构方面表现优秀,计算效率高,且能够适应不同类型的数据和学习任务。UMAP 也适用于新数据点的嵌入,这是传统 t-SNE 不具备的特性。

这两种变体都通过各自的方法改善了 t-SNE 的某些方面,值得在实际应用中尝试和比较。

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

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

相关文章

[WUSTCTF2020]朴实无华

查看robots.txt 找到/fAke_flagggg.php 显然这是个假的flag&#xff0c;但是我们在header处发现了fl4g.php 近来发现中文全部变成了乱码 插件转成utf8后正常显示 <?php header(Content-type:text/html;charsetutf-8); error_reporting(0); highlight_file(__file__);//leve…

Linux 系统调用函数fork、vfork、clone详解

文章目录 1 fork1.1 基本介绍1.2 fork实例1.2.1多个fork返回值1.2.2 C语言 fork与输出1.2.3 fork &#x1f4a3; 2 vfork2.1 基本介绍2.2 验证vfork共享内存 3 clone3.1 基本介绍3.2 clone使用 1 fork 1.1 基本介绍 #include <sys/types.h> #include <unistd.h>p…

PS学习-抠图-蒙版-冰块酒杯等透明物体

选中图&#xff0c;ctrlA 全选 ctrlC复制 创建一个蒙版图层 选中蒙版Alt 点击进入 ctrlv 复制 ctrli 反转 原图层 ctrldelete填充为白色 添加一个背景&#xff0c;这个方法通用 首选创建一个 拖到最底部 给它填充颜色 这个可能是我图片的原因。视频是这样做的

五子棋小游戏(sut实验报告)

实验目的 实现人与人或人与电脑进行五子棋对弈 实验内容 启动游戏&#xff0c;显示游戏参数设置界面&#xff0c;用户输入参数后进入游戏界面&#xff0c;显示棋盘及双方博弈过程&#xff0c;游戏过程中可选择退出游戏。判定一方获胜后结束本局游戏&#xff0c;可选择继续下…

Fiddler抓不到包

fiddler该设置的设置好之后&#xff0c;为啥就是抓不到包 以下都是以谷歌浏览器为例子 方法一&#xff1a; 将fidder证书导入到浏览器&#xff0c;设置搜索证书-->安全-->管理证书 这里可以看到将证书导入之后样子&#xff0c;名字为&#xff1a;DO_NOT_TRUST_Fiddler…

Linux操作系统裸机开发-环境搭建

一、配置SSH服务 1、下载安装ssh服务输入以下命令 sudo apt-get install nfs-kernel-server portmap2、建立一个供SSH服务使用的文件夹如以下命令 mkdir linux 3、完成前两步之后需要将其文件路径放到/etc/exports文件里输入以下命令&#xff1a; sudo vi /etc/esports 4.打…

线性回归 quickstart

构建一元一次方程 100个&#xff08;X, y &#xff09;&#xff0c;大概是’y3x4’ import numpy as npnp.random.seed(42) # to make this code example reproducible m 100 # number of instances X 2 * np.random.rand(m, 1) # column vector y 4 3 * X np.random…

最详细数据仓库项目实现:从0到1的电商数仓建设(数仓部分)

1、数仓 数据仓库是一个为数据分析而设计的企业级数据管理系统&#xff0c;它是一个系统&#xff0c;不是一个框架。可以独立运行的&#xff0c;不需要你参与&#xff0c;只要运行起来就可以自己运行。 数据仓库不是为了存储&#xff08;但是能存&#xff09;&#xff0c;而是…

创业板指399006行情数据API接口

# 测试&#xff1a;返回不超过10条数据&#xff08;2年历史&#xff09; https://tsanghi.com/api/fin/index/CHN/daily?tokendemo&ticker399006&order2Python示例 import requestsurl f"https://tsanghi.com/api/fin/index/CHN/daily?tokendemo&ticker399…

EtherCAT 开源主站 IGH 在 linux 开发板的移植和伺服通信测试

手边有一套正点原子linux开发板imax6ul&#xff0c;一直在吃灰&#xff0c;周末业余时间无聊&#xff0c;把EtherCAT的开源IGH主站移植到开发板上玩玩儿&#xff0c;搞点事情做。顺便学习研究下EtherCAT总线协议及其对伺服驱动器的运动控制过程。实验很有意思&#xff0c;这里总…

【JDBC编程】 Java程序操作数据库

目录 一、数据库编程的必备条件 二、什么是JDBC&#xff1f; 三、JDBC的使用 1. 准备工作 2. 建立数据库连接 2.1 加载驱动程序 2.2 数据库连接池技术 3. 正式操作 四、JDBC的局限性与MyBatis的优势 一、数据库编程的必备条件 编程语言&#xff0c;如Java&#xff0…

创业新手看过来!四招助你开启成功之旅

如果你每个月的薪资仅有几千块&#xff0c;还背负着债务的重担&#xff0c;家中的老少都期盼着你为他们撑起一片天&#xff0c;那么&#xff0c;你每日都可能为了如何打破这一困境而焦虑不安。不过&#xff0c;请稍安勿躁&#xff0c;今天我将为你提供四个建议&#xff0c;或许…

Transformer学习笔记(二)

一、文本嵌入层Embedding 1、作用&#xff1a; 无论是源文本嵌入还是目标文本嵌入&#xff0c;都是为了将文本中词汇的数字表示转变为向量表示&#xff0c;希望在这样的高维空间捕捉词汇间的关系。 二、位置编码器Positional Encoding 1、作用&#xff1a; 因为在Transformer…

解锁区块链游戏数据解决方案

作者&#xff1a;stellafootprint.network 随着区块链技术的日新月异&#xff0c;游戏行业正迎来一场革命&#xff0c;催生了区块链游戏的崛起。这一变革不仅为用户带来了全新的互动体验&#xff0c;也开辟了全新的盈利渠道。然而&#xff0c;在这一新兴领域&#xff0c;数据的…

html--花瓣

代码 <!DOCTYPE html> <html lang"en" ><head> <meta charset"UTF-8"> <title>Petals</title><link rel"stylesheet" href"css/style.css"></head><body><div class"…

Jpg图片变gif怎么操作?1分钟教你在线生成

jpg是一种常见的图像文件格式&#xff0c;它使用有损压缩算法来减小文件大小。这意味着JPG图像可以在保持较高质量的同时减小文件大小&#xff0c;但会导致一些细节的损失。JPG图像适用于存储照片和其他需要高质量图像的场景。而GIF是一种支持动画的图像文件格式。与JPG不同&am…

【类脑智能】脑网络通信模型分类及量化指标(附思维导图)

脑网络通信模型分类及量化指标(附思维导图) 参考论文&#xff1a;Brain network communication_ concepts, models and applications 概念 脑网络通信模型是一种使用图论和网络科学概念来描述和量化大脑结构中信息传递的模型。这种模型可以帮助研究人员理解神经信号在大脑内…

管理类联考–复试–政治--二十大--记忆宫殿

文章目录 整体记忆宫殿门床头柜床书桌阳台 口诀记忆法 整体 记忆宫殿 要有逻辑的放到房间了 何为逻辑&#xff0c;如下大佬总结的便是&#xff0c;或者可自行总结&#xff0c;有前后顺序&#xff0c;做事逻辑即可 第一步&#xff1a;将逻辑的点放到房间里的点&#xff0c;…

CASA模型在陆地生态系统碳循环研究中的应用探讨

植被&#xff0c;作为陆地生态系统的重要基石&#xff0c;对维护生态环境功能具有不可替代的作用。其中&#xff0c;植被净初级生产力&#xff08;NPP&#xff09;是衡量植被生态系统健康与功能的关键指标。它反映了单位面积上绿色植被通过光合作用生产的有机质总量在扣除自养呼…

基于springboot实现房源出租信息系统项目【项目源码+论文说明】

基于springboot实现房源出租信息系统演示 摘要 近些年来在一线城市的房子需求量在逐步递增&#xff0c;其中租房子和出租房子的需求业务不断增加。那么租房对于我们一线二线城市来说是一个非常大&#xff0c;而且具有经济提升能力的业务场景。那么信息技术在此行业的加持早已是…