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


流形學習

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

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

網上沖浪的許久,這個回答(麋路)讓我贊了

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

其實這個包有很多參數,比如困惑度()和一些梯度下降需要用到的參數,這個貼出大佬傳送門

人生此處,絕對樂觀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM