1. 程式人生 > >[機器學習]t-SNE聚類演算法實踐指南

[機器學習]t-SNE聚類演算法實踐指南

Saurabh是一名資料科學家和軟體工程師,熟練分析各種資料集和開發智慧應用程式。他目前正在加州大學伯克利分校攻讀資訊和資料科學碩士學位,熱衷於開發基於資料科學的智慧資源管理系統。

介紹

許多資料科學家經常面對的問題之一:假設有一個包含數百個特徵(變數)的資料集,對資料所屬的域沒有任何瞭解,需要對該資料集識別隱藏狀態、探索並分析。本文將介紹一種非常強大的方法來解決該問題。

關於PCA

現實中大多數人會使用PCA進行降維和視覺化,但為什麼不選擇比PCA更先進的東西呢?關於PCA的介紹可以閱讀該文獻。本文講解比PCA(1933)更有效的演算法t-SNE(2008)。

本文內容

1 什麼是t-SNE?

2 什麼是降維?

3 t-SNE如何在維數降低演算法空間中擬合

4 t-SNE演算法的細節

5 t-SNE實際上是做什麼?

6 用例

7 t-SNE與其他降維演算法相比

8 示例實現

        R語言

         Python語言

9應用方面

   資料科學家

   機器學習駭客

   資料科學愛好者

10 常見錯誤

1 什麼是t-SNE

 (t-SNE)t分佈隨機鄰域嵌入 是一種用於探索高維資料的非線性降維演算法。它將多維資料對映到適合於人類觀察的兩個或多個維度。

46439e36cf281fdeb199dcb16c2b723b9a08194b

2 什麼是降維?

簡而言之,降維就是用2維或3維表示多維資料(彼此具有相關性的多個特徵資料)的技術利用降維演算法,可以顯式地表現資料。

3 t-SNE如何在降維演算法空間中擬合

常用的降維演算法有:

1 PCA(線性)

2 t-SNE(非引數/非線性)

3 Sammon對映(非線性)

4 Isomap(非線性)

5 LLE(非線性)

6 CCA(非線性)

7 SNE(非線性)

8 MVU(非線性)

9 拉普拉斯特徵圖(非線性)

   只需要研究上述演算法中的兩種——PCA和t-SNE。

PCA的侷限性

PCA是一種線性演算法,它不能解釋特徵之間的複雜多項式關係。而t-SNE是基於在鄰域圖上隨機遊走的概率分佈來找到資料內的結構。

線性降維演算法的一個主要問題是不相似的資料點放置在較低維度表示為相距甚遠。但為了在低維度非線性流形表示高維資料,相似資料點必須表示為非常靠近,這不是線性降維演算法所

做的。

4 t-SNE演算法的細節

 4.1 演算法

步驟1:

隨機鄰接嵌入(SNE)通過將資料點之間的高維歐幾里得距離轉換為表示相似性的條件概率而開始,資料點xixj之間的條件概率pj|i由下式給出:

7865f9e80ece98a016f0e310ea8fa8e14c3a9db9

其中σi是以資料點xi為中心的高斯方差。

步驟2:

  對於高維資料點xixj的低維對應點yiyj而言,可以計算類似的條件概率qj|i

      def3073e7fff9a1f12327ef0914efb8a889da3b7

SNE試圖最小化條件概率的差異。

 步驟3:

    為了測量條件概率差的和最小值,SNE使用梯度下降法最小化KL距離。而SNE的代價函式關注於對映中資料的區域性結構,優化該函式是非常困難的,而t-SNE採用重尾分佈,以減輕擁擠問題和SNE的優化問題。

 步驟4:

   定義困惑度:

51f1f11d693d4b520d5d74182ccb79e9dd39a8a1

其中H(Pi)是夏農熵

    160b3cbd31d9015af253dc1ee1d260d27f47d363

4.2 時間和空間複雜性

演算法計算對應的是條件概率,並試圖最小化較高和較低維度的概率差之和,這涉及大量的計算,對系統資源要求高。t-SNE的複雜度隨著資料點數量有著時間和空間二次方。

5 t-SNE實際上是做什麼?

t-SNE非線性降維演算法通過基於具有多個特徵的資料點的相似性識別觀察到的簇來在資料中找到模式。本質上是一種降維和視覺化技術。另外t-SNE的輸出可以作為其他分類演算法的輸入特徵。

6用例

 t-SNE幾乎可用於所有高維資料集,廣泛應用於影象處理,自然語言處理,基因組資料和語音處理。例項有:面部表情識別[2]、識別腫瘤亞群[3]、使用wordvec進行文字比較[4]等。

7 t-SNE與其他降維演算法相比

  基於所實現的精度將t-SNE與PCA和其他線性降維模型相比,結果表明t-SNE能夠提供更好的結果。這是因為演算法定義了資料的區域性和全域性結構之間的軟邊界。

8示例實現

  在MNIST手寫數字資料庫上實現t-SNE演算法。

 1 R語言

  “Rtsne”包在R中具有t-SNE的實現。“Rtsne”包可以使用在R控制檯中鍵入的以下命令安裝在R中:

    超引數調整

