數字的舞蹈:利用 t-SNE 魔法揭示手寫數字之美

  • 在這篇教程中,我們將帶領你進入一個迷人的機器學習世界,探索如何使用 t-SNE—一種強大的維度降低技術—來解開手寫數字數據集的秘密。通過直觀的視覺化,你將學會如何將複雜的高維數據轉化為簡單易懂的二維圖形,讓數據中隱藏的模式和關聯呈現在你眼前,這是一個機器學習界常使用可視化神經網路的方法,可用於理解訓練出來的神經網路,讓神經網路不在只是一個黑盒子,而是能夠看懂這個網路到底學了什麼,底下將用一個最簡單的MNIST數據集帶大家了解如何使用t-SNE這套工具以及窺探網路到底學了什麼,透過此教學你將會發現數學的美妙之處以及卷積神經網路的厲害之處。無論你是數據科學的新手還是希望擴展知識的專業人士,這篇教程都將為你打開一扇新窗,讓你以全新的角度理解數據的力量和美麗。

    step1: 導入必要的庫:


    首先,我們需要導入處理數據和繪圖所需的庫,最常用的工具就是使用sklearn這套工具來進行操作,只要簡簡單單幾行程式碼再加上些許的處理時間就可以窺探神經網路學習的特徵
import numpy as np
import matplotlib.pyplot as plt
from sklearn import manifold, datasets

numpy: 用於數據操作,如數組的創建和變形。 matplotlib.pyplot: 用於繪製圖表,以視覺化我們的數據和結果。 sklearnmanifold: 用於執行 t-SNE 算法 sklearndatasets: 用於獲取內置的手寫數字數據集。

step2: 加載並準備數據

接下來,從 **sklearn** 加載手寫數字數據集,並僅選擇前6個類(即數字0到5):

digits = datasets.load_digits(n_class=6)
X, y = digits.data, digits.target
## X.shape (1083,64)
## y.shape (1083,) 

step3: 顯示原始數據

我們展示一部分原始圖像,以獲得數據的直觀感受:

n = 20  # 每行20個數字,每列20個數字
img = np.zeros((10 * n, 10 * n))
for i in range(n):
ix = 10 * i + 1
for j in range(n):
iy = 10 * j + 1
img[ix:ix + 8, iy:iy + 8] = X[i * n + j].reshape((8, 8))
plt.figure(figsize=(8, 8))
plt.imshow(img, cmap=plt.cm.binary)
plt.xticks([])
plt.yticks([])
plt.savefig('digits.png')
  • 這段代碼創建了一個圖像,其中包含了400個手寫數字的小圖。這幫助我們理解數據集中的數據是如何看起來的。

step4: 執行 t-SNE 降維

  • t-SNE 是一種將高維數據降維到較低維(通常是2維或3維)以便於視覺化的技術。
## 初始化tsne
tsne = manifold.TSNE(n_components=2, init='pca', random_state=501)

X_tsne = tsne.fit_transform(X)
- 這裡,`**X_tsne**` 是降維後的數據,我們將其用於後續的可視化。

step5: 嵌入空間可視化

  • 最後,我們將降維後的數據點可視化,每個點的顏色和文本標籤對應其原始的數字標籤:
x_min, x_max = X_tsne.min(0), X_tsne.max(0)
X_norm = (X_tsne - x_min) / (x_max - x_min)  # 归一化
plt.figure(figsize=(8, 8))
for i in range(X_norm.shape[0]):
plt.text(X_norm[i, 0], X_norm[i, 1], str(y[i]), color=plt.cm.Set1(y[i]), 
        fontdict={'weight': 'bold', 'size': 9})
plt.xticks([])
plt.yticks([])
plt.savefig('tsne.png')
  • 透過這段代碼,我們能夠在一個二維平面上看到不同數字的可視化過程
0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments