manifold learning流形學習
多維度數據集非常難於可視化。反而2維或者3維數據很容易通過圖表展示數據本身的內部結構,等價的高維繪圖就遠沒有那么直觀了。為了實現數據集結構的可視化,數據的維度必須通過某種方式降維。
最簡單的降維手段是數據的隨機投影。雖然這種方式實現一定程度的數據結構可視化,但是選擇的隨意性導致結果遠不如意。在隨機投影中,更有趣的結構容易丟失。
為了解決這種問題,人們設計了一系列監督或非監督的線性降維框架,例如Principal Component Analysis(PCA,主成分分析)、Independent Component Analysis(獨立成分分析)、 Linear Discriminant Analysis(線性判別分析)…這些算法定義了特殊的評估量用於多維數據選擇有趣的線性投影,這些手段是有效的,不過經常會錯失數據結構中的非線性項。
Manifold Learing是一種非線性降維的手段,可以看作一種生成類似PCA的線性框架,不同的是可以對數據中的非線性結構敏感。雖然存在監督變體,但是典型的流式學習問題是非監督的:它從數據本身學習高維結構,不需要使用既定的分類
t-SNE
是可視化高維數據的工具。它將數據點之間的相似性轉換為聯合概率,並嘗試最小化低維嵌入和高維數據的聯合概率之間的Kullback-Leibler差異。t-SNE的成本函數不是凸的,即使用不同的初始化,我們可以獲得不同的結果。
如果特征的數量非常多,強烈建議使用另一種降維方法(例如,對於密集數據使用PCA或對於稀疏數據使用TruncatedSVD)將尺寸數量減少到合理的數量(例如50個)。這將抑制一些噪聲並加快樣本之間成對距離的計算。有關更多技巧
用法
反正只需要了解這個函數的大概用途是將特征弄成一坨,變成一個變量,然后和聚類后的label畫圖就OK了,具體原理細節,暫時不深究
class sklearn.manifold.TSNE(n_components=2, *, perplexity=30.0, early_exaggeration=12.0, learning_rate=200.0,
n_iter=1000, n_iter_without_progress=300, min_grad_norm=1e-07, metric='euclidean', init='random', verbose=0,
random_state=None, method='barnes_hut', angle=0.5, n_jobs=None)
參數什么的請參考官方文檔:https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html
這里主要看一些怎么使用
import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.datasets import load_iris from sklearn.cluster import KMeans X=load_iris().data kmeans = KMeans(n_clusters=3,random_state=0) kmeans.fit(X) labels = kmeans.labels_ labels = pd.DataFrame(labels,columns=['labels']) X=pd.DataFrame(X) X.insert(4,'labels',labels) from sklearn.manifold import TSNE tsne = TSNE() a = tsne.fit_transform(X) liris = pd.DataFrame(a,index=X.index) d1 = liris[X['labels']==0] #plt.plot(d1[0],d1[1],'r.') d2 = liris[X['labels']==1] #plt.plot(d2[0],d2[1],'go') d3 = liris[X['labels']==2] #plt.plot(d3[0],d3[1],'b*') plt.plot(d1[0],d1[1],'r.',d2[0],d2[1],'go',d3[0],d3[1],'b*')