725ecc927935b13a2f9859a69c0e36cb9139577c

 程式碼

  MNIST資料可從MNIST網站下載,並可轉換為具有少量程式碼的csv檔案。

## calling the installed package
train<‐ read.csv(file.choose()) ## Choose the train.csv file downloaded from the link above
library(Rtsne)
## Curating the database for analysis with both t‐SNE and PCA
Labels<‐train$label
train$label<‐as.factor(train$label)
## for plotting
colors = rainbow(length(unique(train$label)))
names(colors) = unique(train$label)
## Executing the algorithm on curated data
tsne <‐ Rtsne(train[,‐1], dims = 2, perplexity=30, verbose=TRUE, max_iter = 500)
exeTimeTsne<‐ system.time(Rtsne(train[,‐1], dims = 2, perplexity=30, verbose=TRUE, max_iter = 50
0))
## Plotting
plot(tsne$Y, t='n', main="tsne")
text(tsne$Y, labels=train$label, col=colors[train$label])

 實現時間

  6242f88cd410239964ad1bdc3fe8564fc39f0bcd

可以看出,與PCA相比,t-SNE在相同樣本大小的資料上執行需要相當長的時間。

 解釋結果

  以下圖用於探索性分析。輸出x和y座標以及成本可以用作分類演算法中的特徵。

f7adb3c74a84ba93145761d39e280574950e5a02

d0414d3247882ae47781c11549cdfc629bec7f89

2 Python語言

   t-SNE演算法可以從sklearn包中訪問。

超引數調整

  fce0dc4f4df4e8c9f523dfb0bc3b9e78ed621054

程式碼

    以下程式碼來自sklearn網站上的sklearn示例。

 程式碼1

實現時間

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

116a56b7db93ebc18b3c34f0003e0a1f6bf1f5a9

468bdfdb8d8163443c8a338717b2519cccb27d72

9 應用方面

9.1資料科學家

對於資料科學家來說,使用t-SNE的主要問題是演算法的黑盒型別性質。使用該演算法的最佳方法是將其用於探索資料分析。

9.2機器學習駭客

將資料集縮減為2或3維,並使用非線性堆疊器將其堆疊。可以使用XGboost提高t-SNE向量以獲得更好的結果。

9.3資料科學愛好者

對於開始使用資料科學的資料科學愛好者來說,這種演算法在研究和效能增強方面提供了最好的機會。針對各種NLP問題和影象處理應用方面實施t-SNE的研究是一個尚未開發的領域。

10常見錯誤

以下是在解釋t-SNE的結果時要避免的幾個常見錯誤:

1 為了使演算法正確執行,困惑度應小於點的數量。一般設定為5-50。

2 具有相同超引數的不同執行可能產生不同的結果。

3 任何t-SNE圖中的簇大小不得用於標準偏差,色散或任何其他類似的評估。

4 簇之間的距離可以改變。一個茫然性不能優化所有簇的距離。

5 可以在隨機噪聲中找到模式。

6 不同的困惑水平可以觀察到不同的簇形狀。

7 不能基於單個t-SNE圖進行分析拓撲,在進行任何評估之前必須觀察多個圖。

文章原標題《Comprehensive Guide on t-SNE algorithm with implementation in R & Python》,作者:Saurabh,譯者:海棠

文章為簡譯,更為詳細的內容,請檢視原文

相關推薦

[機器學習]t-SNE演算法實踐指南

Saurabh是一名資料科學家和軟體工程師,熟練分析各種資料集和開發智慧應用程式。他目前正在加州大學伯克利分校攻讀資訊和資料科學碩士學位,熱衷於開發基於資料科學的智慧資源管理系統。 介紹 許多資料科學家經常面對的問題之一:假設有一個包含數百個特徵(變數)的資料集,且對資料所屬的域沒有任何瞭解,需要對該資

(R/Python)t-SNE演算法實踐指南

首發連結 : https://yq.aliyun.com/articles/70733 作者介紹:Saurabh.jaju2 Saurabh是一名資料科學家和軟體工程師,熟練分析各種資料集和開發智慧應用程式。他目前正在加州大學伯克利分校攻讀資訊和資料科學碩士學位,熱衷

機器學習 K-means 演算法 C++

筆記: 尚未解決的問題 :     1. 只支援二維,而不支援三維或更高,需要模板元     2. 尚未實現如何刪除極端點, 即預處理     3. 尚未視覺化 編譯環境 Ubuntu gcc 5.4 編譯選項  g++ -std=c++14 #include &l

機器學習sklearn19.0演算法——Kmeans演算法

一、關於聚類及相似度、距離的知識點 二、k-means演算法思想與流程 三、sklearn中對於kmeans演算法的引數 四、程式碼示例以及應用的知識點簡介 (1)make_blobs:聚類資料生成器 sklearn.datasets.m

機器學習sklearn19.0演算法——層次(AGNES/DIANA)、密度(DBSCAN/MDCA)、譜

