【Python代码】TSNE高维数据降维可视化工具 + python实现
1.概述
1.1 什么是TSNE
- TSNE是由T和SNE组成,T分布和随机近邻嵌入(Stochastic neighbor Embedding).
- TSNE是一种可视化工具,将高位数据降到2-3维,然后画成图。
- t-SNE是目前效果最好的数据降维和可视化方法
- t-SNE的缺点是:占用内存大,运行时间长。
1.2 TSNE原理
1.2.1入门的原理介绍
举一个例子,这是一个将二维数据降成一维的任务。我们要怎么实现?
首先,我们想到的最简单的方法就是舍弃一个维度的特征,将所有点映射到x轴上:
很明显,结果来看,蓝色和黄色的点交叠在一起,可是他们在二维上明明不属于一类
TSNE就是计算某一个点到其他所有点的距离,然后映射到t分布上,效果就会好一些。
1.2.2进阶的原理介绍
- t-SNE的降维关键:把高纬度的数据点之间的距离转化为高斯分布概率。
1.2.2.1 高维距离表示
- 如果两个点在高维空间距离越近,那么这个概率值越大。
- 我们来看下面公式,两个公式的内容一致,只是写法不同。
\]
这个形式的公式,只是明显的展示这是高斯分布概率
\]
\(||x_i-x_k||^2\)是两个点之间的距离;
距离越大,\(exp(-||x_i-x_k||^2/(2\sigma_i^2))\)越小;
距离越小,\(exp(-||x_i-x_k||^2/(2\sigma_i^2))\)越大;
分母是一个常数,对于一个固定的点\(x_i\);
- 这个算法的创新点:\(\sigma_i\)对于每一个\(x_i\)都是不同的,是由事先设定的困惑性影响,\(\sigma_i\)是自动设定的。
现在我们能得到\(p_{j|i}\),然后计算联合分布
\]
- 从上文中,我们用高斯分布概率来表示两个高维点之间的相似性,再次复述一次两个点越相似,\(p_{ij}\)越大
1.2.2.2 低维相似度表示
- 在低纬度中,我们使用t分布来表示相似性。这里不探究为什么使用t分布而不是其他分布,具体内容可以看论文
\]
\(y_i,y_j\)是低纬度的点
1.2.2.3 惩罚函数
- 现在我们有方法衡量高纬度和低纬度的点的相似性,我们如何保证高纬度相似度高的点在低纬度相似度也高?
- t-SNE使用的是KL散度(Kullback-Leibler divergence)
\]
1.2.2.4 为什么是局部相似性
- 当\(P_{ij}\)很大,\(Q_{ij}\)很小(高维空间距离近,低维空间距离远)的惩罚很大,但是高维空间距离远,低维空间距离近的惩罚小。
1.2.2.5 为什么选择高斯和t分布
- 降维必然带来信息损失,TSNE保留局部信息必然牺牲全局信息,而因为t分布比 高斯分布更加长尾,可以一定程度减少这种损失。
2 python实现
函数参数表:
- parameters 描述
- n_components 嵌入空间的维度
- perpexity 混乱度,表示t-SNE优化过程中考虑邻近点的多少,默认为30,建议取值在5到50之间
- early_exaggeration 表示嵌入空间簇间距的大小,默认为12,该值越大,可视化后的簇间距越大
- learning_rate 学习率,表示梯度下降的快慢,默认为200,建议取值在10到1000之间
- n_iter 迭代次数,默认为1000,自定义设置时应保证大于250
- min_grad_norm 如果梯度小于该值,则停止优化。默认为1e-7
- metric 表示向量间距离度量的方式,默认是欧氏距离。如果是precomputed,则输入X是计算好的距离矩阵。也可以是自定义的距离度量函数。
- init 初始化,默认为random。取值为random为随机初始化,取值为pca为利用PCA进行初始化(常用),取值为numpy数组时必须shape=(n_samples, n_components)
- verbose 是否打印优化信息,取值0或1,默认为0=>不打印信息。打印的信息为:近邻点数量、耗时、σ
、KL散度、误差等 - random_state 随机数种子,整数或RandomState对象
- method 两种优化方法:barnets_hut和exact。第一种耗时O(NlogN),第二种耗时O(N^2)但是误差小,同时第二种方法不能用于百万级样本
- angle 当method=barnets_hut时,该参数有用,用于均衡效率与误差,默认值为0.5,该值越大,效率越高&误差越大,否则反之。当该值在0.2-0.8之间时,无变化。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import manifold,datsets
'''X是特征,不包含target;X_tsne是已经降维之后的特征'''
tsne = manifold.TSNE(n_components=2, init='pca', random_state=501)
X_tsne = tsne.fit_transform(X)
print("Org data dimension is {}.
Embedded data dimension is {}".format(X.shape[-1], X_tsne.shape[-1]))
'''嵌入空间可视化'''
x_min, x_max = X_tsne.min(0), X_tsne.max(0)
X_norm = (X_tsne - x_min) / (x_max - x_min) # 归一化
plt.figure(figsize=(8, 8))
for i in range(X_norm.shape[0]):
plt.text(X_norm[i, 0], X_norm[i, 1], str(y[i]), color=plt.cm.Set1(y[i]),
fontdict={'weight': 'bold', 'size': 9})
plt.xticks([])
plt.yticks([])
plt.show()
参考内容
【Python代码】TSNE高维数据降维可视化工具 + python实现的更多相关文章
- 利用 t-SNE 高维数据的可视化
利用 t-SNE 高维数据的可视化 具体软件和教程见: http://lvdmaaten.github.io/tsne/ 简要介绍下用法: % Load data load ’mnist_trai ...
- 主成分分析PCA数据降维原理及python应用(葡萄酒案例分析)
目录 主成分分析(PCA)——以葡萄酒数据集分类为例 1.认识PCA (1)简介 (2)方法步骤 2.提取主成分 3.主成分方差可视化 4.特征变换 5.数据分类结果 6.完整代码 总结: 1.认识P ...
- 高维数据降维 国家自然科学基金项目 2009-2013 NSFC Dimensionality Reduction
2013 基于数据降维和压缩感知的图像哈希理论与方法 唐振军 广西师范大学 多元时间序列数据挖掘中的特征表示和相似性度量方法研究 李海林 华侨大学 基于标签和多特征融合的图像语义空间学习技 ...
- 毕设之Python爬取天气数据及可视化分析
写在前面的一些P话:(https://jq.qq.com/?_wv=1027&k=RFkfeU8j) 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向. ...
- 用TSNE进行数据降维并展示聚类结果
TSNE提供了一种有效的数据降维方式,让我们可以在2维或3维的空间中展示聚类结果. # -*- coding: utf-8 -*- from __future__ import unicode_lit ...
- 5 种使用 Python 代码轻松实现数据可视化的方法
数据可视化是数据科学家工作中的重要组成部分.在项目的早期阶段,你通常会进行探索性数据分析(Exploratory Data Analysis,EDA)以获取对数据的一些理解.创建可视化方法确实有助于使 ...
- [转]5 种使用 Python 代码轻松实现数据可视化的方法
数据可视化是数据科学家工作中的重要组成部分.在项目的早期阶段,你通常会进行探索性数据分析(Exploratory Data Analysis,EDA)以获取对数据的一些理解.创建可视化方法确实有助于使 ...
- 数据可视化:使用python代码实现可视数据随机漫步图
#2020/4/5 ,是开博的第一天,希望和大家相互交流学习,很开森,哈哈~ #像个傻子哟~ #好,我们进入正题, #实现功能:利用python实现数据随机漫步,漫步点数据可视化 #什么是 ...
- Python学习随笔(1)--可视化工具plotly使用
把数据库某列数据取出来,然后再在本地生成html文件形成可视化视图显示 #!/usr/bin/python# coding=utf-8 import pymysqlimport plotly.plot ...
随机推荐
- HTML H5响应式,表格,表单等
HTML杂项 响应式图片 <img srcset="elva-fairy-320w.jpg 320w, elva-fairy-480w.jpg 480w, elva-fairy-800 ...
- 动静结合?Ruby 和 Java 的基础语法比较(入门篇)
前言 这篇文章示例代码比较多, Java 程序员可以看到一些 Ruby 相关语法和使用,Ruby 程序员可以看看 Java 的基本语法和使用方法,本文比较长,将近万字左右,预计需要十几分钟,如果有耐心 ...
- 对 spring 中默认的 DataSource 创建进行覆盖
配置如下 /** * Primary:标识为主配置,将默认的配置覆盖掉 * ConfigurationProperties:设置配置来源 * * @return DataSource */ @Prim ...
- Android程序中Acticity间传递数据
在Android开发过程中,在不同的Acitivity之间传递数据的情况是非常常见的.我花费了一点时间来总结Acitivity之间的数据传递,记录下来. 1.简单传递键值对 这种传递方式非常简单,只需 ...
- KVM 一键批量创建虚拟机
目录 一.原理 二.基础镜像 2.1.创建基础镜像 2.2. 完善基础镜像 2.3.基础镜像设置权限 3.4 设置 title 3.5.基础镜像XML 三.批量创建机器脚本 四.挂载磁盘多种方式 4. ...
- Django入门4: ORM 数据库操作
大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...
- XmlSerializer .NET 序列化、反序列化
序列化对象 要序列化对象,首先创建要序列化的对象并设置其公共属性和字段.为此,您必须确定要将XML流存储的传输格式,作为流或文件. 例如,如果XML流必须以永久形式保存,则创建一个FileStre ...
- 图论--树的重心(DFS) 模板
const int maxn=500005; int tot=0,n; int ans,size; int sx[maxn],head[maxn]; int vis[maxn]; struct edg ...
- 图论--网络流--费用流--POJ 2156 Minimum Cost
Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his s ...
- 无向图双连通分量BCC(全网最好理解)
不是标题党,之前我也写过一篇比较全的,但是对于初学者不友好.传送门? 双连通分量(Biconnected component): 1.边双联通 E-BCC 2.点双连通 V-BCC 双 ...