python高维数据_t-SNE高维数据可视化(python)

t-SNE实践——sklearn教程

t-SNE是一种集降维与可视化于一体的技术,它是基于SNE可视化的改进,解决了SNE在可视化后样本分布拥挤、边界不明显的特点,是目前最好的降维可视化手段。

关于t-SNE的历史和原理详见从SNE到t-SNE再到LargeVis。

代码见下面例一

TSNE的参数

函数参数表:

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之间时,无变化。

返回对象的属性表:

Atrtributes描述

embedding_

嵌入后的向量

kl_divergence_

KL散度

n_iter_

迭代的轮数

t-distributed Stochastic Neighbor Embedding(t-SNE)

t-SNE可降样本点间的相似度关系转化为概率:在原空间(高维空间)中转化为基于高斯分布的概率;在嵌入空间(二维空间)中转化为基于t分布的概率。这使得t-SNE不仅可以关注局部(SNE只关注相邻点之间的相似度映射而忽略了全局之间的相似度映射,使得可视化后的边界不明显),还关注全局,使可视化效果更好(簇内不会过于集中,簇间边界明显)。

目标函数:原空间与嵌入空间样本分布之间的KL散度。

优化算法:梯度下降。

注意问题:KL散度作目标函数是非凸的,故可能需要多次初始化以防止陷入局部次优解。

t-SNE的缺点:

计算量大,耗时间是PCA的百倍,内存占用大。

专用于可视化,即嵌入空间只能是2维或3维。

需要尝试不同的初始化点,以防止局部次优解的影响。

t-SNE的优化

在优化t-SNE方面,有很多技巧。下面5个参数会影响t-SNE的可视化效果:

perplexity 混乱度。混乱度越高,t-SNE将考虑越多的邻近点,更关注全局。因此,对于大数据应该使用较高混乱度,较高混乱度也可以帮助t-SNE拜托噪声的影响。相对而言,该参数对可视化效果影响不大。

early exaggeration factor 该值表示你期望的簇间距大小,如果太大的话(大于实际簇的间距),将导致目标函数无法收敛。相对而言,该参数对可视化效果影响较小,默认就行。

learning rate 学习率。关键参数,根据具体问题调节。

maximum number of iterations 迭代次数。迭代次数不能太低,建议1000以上。

angle (not used in exact method) 角度。相对而言,该参数对效果影响不大。

代码

例一

import numpy as np

import matplotlib.pyplot as plt

from sklearn import manifold, datasets

digits = datasets.load_digits(n_class=6)

X, y = digits.data, digits.target

n_samples, n_features = X.shape

'''显示原始数据'''

n = 20 # 每行20个数字,每列20个数字

img = np.zeros((10 * n, 10 * n))

for i in range(n):

ix = 10 * i + 1

for j in range(n):

iy = 10 * j + 1

img[ix:ix + 8, iy:iy + 8] = X[i * n + j].reshape((8, 8))

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

plt.imshow(img, cmap=plt.cm.binary)

plt.xticks([])

plt.yticks([])

plt.show()

'''t-SNE'''

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()

t-SNE高维数据可视化(python)

t-SNE(t-distributedstochastic neighbor embedding )是目前最为流行的一种高维数据降维的算法。在大数据的时代,数据不仅越来越大,而且也变得越来越复杂,数据维度的转化也在惊人的增加,例如,一组图像的维度就是该图像的像素个数,其范围从数千到数百万。

对计算机而言,处理高维数据绝对没问题,但是人类能感知的确只有三个维度,因此很有必要将高维数据可视化的展现出来。那么如何将数据集从一个任意维度的降维到二维或三维呢。T-SNE就是一种数据降维的算法,其成立的前提是基于这样的假设:尽管现实世界中的许多数据集是嵌入在高维空间中,但是都具有很低的内在维度。也就是说高维数据经过降维后,在低维状态下更能显示出其本质特性。这就是流行学习的基本思想,也称为非线性降维。

下面就展示一下如何使用t-SNE算法可视化sklearn库中的手写字体数据集。

import numpy as np

import sklearn

from sklearn.manifold import TSNE

