初次接觸流形學習和t-SNE技術

流形學習

低維流形空間映射到高維空間中去(低維 -> 高維,看了一天以爲這樣好理解),也就是說一個高維空間能夠有一個簡單的低維流形空間來刻畫。html

  • 舉個簡單的栗子,一個圓在二維空間中須要(x,y)兩個座標參數,而在極座標系中只須要半徑r一個參數就能夠刻畫出來了,也就是說高維空間中存在性質的冗餘。流形學習要作的就是找到高維空間的嵌入空間(低維空間,嵌入空間是給後面的sklearn埋下伏筆🐕

網上衝浪的許久,這個回答(麋路)讓我讚了python

t-SNE技術


機器學習中降維的技術有不少種,上圖是一些常見的降維技術,而SNE和t-SNE是纔出現不久的降維技術,二者的差異不大主要是低維空間中機率函數選擇的不一樣,由於t-SNE好不少,因此果斷選擇後者++算法

  • 引入簡介
    在人們的常識中,物件之間越接近則有很大多是屬於同一類。而在線性降維的過程當中確實是這樣子體現的,可是若是是複雜的高維空間(下圖),兩點之間是否接近就不能用簡單的歐氏距離來衡量了,數據之間的內在特徵就沒法表達出來。

    舉個栗子:在50維空間中有11個點它們之間的距離兩兩相等,而若是在二維空間中能表示幾個點之間的距離兩兩相等的最多隻有三個,這就告訴了咱們這樣子描述數據之間的類似程度是行不通的。
    t-SNE技術採用新的機率分佈衡量方式保證在高低維空間中內在特徵不被破壞,同時保證較好的區分能力
  • 衡量距離的新方法-類似程度

    在t-SNE技術中高維空間中的點\(x^i,x^j\)服從高斯分佈\(f(x)=\frac{1}{\sqrt{2\pi \sigma}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}\),下降後的低維空間中的點\(z^i,z^j\)服從t分佈
\ 高維空間 低維空間
\(x^i,x^j\)之間的距離 \(S(x^i,x^j)=\frac{1}{\sqrt{2\pi \sigma}}e^{-\frac{(x^i-x^j)^2}{2\sigma^2}}\) \
\(z^i,z^j\)之間的距離 \ \(S'(z^i,z^j)=\frac{1}{(z^i-z^j)^2}\)
任意兩點間的類似程度: \(P(x^j|x^i)=\frac{S(x^j,x^i)}{\sum_{k\neq i}S(x^j,x^k)}\) \(P'(z^j|z^i)=\frac{S'(z^j,z^i)}{\sum_{k\neq i}S(z^j,z^k)}\)

理想狀態下數據的性質是不會改變的,只是表現方式改變而已,也就是說在不一樣維度下對應的任意相同兩點間的類似程度應該相等,即在整個類似程度方程上來看,\(P(x^i,x^j)\)\(P'(z^i,z^j)\)是徹底相同的分佈,這就找到了咱們須要優化的對象。網絡

\ 描述
優化目的 \(P(x^i,x^j)\)\(P'(z^i,z^j)\)儘量的類似
優化對象 KL散度方程\(C=\sum_iKL(P_i||P'_i)=\sum_i\sum_jP_{j|i}log\frac{P_{j|i}}{P'_{j|i}}\)
優化方法 梯度降低(暈),經過GD找到最優的一組\(z^i\)參數即找到了低維空間
  • 練習 sklearn
    源碼網絡上都有,這裏作一個簡單的sklearn運用。t-SNE技術主要是用來數據可視化的,降至太低維數據的損失仍是有的,還有很重要的一點是具體實現彷佛是一遍聚類一遍降維來着(忘了),複雜度很高,須要的時間不少。
from time import time
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import manifold, datasets

n_points = 1000
# X 是一個(1000, 3)的 2 維數據,color 是一個(1000,)的 1 維數據
X, color = datasets.make_s_curve(n_points, random_state=0)
n_neighbors = 10
n_components = 2
 
fig = plt.figure(figsize=(8, 8))
# 建立了一個 figure,標題爲"Manifold Learning with 1000 points, 10 neighbors"
plt.suptitle("Manifold Learning with %i points, %i neighbors"
             % (1000, n_neighbors), fontsize=14)
 
 
'''繪製 S 曲線的 3D 圖像'''
ax = fig.add_subplot(211, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=color, cmap=plt.cm.Spectral)
ax.view_init(4, -72)  # 初始化視角
 
'''t-SNE'''
t0 = time()
tsne = manifold.TSNE(n_components=n_components, init='pca', random_state=0)
Y = tsne.fit_transform(X)  # 轉換後的輸出
t1 = time()
print("t-SNE: %.2g sec" % (t1 - t0))  # 算法用時
ax = fig.add_subplot(2, 1, 2)
plt.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Spectral)
plt.title("t-SNE (%.2g sec)" % (t1 - t0))
plt.xticks([])
plt.yticks([])
 
plt.show()

其實這個包有不少參數,好比困惑度()和一些梯度降低須要用到的參數,這個貼出大佬傳送門dom

相關文章
相關標籤/搜索