大俠幸會,在下全網同名「演算法金」
0 基礎轉 AI 上岸,多個演算法賽 Top
「日更萬日,讓更多人享受智慧樂趣」
t-SNE(t-Distributed Stochastic Neighbor Embedding)是一種用於降維和資料視覺化的非線性演算法。它被廣泛應用於影像處理、文字挖掘和生物資訊學等領域,特別擅長處理高維資料。
本文旨在詳細介紹 t-SNE 演算法的基本概念、數學基礎、演算法步驟、程式碼示範及其在不同領域的應用案例。我們還將探討 t-SNE 的常見誤區和注意事項,並與其他降維演算法進行對比,以幫助鐵子們更好地理解和應用 t-SNE 演算法。
by datacamp
t-SNE 的基本概念
1.1 什麼是 t-SNE
t-SNE 是一種非線性降維技術,用於將高維資料對映到低維空間,以便進行視覺化。它透過保持高維空間中資料點之間的區域性相似性來生成低維空間的表示。這種方法特別適用於揭示覆雜資料集中的模式和結構
1.2 t-SNE 的核心思想
t-SNE 的核心思想是透過兩步過程實現高維到低維的對映。首先,t-SNE 在高維空間中使用高斯分佈來計算資料點之間的條件機率。然後,在低維空間中,t-SNE 使用 t 分佈來計算相似度,並透過最小化兩個分佈之間的 Kullback-Leibler 散度(KL 散度)來最佳化資料點的位置。這個過程可以透過梯度下降法進行最佳化,從而得到低維空間中的表示。
2. t-SNE 的數學基礎
對看公司很痛苦的同學,可直接跳過公式
2.1 高斯分佈與條件機率
在 t-SNE 演算法中,首先需要在高維空間中計算資料點之間的相似度。為此,我們使用高斯分佈來表示這種相似度。
2.2 Kullback-Leibler 散度
在低維空間中,t-SNE 使用 t 分佈來計算資料點之間的相似度。與高維空間中的條件機率類
2.3 梯度下降法
為了最小化 KL 散度,t-SNE 使用梯度下降法來最佳化低維空間中資料點的位置。梯度下降法是一種迭代最佳化演算法,每次迭代更新資料點的位置,使 KL 散度逐漸減小。具體來說,t-SNE 計算 KL 散度對每個資料點位置的梯度,並按照負梯度的方向更新資料點的位置:
3. t-SNE 的演算法步驟
3.1 高維空間中的相似度計算
在 t-SNE 演算法中,首先需要計算高維空間中資料點之間的相似度。具體步驟如下:
- 對於每個資料點 (x_i),計算其與其他資料點 (x_j) 的歐氏距離 (|x_i - x_j|)
- 使用高斯分佈計算條件機率 (p_{j|i}),即在給定 (x_i) 的情況下選擇 (x_j) 作為鄰居的機率:
- 計算聯合機率 (p_{ij}):
3.2 低維空間中的相似度計算
在低維空間中,t-SNE 使用 t 分佈來計算資料點之間的相似度。具體步驟如下:
- 對於每個低維資料點 (y_i),計算其與其他資料點 (y_j) 的歐氏距離 (|y_i - y_j|)
- 使用 t 分佈計算相似度 (q_{ij}):
3.3 損失函式的最佳化
t-SNE 透過最小化高維空間和低維空間之間的相似度分佈的 Kullback-Leibler 散度來最佳化低維空間中資料點的位置。具體步驟如下:
- 計算 KL 散度:
- 計算 KL 散度對每個低維資料點位置的梯度:
- 使用梯度下降法更新低維資料點的位置:
透過上述步驟迭代最佳化,t-SNE 最終可以得到一個低維空間中的表示,使得高維資料的區域性相似性在低維空間中得以保留
4. t-SNE 的程式碼示範
在這部分,我們將生成一個帶有武俠風格的資料集,包含三個門派的武俠人物。資料集的特徵包括武力值、智力值和身法值。我們將使用 t-SNE 進行降維,並展示其視覺化效果。接下來,我們會調整 t-SNE 的引數以觀察其對降維結果的影響。
4.1 資料集生成與基本實現
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from sklearn.datasets import load_iris
# 生成武俠人物資料集
np.random.seed(42)
num_samples_per_class = 50
data = {
'武力值': np.hstack([np.random.normal(loc=5, scale=1, size=num_samples_per_class),
np.random.normal(loc=7, scale=1, size=num_samples_per_class),
np.random.normal(loc=9, scale=1, size=num_samples_per_class)]),
'智力值': np.hstack([np.random.normal(loc=3, scale=1, size=num_samples_per_class),
np.random.normal(loc=5, scale=1, size=num_samples_per_class),
np.random.normal(loc=7, scale=1, size=num_samples_per_class)]),
'身法值': np.hstack([np.random.normal(loc=1, scale=1, size=num_samples_per_class),
np.random.normal(loc=2, scale=1, size=num_samples_per_class),
np.random.normal(loc=3, scale=1, size=num_samples_per_class)]),
'門派': np.hstack([np.full(num_samples_per_class, '少林'),
np.full(num_samples_per_class, '武當'),
np.full(num_samples_per_class, '峨眉')])
}
df = pd.DataFrame(data)
# 將類別標籤轉換為數字
df['門派'] = df['門派'].astype('category').cat.codes
# 列印前幾行資料
print(df.head())
# t-SNE 降維
X = df[['武力值', '智力值', '身法值']]
y = df['門派']
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)
# 視覺化 t-SNE 結果
plt.figure(figsize=(10, 7))
scatter = plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='viridis')
plt.colorbar(scatter, ticks=[0, 1, 2], label='門派')
plt.clim(-0.5, 2.5)
plt.title('t-SNE 結果視覺化')
plt.xlabel('t-SNE 維度 1')
plt.ylabel('t-SNE 維度 2')
plt.show()
解釋與結果解讀
在基本實現中,我們生成了一個包含武俠人物特徵和門派標籤的資料集。資料集中的武俠人物分別來自少林、武當和峨眉三個門派。我們使用 t-SNE 將資料降維到二維,並視覺化其結果。不同顏色表示不同的門派,從圖中可以看到,同一門派的武俠人物在降維後的二維空間中聚集在一起,而不同門派的武俠人物則分佈在不同的區域。
4.2 引數調優
接下來,我們調整 t-SNE 的兩個關鍵引數:perplexity 和 learning_rate,並觀察它們對降維結果的影響。
# 調整 perplexity 引數
tsne_perplexity = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne_perplexity = tsne_perplexity.fit_transform(X)
plt.figure(figsize=(10, 7))
scatter_perplexity = plt.scatter(X_tsne_perplexity[:, 0], X_tsne_perplexity[:, 1], c=y, cmap='viridis')
plt.colorbar(scatter_perplexity, ticks=[0, 1, 2], label='門派')
plt.clim(-0.5, 2.5)
plt.title('t-SNE 結果 (perplexity=30)')
plt.xlabel('t-SNE 維度 1')
plt.ylabel('t-SNE 維度 2')
plt.show()
# 調整 learning_rate 引數
tsne_learning_rate = TSNE(n_components=2, learning_rate=200, random_state=42)
X_tsne_learning_rate = tsne_learning_rate.fit_transform(X)
plt.figure(figsize=(10, 7))
scatter_learning_rate = plt.scatter(X_tsne_learning_rate[:, 0], X_tsne_learning_rate[:, 1], c=y, cmap='viridis')
plt.colorbar(scatter_learning_rate, ticks=[0, 1, 2], label='門派')
plt.clim(-0.5, 2.5)
plt.title('t-SNE 結果 (learning_rate=200)')
plt.xlabel('t-SNE 維度 1')
plt.ylabel('t-SNE 維度 2')
plt.show()
解釋與結果解讀
- 調整 perplexity 引數:
- 將 perplexity 設定為 30 後,我們再次對資料進行 t-SNE 降維。結果顯示,調整 perplexity 會影響資料點在二維空間中的分佈。perplexity 引數決定了 t-SNE 在計算高維空間中資料點的相似度時考慮的鄰居數量。適當調整 perplexity 可以更好地平衡區域性和全域性資料結構。
- 調整 learning_rate 引數:
- 將 learning_rate 設定為 200 後,我們再次對資料進行 t-SNE 降維。結果顯示,調整 learning_rate 會影響降維結果的收斂速度和最終效果。learning_rate 引數決定了梯度下降的步長,合適的 learning_rate 可以加速收斂並避免陷入區域性最優解。
透過這些示例和詳細解釋,可以更好地理解 t-SNE 演算法及其在實際資料集中的應用效果。希望這能幫助你更好地掌握 t-SNE 的使用方法和引數調優技巧。
每天一個簡潔明瞭的小案例,如果你對這類文章感興趣,
歡迎訂閱、點贊和分享哦~
5. t-SNE 的應用案例
5.1 影像資料降維
t-SNE 在影像資料降維中非常有效。以下示例展示瞭如何將 t-SNE 應用於影像資料降維和視覺化。我們將使用手寫數字資料集(MNIST)進行演示。
import numpy as np
import pandas as pd
from sklearn.manifold import TSNE
from sklearn.datasets import fetch_openml
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 載入 MNIST 資料集
mnist = fetch_openml('mnist_784', version=1)
X = mnist.data / 255.0 # 將資料歸一化到 [0, 1] 區間
y = mnist.target
# 隨機選擇 10000 個資料點
np.random.seed(42)
indices = np.random.choice(X.shape[0], 10000, replace=False)
X_subset = X.iloc[indices]
y_subset = y.iloc[indices]
# 標準化資料
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_subset)
# 應用 t-SNE 進行降維
tsne = TSNE(n_components=2, perplexity=30, n_iter=1000, random_state=42)
X_tsne = tsne.fit_transform(X_scaled)
# t-SNE 視覺化結果
plt.figure(figsize=(12, 8))
scatter_tsne = plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y_subset.astype(int), cmap='tab10', s=1)
plt.legend(*scatter_tsne.legend_elements(), title="Digits")
plt.title('MNIST 資料集的 t-SNE 視覺化')
plt.xlabel('t-SNE 維度 1')
plt.ylabel('t-SNE 維度 2')
plt.show()
5.2 文字資料降維
t-SNE 也廣泛應用於文字資料降維。以下示例展示瞭如何將 t-SNE 應用於文字資料降維和視覺化。我們將使用新聞組資料集進行演示。
5.3 生物資訊學中的應用
在生物資訊學中,t-SNE 常用於基因表達資料的降維和視覺化。以下示例展示瞭如何將 t-SNE 應用於單細胞 RNA 序列資料的降維和視覺化。
6. t-SNE 的誤區和注意事項
6.1 t-SNE 不適合大資料集
t-SNE 的計算複雜度較高,對於大規模資料集,計算時間和記憶體消耗都非常大。因此,t-SNE 不適合直接應用於大資料集。在處理大資料集時,可以考慮以下幾種方法:
- 先使用其他降維方法(如 PCA)進行預處理,將資料維度降低到較小的範圍,然後再應用 t-SNE
- 選擇一部分代表性資料點進行 t-SNE 降維,而不是對整個資料集進行降維
- 使用基於樹的近似演算法(如 Barnes-Hut t-SNE)來加速計算
6.2 引數選擇的影響
t-SNE 的降維效果對引數的選擇非常敏感。兩個關鍵引數是 perplexity 和 learning_rate。perplexity 引數控制每個資料點的有效鄰居數量,一般設定在 5 到 50 之間;learning_rate 引數控制梯度下降的步長,通常設定在 10 到 1000 之間。以下是一些經驗性的引數選擇建議:
- 對於較小的資料集,可以選擇較小的 perplexity 和較大的 learning_rate
- 對於較大的資料集,可以選擇較大的 perplexity 和較小的 learning_rate
- 透過實驗和視覺化結果調整引數,以獲得最佳的降維效果
6.3 結果的解釋與視覺化誤導
t-SNE 的視覺化結果雖然直觀,但有時會產生誤導。需要注意以下幾點:
- t-SNE 只保留區域性相似性,低維空間中距離較遠的資料點在高維空間中不一定距離較遠,因此低維空間中的距離不能直接解釋為高維空間中的距離
- t-SNE 的隨機性較強,不同的執行可能產生不同的結果,可以透過設定隨機種子來獲得可重複的結果
- 視覺化結果中的簇並不總是表示真實的分類,需要結合其他資訊進行綜合分析
7. t-SNE 與其他降維演算法的對照
7.1 與 PCA 的對照
PCA(主成分分析)和 t-SNE 是兩種常用的降維演算法,但它們的原理和應用場景有所不同:
- 基本原理:PCA 是一種線性降維方法,透過找到資料最大方差的方向(主成分),將高維資料投影到低維空間。t-SNE 是一種非線性降維方法,透過最小化高維空間和低維空間之間的機率分佈差異,將高維資料嵌入到低維空間
- 應用場景:PCA 適用於資料維度較低且線性關係較強的情況,如資料預處理和特徵選擇。t-SNE 適用於高維資料和非線性關係較強的情況,如資料視覺化和模式識別
- 計算複雜度:PCA 計算複雜度較低,適合大規模資料集。t-SNE 計算複雜度較高,不適合大規模資料集
7.2 與 LLE 的對照
LLE(區域性線性嵌入)和 t-SNE 都是非線性降維方法,但它們的實現方式不同:
- 基本原理:LLE 透過保持資料區域性鄰居關係,將高維資料嵌入到低維空間。t-SNE 透過最小化高維空間和低維空間之間的機率分佈差異,將高維資料嵌入到低維空間
- 應用場景:LLE 適用於資料維度較低且區域性線性關係較強的情況,如影像資料和時間序列資料。t-SNE 適用於高維資料和非線性關係較強的情況,如文字資料和生物資訊學資料
- 計算複雜度:LLE 的計算複雜度中等,適用於中等規模的資料集。t-SNE 的計算複雜度較高,不適合大規模資料集
7.3 不同演算法的優劣勢
每種降維演算法都有其優劣勢,選擇合適的演算法取決於具體的資料集和任務需求:
- PCA:優點是計算速度快,結果容易解釋,適用於線性關係較強的資料集。缺點是無法處理非線性關係
- t-SNE:優點是能夠揭示資料的非線性結構,適用於高維資料和複雜模式識別。缺點是計算複雜度高,引數選擇敏感,不適合大規模資料集
- LLE:優點是能夠保持資料的區域性鄰居關係,適用於區域性線性關係較強的資料集。缺點是對資料噪聲敏感,計算複雜度中等
透過以上對比,可以更好地理解不同降維演算法的適用場景和特點,從而選擇最適合具體任務的演算法
8. 相關與相對的概念引出與對比
8.1 降維與聚類
降維和聚類是資料分析中的兩種不同但相關的方法:
- 降維:降維是將高維資料對映到低維空間,以便進行視覺化或簡化分析。降維方法包括 PCA、t-SNE、LLE 等。降維的目的是減少特徵數量,同時儘量保留原始資料的結構資訊
- 聚類:聚類是將資料分為若干組,使得同組資料點之間的相似度儘可能高,而不同組之間的相似度儘可能低。常用的聚類方法包括 K-means、層次聚類、DBSCAN 等。聚類的目的是發現資料中的自然分組或模式
雖然降維和聚類有不同的目標,但它們可以結合使用。例如,降維可以用於將高維資料投影到低維空間,從而便於進行聚類分析
8.2 t-SNE 與 UMAP
UMAP(Uniform Manifold Approximation and Projection)是另一種非線性降維方法,常用於與 t-SNE 進行比較:
- 基本原理:t-SNE 透過最小化高維空間和低維空間之間的機率分佈差異,將高維資料嵌入到低維空間。UMAP 透過構建高維空間的鄰接圖,然後透過最佳化圖嵌入,將資料投影到低維空間
- 應用場景:t-SNE 適用於高維資料和複雜模式識別,特別是在視覺化方面效果顯著。UMAP 在保持全域性和區域性結構方面表現更好,計算速度更快,適合處理大規模資料集
- 計算複雜度:t-SNE 計算複雜度較高,不適合大規模資料集。UMAP 計算複雜度較低,更適合大規模資料集
8.3 t-SNE 與 MDS
MDS(多維尺度分析)和 t-SNE 都是用於降維和資料視覺化的演算法:
- 基本原理:MDS 透過保留高維空間中資料點之間的距離,將資料嵌入到低維空間。t-SNE 透過最小化高維空間和低維空間之間的機率分佈差異,將資料嵌入到低維空間
- 應用場景:MDS 適用於資料點之間距離資訊較為可靠的情況,如心理學和市場研究中的資料分析。t-SNE 適用於高維資料和複雜模式識別,如影像和文字資料
- 計算複雜度:MDS 計算複雜度中等,適用於中等規模的資料集。t-SNE 計算複雜度較高,不適合大規模資料集
[ 抱個拳,總個結 ]
- t-SNE 的核心概念:t-SNE 是一種非線性降維方法,透過保持高維空間中資料點之間的區域性相似性,將高維資料嵌入到低維空間,以便進行視覺化和模式識別
- 應用場景:t-SNE 廣泛應用於影像處理、文字挖掘和生物資訊學等領域,特別適用於高維和非線性資料的視覺化
- 數學基礎:t-SNE 透過計算高維空間中的條件機率和低維空間中的相似度,並最小化兩個分佈之間的 Kullback-Leibler 散度來最佳化低維表示
- 演算法步驟:t-SNE 包括高維空間中的相似度計算、低維空間中的相似度計算以及透過梯度下降法最佳化損失函式的步驟
- 程式碼實現:使用 Python 和 scikit-learn 庫可以實現 t-SNE 演算法,並結合不同的引數調優和視覺化效果進行展示
- 應用案例:t-SNE 在影像資料、文字資料和生物資訊學中的應用展示了其強大的降維和視覺化能力
- 誤區和注意事項:t-SNE 不適合大規模資料集,引數選擇對結果影響較大,低維空間中的距離解釋需要謹慎
- 與其他降維演算法的對照:t-SNE 與 PCA、LLE、UMAP 和 MDS 等降維演算法在原理、應用場景和計算複雜度上各有不同,可以根據具體任務選擇合適的演算法
- 相關與相對的概念:降維和聚類可以結合使用,t-SNE 與 UMAP 和 MDS 等方法在保留資料結構和計算效率上有不同的優劣勢
透過以上的詳細介紹,希望大俠對 t-SNE 演算法有了更深入的理解和認識。在實際應用中,結合資料特點和任務需求,選擇合適的降維方法,才能發揮資料分析和視覺化的最大效用。
- 科研為國分憂,創新與民造福 -
日更時間緊任務急,難免有疏漏之處,還請大俠海涵
內容僅供學習交流之用,部分素材來自網路,侵聯刪
[ 演算法金,碎碎念 ]
全網同名,日更萬日,讓更多人享受智慧樂趣
如果覺得內容有價值,煩請大俠多多 分享、在看、點贊,助力演算法金又猛又持久、很黃很 BL 的日更下去;
同時邀請大俠 關注、星標 演算法金,圍觀日更萬日,助你功力大增、笑傲江湖