python 降维 聚类_比PCA降维更高级——(R/Python)t-SNE聚类算法实践指南
作者介紹:Saurabh.jaju2
Saurabh是一名數(shù)據(jù)科學(xué)家和軟件工程師,熟練分析各種數(shù)據(jù)集和開發(fā)智能應(yīng)用程序。他目前正在加州大學(xué)伯克利分校攻讀信息和數(shù)據(jù)科學(xué)碩士學(xué)位,熱衷于開發(fā)基于數(shù)據(jù)科學(xué)的智能資源管理系統(tǒng)。
介紹
許多數(shù)據(jù)科學(xué)家經(jīng)常面對的問題之一:假設(shè)有一個包含數(shù)百個特征(變量)的數(shù)據(jù)集,且對數(shù)據(jù)所屬的域沒有任何了解,需要對該數(shù)據(jù)集識別其隱藏狀態(tài)、探索并分析。本文將介紹一種非常強大的方法來解決該問題。
關(guān)于PCA
現(xiàn)實中大多數(shù)人會使用PCA進行降維和可視化,但為什么不選擇比PCA更先進的東西呢?關(guān)于PCA的介紹可以閱讀該文獻。本文講解比PCA(1933)更有效的算法t-SNE(2008)。
本文內(nèi)容
1 什么是t-SNE?
2 什么是降維?
3 t-SNE如何在維數(shù)降低算法空間中擬合
4 t-SNE算法的細節(jié)
5 t-SNE實際上是做什么?
6 用例
7 t-SNE與其他降維算法相比
8 示例實現(xiàn)
R語言
Python語言
數(shù)據(jù)科學(xué)家
機器學(xué)習(xí)駭客
數(shù)據(jù)科學(xué)愛好者
10 常見錯誤
1 什么是t-SNE
(t-SNE)t分布隨機鄰域嵌入是一種用于探索高維數(shù)據(jù)的非線性降維算法。它將多維數(shù)據(jù)映射到適合于人類觀察的兩個或多個維度。
2 什么是降維?
簡而言之,降維就是用2維或3維表示多維數(shù)據(jù)(彼此具有相關(guān)性的多個特征數(shù)據(jù))的技術(shù),利用降維算法,可以顯式地表現(xiàn)數(shù)據(jù)。
3 t-SNE如何在降維算法空間中擬合
常用的降維算法有:
1 PCA(線性)
2 t-SNE(非參數(shù)/非線性)
3 Sammon映射(非線性)
4 Isomap(非線性)
5 LLE(非線性)
6 CCA(非線性)
7 SNE(非線性)
8 MVU(非線性)
9 拉普拉斯特征圖(非線性)
只需要研究上述算法中的兩種——PCA和t-SNE。
PCA的局限性
PCA是一種線性算法,它不能解釋特征之間的復(fù)雜多項式關(guān)系。而t-SNE是基于在鄰域圖上隨機游走的概率分布來找到數(shù)據(jù)內(nèi)的結(jié)構(gòu)。
線性降維算法的一個主要問題是不相似的數(shù)據(jù)點放置在較低維度表示為相距甚遠。但為了在低維度用非線性流形表示高維數(shù)據(jù),相似數(shù)據(jù)點必須表示為非常靠近,這不是線性降維算法所能做的。
4 t-SNE算法的細節(jié)
4.1 算法
步驟1:
隨機鄰接嵌入(SNE)通過將數(shù)據(jù)點之間的高維歐幾里得距離轉(zhuǎn)換為表示相似性的條件概率而開始,數(shù)據(jù)點xi、xj之間的條件概率pj|i由下式給出:
其中σi是以數(shù)據(jù)點xi為中心的高斯方差。
步驟2:
對于高維數(shù)據(jù)點xi和xj的低維對應(yīng)點yi和yj而言,可以計算類似的條件概率qj|i
SNE試圖最小化條件概率的差異。
步驟3:
為了測量條件概率差的和最小值,SNE使用梯度下降法最小化KL距離。而SNE的代價函數(shù)關(guān)注于映射中數(shù)據(jù)的局部結(jié)構(gòu),優(yōu)化該函數(shù)是非常困難的,而t-SNE采用重尾分布,以減輕擁擠問題和SNE的優(yōu)化問題。
步驟4:
定義困惑度:
其中H(Pi)是香農(nóng)熵
4.2 時間和空間復(fù)雜性
算法計算對應(yīng)的是條件概率,并試圖最小化較高和較低維度的概率差之和,這涉及大量的計算,對系統(tǒng)資源要求高。t-SNE的復(fù)雜度隨著數(shù)據(jù)點數(shù)量有著時間和空間二次方。
5 t-SNE實際上是做什么?
t-SNE非線性降維算法通過基于具有多個特征的數(shù)據(jù)點的相似性識別觀察到的簇來在數(shù)據(jù)中找到模式。本質(zhì)上是一種降維和可視化技術(shù)。另外t-SNE的輸出可以作為其他分類算法的輸入特征。
6用例
t-SNE幾乎可用于所有高維數(shù)據(jù)集,廣泛應(yīng)用于圖像處理,自然語言處理,基因組數(shù)據(jù)和語音處理。實例有:面部表情識別[2]、識別腫瘤亞群[3]、使用wordvec進行文本比較[4]等。
7?t-SNE與其他降維算法相比
基于所實現(xiàn)的精度,將t-SNE與PCA和其他線性降維模型相比,結(jié)果表明t-SNE能夠提供更好的結(jié)果。這是因為算法定義了數(shù)據(jù)的局部和全局結(jié)構(gòu)之間的軟邊界。
8示例實現(xiàn)
在MNIST手寫數(shù)字數(shù)據(jù)庫上實現(xiàn)t-SNE算法。
“Rtsne”包在R中具有t-SNE的實現(xiàn)。“Rtsne”包可以使用在R控制臺中鍵入的以下命令安裝在R中:
超參數(shù)調(diào)整
代碼
MNIST數(shù)據(jù)可從MNIST網(wǎng)站下載,并可轉(zhuǎn)換為具有少量代碼的csv文件。
## calling the installed package
train
library(Rtsne)
## Curating the database for analysis with both t‐SNE and PCA
Labels
train$label
## for plotting
colors = rainbow(length(unique(train$label)))
names(colors) = unique(train$label)
## Executing the algorithm on curated data
tsne
exeTimeTsne
0))
## Plotting
plot(tsne$Y, t='n', main="tsne")
text(tsne$Y, labels=train$label, col=colors[train$label])
實現(xiàn)時間
可以看出,與PCA相比,t-SNE在相同樣本大小的數(shù)據(jù)上執(zhí)行需要相當(dāng)長的時間。
解釋結(jié)果
以下圖用于探索性分析。輸出x和y坐標(biāo)以及成本可以用作分類算法中的特征。
2 Python語言
t-SNE算法可以從sklearn包中訪問。
超參數(shù)調(diào)整
代碼
以下代碼來自sklearn網(wǎng)站上的sklearn示例。
代碼1
實現(xiàn)時間
## importing the required packages
from time import time
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import offsetbox
from sklearn import (manifold, datasets, decomposition, ensemble,
discriminant_analysis, random_projection)
## Loading and curating the data
digits = datasets.load_digits(n_class=10)
X = digits.data
y = digits.target
n_samples, n_features = X.shape
n_neighbors = 30
## Function to Scale and visualize the embedding vectors
def plot_embedding(X, title=None):
x_min, x_max = np.min(X, 0), np.max(X, 0)
X = (X ‐ x_min) / (x_max ‐ x_min)
plt.figure()
ax = plt.subplot(111)
for i in range(X.shape[0]):
plt.text(X[i, 0], X[i, 1], str(digits.target[i]),
color=plt.cm.Set1(y[i] / 10.),
fontdict={'weight': 'bold', 'size': 9})
if hasattr(offsetbox, 'AnnotationBbox'):
## only print thumbnails with matplotlib > 1.0
shown_images = np.array([[1., 1.]]) # just something big
for i in range(digits.data.shape[0]):
dist = np.sum((X[i] ‐ shown_images) ** 2, 1)
if np.min(dist) < 4e‐3:
## don't show points that are too close
continue
shown_images = np.r_[shown_images, [X[i]]]
imagebox = offsetbox.AnnotationBbox(
offsetbox.OffsetImage(digits.images[i], cmap=plt.cm.gray_r),
X[i])
ax.add_artist(imagebox)
plt.xticks([]), plt.yticks([])
if title is not None:
plt.title(title)
#‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
## Plot images of the digits
n_img_per_row = 20
img = np.zeros((10 * n_img_per_row, 10 * n_img_per_row))
for i in range(n_img_per_row):
ix = 10 * i + 1
for j in range(n_img_per_row):
iy = 10 * j + 1
img[ix:ix + 8, iy:iy + 8] = X[i * n_img_per_row + j].reshape((8, 8))
plt.imshow(img, cmap=plt.cm.binary)
plt.xticks([])
plt.yticks([])
plt.title('A selection from the 64‐dimensional digits dataset')
## Computing PCA
print("Computing PCA projection")
t0 = time()
X_pca = decomposition.TruncatedSVD(n_components=2).fit_transform(X)
plot_embedding(X_pca,
"Principal Components projection of the digits (time %.2fs)" %
(time() ‐ t0))
## Computing t‐SNE
print("Computing t‐SNE embedding")
tsne = manifold.TSNE(n_components=2, init='pca', random_state=0)
t0 = time()
X_tsne = tsne.fit_transform(X)
plot_embedding(X_tsne,
"t‐SNE embedding of the digits (time %.2fs)" %
(time() ‐ t0))
plt.show()
9 應(yīng)用方面
9.1數(shù)據(jù)科學(xué)家
對于數(shù)據(jù)科學(xué)家來說,使用t-SNE的主要問題是算法的黑盒類型性質(zhì)。使用該算法的最佳方法是將其用于探索數(shù)據(jù)分析。
9.2機器學(xué)習(xí)駭客
將數(shù)據(jù)集縮減為2或3維,并使用非線性堆棧器將其堆疊。可以使用XGboost提高t-SNE向量以獲得更好的結(jié)果。
9.3數(shù)據(jù)科學(xué)愛好者
對于開始使用數(shù)據(jù)科學(xué)的數(shù)據(jù)科學(xué)愛好者來說,這種算法在研究和性能增強方面提供了最好的機會。針對各種NLP問題和圖像處理應(yīng)用方面實施t-SNE的研究是一個尚未開發(fā)的領(lǐng)域。
10常見錯誤
以下是在解釋t-SNE的結(jié)果時要避免的幾個常見錯誤:
1 為了使算法正確執(zhí)行,困惑度應(yīng)小于點的數(shù)量。一般設(shè)置為5-50。
2 具有相同超參數(shù)的不同運行可能產(chǎn)生不同的結(jié)果。
3 任何t-SNE圖中的簇大小不得用于標(biāo)準(zhǔn)偏差,色散或任何其他類似的評估。
4 簇之間的距離可以改變。一個茫然性不能優(yōu)化所有簇的距離。
5 可以在隨機噪聲中找到模式。
6 不同的困惑水平可以觀察到不同的簇形狀。
7 不能基于單個t-SNE圖進行分析拓撲,在進行任何評估之前必須觀察多個圖。
本文由北郵@愛可可-愛生活老師推薦,阿里云云棲社區(qū)組織翻譯。
文章原標(biāo)題《Comprehensive Guide on t-SNE algorithm with implementation in R & Python》,作者:Saurabh,譯者:海棠
文章為簡譯,更為詳細的內(nèi)容,請查看原文
總結(jié)
以上是生活随笔為你收集整理的python 降维 聚类_比PCA降维更高级——(R/Python)t-SNE聚类算法实践指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode笔记】剑指 Offer
- 下一篇: signature=c0b9be9cde