低維流形空間映射到高維空間中去(低維 -> 高維,看了一天以爲這樣好理解),也就是說一個高維空間能夠有一個簡單的低維流形空間來刻畫。html
網上衝浪的許久,這個回答(麋路)讓我讚了python
機器學習中降維的技術有不少種,上圖是一些常見的降維技術,而SNE和t-SNE是纔出現不久的降維技術,二者的差異不大主要是低維空間中機率函數選擇的不一樣,由於t-SNE好不少,因此果斷選擇後者++算法
\ | 高維空間 | 低維空間 |
---|---|---|
\(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\)參數即找到了低維空間 |
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