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.pswp.cn/news/538484.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538484.shtml
英文地址,請注明出處:http://en.pswp.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到倉庫的就會過濾這倆了,想加啥自己加