声明:

manifold:可以称之为流形数据。像绳结一样的数据,虽然在高维空间中可分,但是在人眼所看到的低维空间中,绳结中的绳子是互相重叠的不可分的。

对数据降维比较熟悉的朋友可以看这篇博客t-SNE实践——sklearn教程

数据降维与可视化——t-SNE

t-SNE是目前来说效果最好的数据降维与可视化方法,但是它的缺点也很明显,比如:占内存大,运行时间长。但是,当我们想要对高维数据进行分类,又不清楚这个数据集有没有很好的可分性(即同类之间间隔小,异类之间间隔大),可以通过t-SNE投影到2维或者3维的空间中观察一下。如果在低维空间中具有可分性,则数据是可分的;如果在高维空间中不具有可分性,可能是数据不可分,也可能仅仅是因为不能投影到低维空间。

下面会简单介绍t-SNE的原理,参数和实例。

t-distributed Stochastic Neighbor Embedding(t-SNE)

t-SNE(TSNE)将数据点之间的相似度转换为概率。原始空间中的相似度由高斯联合概率表示,嵌入空间的相似度由“学生t分布”表示。

虽然Isomap,LLE和variants等数据降维和可视化方法,更适合展开单个连续的低维的manifold。但如果要准确的可视化样本间的相似度关系,如对于下图所示的S曲线(不同颜色的图像表示不同类别的数据),t-SNE表现更好。因为t-SNE主要是关注数据的局部结构。

通过原始空间和嵌入空间的联合概率的Kullback-Leibler(KL)散度来评估可视化效果的好坏,也就是说用有关KL散度的函数作为loss函数,然后通过梯度下降最小化loss函数,最终获得收敛结果。注意,该loss不是凸函数,即具有不同初始值的多次运行将收敛于KL散度函数的局部最小值中,以致获得不同的结果。因此,尝试不同的随机数种子(Python中可以通过设置seed来获得不同的随机分布)有时候是有用的,并选择具有最低KL散度值的结果。

使用t-SNE的缺点大概是:

t-SNE的计算复杂度很高,在数百万个样本数据集中可能需要几个小时,而PCA可以在几秒钟或几分钟内完成

Barnes-Hut t-SNE方法(下面讲)限于二维或三维嵌入。

算法是随机的,具有不同种子的多次实验可以产生不同的结果。虽然选择loss最小的结果就行,但可能需要多次实验以选择超参数。

全局结构未明确保留。这个问题可以通过PCA初始化点(使用init ='pca')来缓解。

优化 t-SNE

t-SNE的主要目的是高维数据的可视化。因此,当数据嵌入二维或三维时,效果最好。有时候优化KL散度可能有点棘手。有五个参数可以控制t-SNE的优化,即会影响最后的可视化质量:

perplexity困惑度

early exaggeration factor前期放大系数

learning rate学习率

maximum number of iterations最大迭代次数

angle角度

Barnes-Hut t-SNE

Barnes-Hut t-SNE主要是对传统t-SNE在速度上做了优化,是现在最流行的t-SNE方法,同时它与传统t-SNE还有一些不同:

Barnes-Hut仅在目标维度为3或更小时才起作用。以2D可视化为主。

Barnes-Hut仅适用于密集的输入数据。稀疏数据矩阵只能用特定的方法嵌入,或者可以通过投影近似,例如使用sklearn.decomposition.TruncatedSVD

Barnes-Hut是一个近似值。使用angle参数对近似进行控制,因此当参数method="exact"时,TSNE()使用传统方法,此时angle参数不能使用。

Barnes-Hut可以处理更多的数据。 Barnes-Hut可用于嵌入数十万个数据点。

为了可视化的目的(这是t-SNE的主要用处),强烈建议使用Barnes-Hut方法。method="exact"时,传统的t-SNE方法尽管可以达到该算法的理论极限,效果更好,但受制于计算约束,只能对小数据集的可视化。

对于MNIST来说,t-SNE可视化后可以自然的将字符按标签分开,见本文最后的例程;而PCA降维可视化后的手写字符,不同类别之间会重叠在一起,这也证明了t-SNE的非线性特性的强大之处。值得注意的是:未能在2D中用t-SNE显现良好分离的均匀标记的组不一定意味着数据不能被监督模型正确分类,还可能是因为2维不足以准确地表示数据的内部结构。

注意事项

数据集在所有特征维度上的尺度应该相同

参数说明

parameters

description

n_components

int, 默认为2,嵌入空间的维度(嵌入空间的意思就是结果空间)

perplexity

float, 默认为30,数据集越大,需要参数值越大,建议值位5-50

early_exaggeration

float, 默认为12.0,控制原始空间中的自然集群在嵌入式空间中的紧密程度以及它们之间的空间。 对于较大的值,嵌入式空间中自然群集之间的空间将更大。 再次,这个参数的选择不是很关键。 如果在初始优化期间成本函数增加,则可能是该参数值过高。