一、層次聚類 BIRCH演算法詳細介紹以及sklearn中的應用如下面部落格連結: http://www.cnblogs.com/pinard/p/6179132.html http://www.cnblogs.com/pinard/p/62

機器學習之層次演算法

        層次聚類(Hierarchical Clustering)是對給定資料集在不同層次進行劃分,形成樹形的聚類結構,直到滿足某種停止條件為止。資料集的劃分可採用自底向上或自頂向下的劃分策略。1、凝聚的層次聚類演算法AGNES        AGNES(AGglom

Mahout機器學習平臺之演算法詳細剖析(含例項分析)

第一部分: 學習Mahout必須要知道的資料查詢技能: 學會查官方幫助文件: 解壓用於安裝檔案(mahout-distribution-0.6.tar.gz),找到如下位置,我將該檔案解壓到win7的G盤mahout資料夾下,路徑如下所示: G:\mahout\mahout

機器學習】常用演算法原型

1. 聚類簡介 在機器學習中,分為監督學習、無監督學習和半監督學習。前一篇部落格中提到的迴歸和分類都屬於監督學習,本文著重探討無監督學習中的聚類演算法。 博主之前看過一些資料,這兩天也翻閱了網上的各大部落格後,也想總結一下,寫一寫聚類相關的知識點,對

Spark機器學習之-實時演算法呼叫

Spark MLIB中的Kmenas聚類演算法,資料通過SparkStreaming 實時拉取kafka中的資料,並呼叫已經訓練好的聚類模型;根據讀取的資料實時的進行分類package com.demo.cn.streaming import org.apache.kafk

機器學習中的演算法演變及學習筆記

【說在前面】本人部落格新手一枚,象牙塔的老白,職業場的小白。以下內容僅為個人見解,歡迎批評指正,不喜勿噴![認真看圖][認真看圖] 【補充說明】聚類演算法可以作為獨立方法將資料聚成不同簇,也可以作為資料探勘任務(例如分類、關聯規則等)的預處理! 【補充說明】聚類演算法與分類演算法的主要區別在於訓練時的樣本有無

機器學習——K-均值(K-means)演算法

本文轉載自:https://www.cnblogs.com/ybjourney/p/4714870.html 一 K-均值聚類(K-means)概述 聚類 “類”指的是具有相似性的集合。聚類是指將資料集劃分為若干類,使得類內之間的資料最為相似,各類之間的資料相

周志華《機器學習》Ch9. :k-means演算法的python實現

理論 k-means方法是一種常用的聚類方法,其目標是最小化 其中是第i個簇的中心。直接優化上式有難度,故k-means演算法採用一種近似方法。 簡單來說,k-means演算法由兩個步驟迴圈組成: 1. 計算每個sample到各個簇中心的距離,將該sample的類

機器學習】---密度從初識到應用

max 一個 eight log div 指定 聚類 空間 mar 一.前述 密度聚類是一種能降噪的算法。 二.相關概念 先看些抽象的概念(官方定義): 1.:對象O的是與O為中心,為半徑的空間,參數,是用戶指定每個對象的領域半徑值。 2.MinPts(領域密度閥值):對象

Python機器學習——Agglomerative層次

條件 分享圖片 n-2 mov unique ber and 兩個 its 層次聚類(hierarchical clustering)可在不同層次上對數據集進行劃分,形成樹狀的聚類結構。AggregativeClustering是一種常用的層次聚類算法。 ??其原理是:最初

[吳恩達機器學習筆記]13K-means

沒有 rand 幫助 聯系 method ima 運用 重新 function 13.聚類 覺得有用的話,歡迎一起討論相互學習~Follow Me 13.1無監督學習簡介 從監督學習到無監督學習 在一個典型的監督學習中,我們有一個有標簽的訓練集,我們的目標是找到能夠區分正

機器學習實戰DBSCN

# !/usr/bin/python # -*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as plt import sklearn.datasets as ds import matplotlib.colors f

機器學習-*-K均值及程式碼實現

KMeans聚類 在聚類演算法中,最出名的應該就是k均值聚類(KMeans)了,幾乎所有的資料探勘/機器學習書籍都會介紹它,有些初學者還會將其與KNN等混淆。k均值是一種聚類演算法,屬於無監督學習的一種,而KNN是有監督學習/分類學習的一種。 聚類:顧名思義,就是講某些相似的事物聚在

機器學習之DBSCAN

機器學習之DBSCAN聚類 # -*- coding: utf-8 -*- """ Created on Wed Nov 28 18:50:57 2018 @author: muli """ import numpy as np from sklearn.datas

機器學習之kMeans

機器學習之kMeans聚類 # -*- coding: utf-8 -*- """ Created on Wed Nov 28 16:23:36 2018 @author: muli """ from sklearn.datasets.samples_generat

機器學習】Kmeans

寫在篇前   Kmeans演算法是一種經典的聚類演算法,屬於無監督學習的範疇。所謂聚類,即指對於給定的一個樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇,且讓簇內的點儘量緊密的連在一起,而讓簇間的距離儘量的大。 優點: 原理簡單 速度快 對大資料集有比較