from sklearn.datasets import load_digits

# Random state.

RS = 20150101

import matplotlib.pyplot as plt

import matplotlib.patheffects as PathEffects

import matplotlib

# We import seaborn to make nice plots.

import seaborn as sns

sns.set_style('darkgrid')

sns.set_palette('muted')

sns.set_context("notebook", font_scale=1.5,

rc={"lines.linewidth": 2.5})

digits = load_digits()

# We first reorder the data points according to the handwritten numbers.

X = np.vstack([digits.data[digits.target==i]

for i in range(10)])

y = np.hstack([digits.target[digits.target==i]

for i in range(10)])

digits_proj = TSNE(random_state=RS).fit_transform(X)

def scatter(x, colors):

# We choose a color palette with seaborn.

palette = np.array(sns.color_palette("hls", 10))

# We create a scatter plot.

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

ax = plt.subplot(aspect='equal')

sc = ax.scatter(x[:,0], x[:,1], lw=0, s=40,

c=palette[colors.astype(np.int)])

plt.xlim(-25, 25)

plt.ylim(-25, 25)

ax.axis('off')

ax.axis('tight')

# We add the labels for each digit.

txts = []

for i in range(10):

# Position of each label.

xtext, ytext = np.median(x[colors == i, :], axis=0)

txt = ax.text(xtext, ytext, str(i), fontsize=24)

txt.set_path_effects([

PathEffects.Stroke(linewidth=5, foreground="w"),

PathEffects.Normal()])

txts.append(txt)

return f, ax, sc, txts

scatter(digits_proj, y)

plt.savefig('digits_tsne-generated.png', dpi=120)

plt.show()

可视化结果如下:

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

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

相关文章

java数学计算表达式_Java初学者:内建函数计算简单的数学表达式

这个应该在之前写的,忘记了,补上这次我们说一下如何用java计算数学表达式的值,比如,我们要计算sin(pi/3) cos(pi/6) 5.6^3,怎么计算呢?这里我们需要用到java的math的内建函数,所谓内建函数&am…

你是怎样的程序员?

一、程序员A 一个善于总结、能举一反三,敢于承担责任,敢于挑战自我,拥抱新技术的程序员,他的年龄意味着丰富经验,意味着效率。 他能指出并带人绕过一个一个技术大坑,笑看风云而不掉进去; 他能指…

谷歌新作gVisor:VM容器融合技术已经到来

作者|秦承刚,吴启翾,喻望,杨伟 编辑|张婵 出处丨高效开发运维 5 月 2 日,谷歌发布了一款新型的沙箱容器运行时 gVisor,号称能够为容器提供更安全的隔离,同时比 VM 更轻量。容器基于共…

安卓androidstudio访问本地接口_安卓开发之数据存储在本地的四种方式

​安卓开发之数据存储在本地的四种方式本地数据存储,在安卓开发过程中是不可避免的一个话题。这些本地的数据可能是用户的设置,程序的设置,用户的数据图片, 也可能是网络传输的一些缓冲数据。基本上我们有4种方法可以存储安卓程序的数据。第1…

java vector 线程安全_关于Vector到底是不是 线程安全的 问题

线程安全,在java的多并发编程中是重要概念,意思是,多个线程同时操作一个对象,在各种不同情况下,都不会造成不同的后果。一个经典问题,Vector到底是不是线程安全的?很多人都会回答,是…

TypeScript 2 : 获取当前日期及前后范围日期【Array】

原文链接:http://blog.csdn.net/crper/article/details/55194334 --------------------------------------------------- 前言 今天有个接口字段需求,要写一个今天及前几天的日期传过去; 在网上找了下都木有什么比较好的方案;就…

C# Winform使用Windows Media Player播放多媒体整理