learning_rate

float, default:200.0, 学习率,建议取值为10.0-1000.0

n_iter

int, default:1000, 最大迭代次数

n_iter_without_progress

int, default:300, 另一种形式的最大迭代次数,必须是50的倍数

min_grad_norm

float, default:1e-7, 如果梯度低于该值,则停止算法

metric

string or callable, 精确度的计量方式

init

string or numpy array, default:”random”, 可以是’random’, ‘pca’或者一个numpy数组(shape=(n_samples, n_components)。

verbose

int, default:0, 训练过程是否可视

random_state

int, RandomState instance or None, default:None,控制随机数的生成

method

string, default:’barnes_hut’, 对于大数据集用默认值,对于小数据集用’exact’

angle

float, default:0.5, 只有method='barnes_hut'时可用

attributes

description

embedding_

嵌入向量

kl_divergence

最后的KL散度

n_iter_

迭代的次数

Methods

description

fit

将X投影到一个嵌入空间

fit_transform

将X投影到一个嵌入空间并返回转换结果

get_params

获取t-SNE的参数

set_params

设置t-SNE的参数

实例

Hello World

一个简单的例子,输入4个3维的数据,然后通过t-SNE降维称2维的数据。

import numpy as np

from sklearn.manifold import TSNE

X = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])

tsne = TSNE(n_components=2)

tsne.fit_transform(X)

print(tsne.embedding_)