一、简单使用示例步骤 1.添加Windows Media Player 组件当前是系统的 Com组件 工具箱》右键“选择项”》选择Com组件 2.控件拖拽到桌面,使用 private void button1_Click(object sender, EventArgs e) {//播放开始声音axWindowsMediaPlayer2.URL "start.mp3&q…

快学Scala习题解答—第一章 基础

原文链接:http://blog.csdn.net/ivan_pig/article/details/8249768 --------------------------------------------------------- 1 简介 近期对Scala比较感兴趣,买了本《快学scala》,感觉不错。比《Programming Scala:Tackle Multi-Core Complexity on…

java swing rectangle_Java SwingUtilities.convertRectangle方法代碼示例

本文整理匯總了Java中javax.swing.SwingUtilities.convertRectangle方法的典型用法代碼示例。如果您正苦於以下問題:Java SwingUtilities.convertRectangle方法的具體用法?Java SwingUtilities.convertRectangle怎麽用?Java SwingUtilities.c…

python 查询包_查找Python包的依赖包(语句)

Window 10家庭中文版,Python 3.6.4,今天看完了urllib3的官文(官方文档),因为没有具体使用过,所以,仍然是一知半解,但是,突然想知道 urllib3以及前面学习过的requests模块都依赖了什么其它模块。…

618选购手机正当时,好评率高达99%的手机了解一下!

一年一度的京东618年中购物狂欢节如火如荼的进行中,手机厂商们都使出了浑身解数,对消费者进行争夺。对于用户来说,618绝对是更换手机的好时机。不过,小伙伴们面对市场上的众多机型,也有可能挑花了眼,不知道…

IntelliJ IDEA 2017.2 x64 安装Scala

从官网下载好IntelliJ IDEA 和scala IntelliJ IDEA 安装scala插件 新建scala项目 建好后,发现src右键--新建---没有 .scala选项 解决方法

Django-ORM数据库操作

背景 Django框架功能齐全自带数据库操作功能,由于工作中设计巨量的api接口,需要一个很好的web后端服务框架,Django给了莫大的帮助。本文主要介绍Django的ORM框架我们一般对数据库的使用的认识是: 创建数据库,设计表结构…

python查询缺失值所在位置_Python Pandas找到缺失值的位置方法

问题描述:python pandas判断缺失值一般采用 isnull(),然而生成的却是所有数据的true/false矩阵,对于庞大的数据dataframe,很难一眼看出来哪个数据缺失,一共有多少个缺失数据,缺失数据的位置。首…

快学Scala习题解答—第二章 控制结构和函数

原文地址:http://blog.csdn.net/ivan_pig/article/details/8253068 ---------------------------------------------------------------------------------- 3 控制结构和函数 3.1 一个数字如果为正数,则它的signum为1;如果是负数,则signum为-1;如果为0…

java barrier_Java - Latch和Barrier的区别

之所以把Latch与Barrier放在一起比较是因为他们给人一种相似的感觉。他们都是阻塞一些行为直至某个事件发生,但Latch是等待某个事件发生,而Barrier是等待线程。先比较一下JCIP中对二者的描述:LatchA latch is a synchronizer that can delay …

Kingback小组冲刺博客

一、6月13日 1、今日完成的任务 李可欣 项目首页的框架设计 项目首页的导航栏部分 对于项目的配色进行了改进,并且设计了logo 杨帆 今天进行了数据库的设计,完成了数据库的增删改查,并建立了两个jsp页面,还学习了一些数据库设计的…

用python前端html后端django_浅谈Django前端后端值传递问题

前端后端传值问题总结前端传给后端通过表单传值1、通过表单get请求传值在前端当通过get的方式传值时,表单中的标签的name值将会被当做action的地址的参数此时,在后端可以通过get请求相应的name值拿到对应的value值例子:html中:{% csrf_token %}类别{% fo…

使用Git上传本地项目到oschina

原文地址:https://my.oschina.net/158/blog/530112 --------------------------------------------- 1.首先看一下自己是否有公钥, 在 我的资料-->SSH公钥 查看,如果没有,添加自己的SSH 公钥: SSH key 可以让你在…

手动创建git忽略push清单,node_module以及自身

1.文件夹内右键git bash,输 touch .gitignore,注意中间有空格 2.编辑器打开生成的 .gitignore 文件,加入 .gitignore node_modules12 3.保存 4.以后再push到仓库的就会过滤这俩了,想加啥自己加