'''输出

[[ 3.17274952 -186.43092346]

[ 43.70787048 -283.6920166 ]

[ 100.43157196 -145.89025879]

[ 140.96669006 -243.15138245]]'

S曲线的降维与可视化

S曲线上的数据是高维的数据,其中不同颜色表示数据的不同类别。当我们通过t-SNE嵌入到二维空间中后,可以看到数据点之间的类别信息完美的保留了下来

# coding='utf-8'

"""# 一个对S曲线数据集上进行各种降维的说明。"""

from time import time

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

from matplotlib.ticker import NullFormatter

from sklearn import manifold, datasets

# # Next line to silence pyflakes. This import is needed.

# Axes3D

n_points = 1000

# X是一个(1000, 3)的2维数据,color是一个(1000,)的1维数据

X, color = datasets.samples_generator.make_s_curve(n_points, random_state=0)

n_neighbors = 10

n_components = 2

fig = plt.figure(figsize=(8, 8))

# 创建了一个figure,标题为"Manifold Learning with 1000 points, 10 neighbors"

plt.suptitle("Manifold Learning with %i points, %i neighbors"

% (1000, n_neighbors), fontsize=14)

'''绘制S曲线的3D图像'''

ax = fig.add_subplot(211, projection='3d')

ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=color, cmap=plt.cm.Spectral)

ax.view_init(4, -72) # 初始化视角

'''t-SNE'''

t0 = time()

tsne = manifold.TSNE(n_components=n_components, init='pca', random_state=0)

Y = tsne.fit_transform(X) # 转换后的输出

t1 = time()

print("t-SNE: %.2g sec" % (t1 - t0)) # 算法用时

ax = fig.add_subplot(2, 1, 2)

plt.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Spectral)

plt.title("t-SNE (%.2g sec)" % (t1 - t0))

ax.xaxis.set_major_formatter(NullFormatter()) # 设置标签显示格式为空

ax.yaxis.set_major_formatter(NullFormatter())

# plt.axis('tight')

plt.show()

手写数字的降维可视化

这里的手写数字数据集是一堆8*8的数组,每一个数组都代表着一个手写数字。如下图所示。

# coding='utf-8'

"""t-SNE对手写数字进行可视化"""

from time import time

import numpy as np

import matplotlib.pyplot as plt

from sklearn import datasets

from sklearn.manifold import TSNE

def get_data():

digits = datasets.load_digits(n_class=6)

data = digits.data

label = digits.target

n_samples, n_features = data.shape

return data, label, n_samples, n_features

def plot_embedding(data, label, title):

x_min, x_max = np.min(data, 0), np.max(data, 0)

data = (data - x_min) / (x_max - x_min)

fig = plt.figure()

ax = plt.subplot(111)

for i in range(data.shape[0]):

plt.text(data[i, 0], data[i, 1], str(label[i]),

color=plt.cm.Set1(label[i] / 10.),

fontdict={'weight': 'bold', 'size': 9})

plt.xticks([])

plt.yticks([])

plt.title(title)

return fig

def main():

data, label, n_samples, n_features = get_data()

print('Computing t-SNE embedding')

tsne = TSNE(n_components=2, init='pca', random_state=0)

t0 = time()

result = tsne.fit_transform(data)

fig = plot_embedding(result, label,

't-SNE embedding of the digits (time %.2fs)'

% (time() - t0))

plt.show(fig)

if __name__ == '__main__':

main()

结果如下所示

tsne python_sklearn中tsne可视化相关推荐

  1. R语言使用Rtsne包进行TSNE分析:提取TSNE分析结果合并到原dataframe中、可视化tsne降维的结果、并圈定降维后不匹配的数据簇(tSNE identifying mismatch)

    R语言使用Rtsne包进行TSNE分析:提取TSNE分析结果合并到原dataframe中.可视化tsne降维的结果.并使用两个分类变量从颜色.形状两个角度来可视化tsne降维的效果.并圈定降维后不匹配 ...

  2. R使用tsne进行高维数据可视化实战:二维可视化、三维可视化

    R使用tsne进行高维数据可视化实战:二维可视化.三维可视化 t-SNE是一种非常强大的技术,可以用于多维数据中的可视化分析(寻找模式).它对复杂多维数据的可视化能力是显而易见的,它以无监督的方式对数 ...

  3. TSNE高维数据降维可视化工具 + python实现

    文章目录 1.概述 1.1 什么是TSNE 1.2 TSNE原理 1.2.1入门的原理介绍 1.2.2进阶的原理介绍 1.2.2.1 高维距离表示 1.2.2.2 低维相似度表示 1.2.2.3 惩罚 ...

  4. 【机器学习】关于t-sne:降维、可视化

    关于t-sne:降维.可视化 机器学习中,我们的使用的数据基本都是高维的,所以我们很难直接从数据中观察分布和特征.因此出现了很多数据降维的手段帮助我们提取特征和可视化数据.这就是流行学习方法(Mani ...

  5. TSNE实现降维及可视化

    目录 前言 降维 可视化 举例: 前言 最近在看迁移学习需要观察迁移效果,需要把特征可视化来查看分布情况,所以需要用到降维可视化这个工具,所以在这里记录一下. 方法挺简单的,阅读本文大概5分钟. 降维 ...

  6. Python使用tsne进行高维数据可视化实战:二维可视化、三维可视化

    Python使用tsne进行高维数据可视化实战:二维可视化.三维可视化 # 绘制二维可视化图像并添加标签字符函数 def plot_embedding(data, label, title):x_mi ...

  7. PCA图像数据降维及重构误差分析实战并使用TSNE进行异常数据可视化分析

    PCA图像数据降维及重构误差分析实战并使用TSNE进行异常数据可视化分析 目录 PCA图像数据降维及重构误差分析实战并使用TSNE进行异常数据可视化分析</

  8. matlab利用t-SNE实现高维数据可视化(tsne函数用法实例)

    tsne用法 tsne - t-Distributed Stochastic Neighbor Embedding This MATLAB function returns a matrix of t ...

  9. python语言实现lassocv中的可视化显示_Python可视化神器Yellowbrick使用

    码农那点事儿 关注我们,一起学习进步 作者:Together_CZ 链接:https://blog.csdn.net/Together_CZ/article/details/86640784 在机器学 ...

最新文章

  1. 一道有意思的css面试题,9宫格
  2. (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第二、三节:数据定义
  3. for、foreach、stream 哪家的效率更高,你真的用对了吗?
  4. Storyboard和Xib混用黑魔法-swift版
  5. 内存延时cl_内存延迟和内存时序有什么关系?内存速率和时钟周期| Crucial(英睿达)...
  6. 怎么样才能彻底消灭猫瘟病毒?
  7. 手风琴效果案例(jQuery)
  8. python决策树实例_机器学习中的决策树及python实例
  9. tensorflow学习:定义变量
  10. 计算机msvcr110.dll,msvcr110.dll
  11. Apache虚拟主机相关配置
  12. 推荐几款好用的企业级文档管理软件
  13. 地方门户网站SEO 重点做长尾词
  14. 99%的人都想要的广告拦截软件
  15. T1加权像(T1 weighted image,T1WI)
  16. 问题,缺陷,任务管理系统 Cynthia
  17. php 根据银行卡号获取所属银行
  18. 2022-2028年中国电磁兼容产品行业市场发展前景及投资风险评估报告
  19. BI大数据的星形模型和雪花模型
  20. Ansible、Ansible Tower 下载安装

热门文章

  1. 今天4.22手机服务器维护吗,2015年4月22日维护公告
  2. 2021.10.28打卡
  3. 从0到1:腾讯Yoo视频底层页推荐系统实践
  4. 密码锁 java接口_Java实现 蓝桥杯VIP 算法提高 密码锁
  5. 编写java判断闰年_用Java程序判断是否是闰年的简单实例
  6. (java毕业设计)基于java新闻发布管理系统源码
  7. IntPtr 转 string
  8. 重庆11中学校计算机比赛,重庆大学第十七届“树声前锋杯”程序设计大赛成功举办...
  9. JQuery选择器通过click事件获取当前点击对象的id,name,value属性
  10. 【Qt】撤销/恢复的快捷键