PCA memetakan data ke arah variansi terbesar — tetapi arah itu belum tentu arah yang paling membedakan kelompok-kelompok kecil di data Anda. t-SNE (t-distributed Stochastic Neighbor Embedding) dibuat untuk satu tugas saja: memvisualisasikan data berdimensi tinggi dalam dua atau tiga dimensi dengan tetangga-tetangga dekat tetap berdekatan. Peta yang dihasilkannya sering tampak terurai menjadi gumpalan-gumpalan yang sangat jelas — kejelasan inilah yang menjadikan t-SNE alat eksplorasi paling populer sekaligus paling sering salah tafsir. Chapter penutup section ini memakai data yang lebih menantang dari kisah pelanggan: 300 gambar digit tulisan tangan, masing-masing 64 fitur intensitas piksel.
Untuk Apa t-SNE Dibuat #
Tujuannya satu dan tidak berniat berkembang: visualisasi. t-SNE adalah nonlinear dimensionality reduction yang menukar kejujuran global demi ketajaman lokal. Cara kerjanya dalam garis besar: jarak antar titik diubah menjadi probabilitas “keduanya bertetangga” — tiap titik punya lebar pencarian sendiri yang disetel agar jumlah tetangga efektifnya sesuai target perplexity. Peta dua dimensi lalu dibangun agar profil bertetangga di dimensi rendah menyerupai yang di dimensi tinggi, diukur dengan KL divergence (kolom KLD pada contoh kita) dan dioptimalkan lewat penurunan gradien.
Distribusi t (ekor gemuk) dipakai di sisi dimensi rendah agar titik yang tidak bertetangga terdorong saling menjauh tanpa berdesakan di pusat — masalah yang menggerus versi pendahulunya, SNE. Konsekuensi dari seluruh desain ini: hasil berupa koordinat peta yang tidak bisa diproyeksikan kembali, tidak punya makna satuan, dan berbeda antar eksekusi jika random_state tidak ditetapkan — pada contoh kita ditetapkan 42, dengan init="pca" sebagai titik awal yang stabil.
Perplexity: Sebesar Apa “Tetangga” Itu #
Perplexity kira-kira adalah jumlah tetangga efektif yang dipedulikan tiap titik — angka 5 berarti t-SNE melihat lingkungan yang sempit, angka 50 berarti lingkungan yang luas. Rentang lazimnya 5–50, wajib kurang dari jumlah sampel, dan tidak ada satu nilai serba-tepat yang cocok untuk semua data. Praktik yang benar: jalankan beberapa nilai lalu bandingkan peta yang dihasilkan. Pada contoh kita, ketiga nilai memberi pola besar yang sama (digit terpisah menjadi gumpalan), dengan rincian yang berbeda — dan satu gejala yang justru menjadi pelajaran utama chapter ini.
Aturan Membaca Peta #
Kesalahpahaman paling sering di sekitar t-SNE: membaca peta itu seperti membaca peta geografis. Padahal t-SNE sengaja tidak menjaga geometri global. Tiga aturan menyelamatkan Anda:
- Jarak antar gumpalan tidak bermakna. Dua gumpalan yang berjauhan di peta tidak berarti dua kelompok itu lebih berbeda daripada pasangan gumpalan yang berdekatan. Posisi gumpalan juga bisa berpindah total antar
perplexity. - Ukuran gumpalan tidak bermakna. Gumpalan besar tidak berarti klaster lebih tersebar di data asli — skala peta ditentukan oleh kepadatan lokal, bukan skala data.
- Yang bermakna adalah tetangga. Titik yang bersebelahan di peta hampir pasti bertetangga di dimensi tinggi; itu satu-satunya janji yang dijaga t-SNE.
Contoh kita menunjukkan buktinya secara kuantitatif: jarak rata-rata antar titik digit yang sama anjlok dari 10,284 (perplexity 5) menjadi 2,432 (perplexity 50) — bukan karena datanya menyusut, melainkan karena skala peta berubah total. Yang relatif stabil adalah rasio jarak antar-digit-sama dan digit-berbeda: 6,2; 6,9; 5,2 — ketiganya menandakan pemisahan lokal yang baik.
Batas Praktis #
t-SNE tidak menyediakan transform() untuk data baru: peta harus dibangun ulang dari nol setiap kali data datang, sehingga ia tidak bisa menjadi langkah preprocessing dalam pipeline model produksi — tugas itu tetap milik PCA. Biaya komputasinya tumbuh kuadratik terhadap jumlah titik; beberapa ribu sampel nyaman, ratusan ribu menuntut varian seperti UMAP atau Barnes–Hut t-SNE. Untuk data 64 dimensi seperti digit kita, praktik standar juga menjalankan PCA lebih dulu ke sekitar 20–50 dimensi: derau piksel teredam, t-SNE bekerja pada sinyal utamanya, dan waktu komputasi turun.
| Aspek | PCA | t-SNE |
|---|---|---|
| Jenis | Proyeksi linear | Nonlinear, khusus visualisasi |
| Struktur yang dijaga | Global (variansi) | Lokal (tetangga) |
transform data baru | Ada | Tidak ada |
inverse_transform | Ada (bergalat terukur) | Tidak ada |
| Deterministik | Ya | Hanya dengan random_state |
| Biaya | Murah, skalabel | Kuadratik terhadap jumlah titik |
Praktik: Peta 64 Dimensi ke 2 Dimensi #
# t-SNE: peta 2 dimensi dari data 64 dimensi (digit tulisan tangan).
# Data: sklearn load_digits, 300 sampel pertama (indeks tetap, tanpa unduhan).
import numpy as np
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
# 1) Data: 300 gambar digit 8x8 piksel -> 64 fitur intensitas.
digits = load_digits()
X = digits.data[:300]
y = digits.target[:300]
print(f"Data: {X.shape[0]} gambar digit 8x8 piksel -> {X.shape[1]} fitur")
print(f"Sampel per digit (0-9): {np.bincount(y, minlength=10).tolist()}")
# 2) Praktik standar: PCA dulu meredam derau sebelum t-SNE.
pca = PCA(n_components=20, random_state=42)
X20 = pca.fit_transform(X)
kumulatif = float(np.cumsum(pca.explained_variance_ratio_)[-1])
print(f"\nPCA ke {X20.shape[1]} dimensi (variansi terpertahankan {kumulatif:.3f})")
# 3) t-SNE ke 2 dimensi: coba tiga nilai perplexity.
print("\nt-SNE ke 2 dimensi (init='pca', random_state=42):")
print(" perplexity jarak sama jarak beda rasio KLD")
pasangan = np.triu_indices(len(y), k=1)
peta = {}
for perp in [5, 20, 50]:
tsne = TSNE(n_components=2, perplexity=perp, init="pca", random_state=42)
emb = tsne.fit_transform(X20)
peta[perp] = emb
d = np.sqrt(((emb[:, None, :] - emb[None, :, :]) ** 2).sum(axis=2))
sama = (y[:, None] == y[None, :])[pasangan]
dp = d[pasangan]
rasio = float(dp[~sama].mean() / dp[sama].mean())
print(f" {perp:>10} {dp[sama].mean():>10.3f} {dp[~sama].mean():>10.3f}"
f" {rasio:>5.2f} {tsne.kl_divergence_:.3f}")
# 4) Posisi rata-rata tiap digit pada peta perplexity=20.
emb20 = peta[20]
print("\nPusat rata-rata tiap digit pada peta (perplexity=20):")
for digit in range(10):
pusat = emb20[y == digit].mean(axis=0)
print(f" digit {digit}: ({pusat[0]:>7.2f}, {pusat[1]:>7.2f})")Output yang Dihasilkan:
Data: 300 gambar digit 8x8 piksel -> 64 fitur
Sampel per digit (0-9): [31, 30, 29, 29, 29, 32, 29, 29, 31, 31]
PCA ke 20 dimensi (variansi terpertahankan 0.925)
t-SNE ke 2 dimensi (init='pca', random_state=42):
perplexity jarak sama jarak beda rasio KLD
5 10.284 64.041 6.23 0.415
20 4.294 29.730 6.92 0.313
50 2.432 12.534 5.15 0.311
Pusat rata-rata tiap digit pada peta (perplexity=20):
digit 0: ( -33.14, 2.64)
digit 1: ( 10.62, -21.08)
digit 2: ( 13.31, -6.94)
digit 3: ( 3.88, 26.36)
digit 4: ( 1.74, -20.06)
digit 5: ( -5.95, 11.04)
digit 6: ( -16.21, -18.33)
digit 7: ( 15.14, 8.20)
digit 8: ( 3.02, -3.07)
digit 9: ( -4.88, 21.35)Mari kita bedah hasil eksekusinya:
- Baris 17–20 (PCA perantara): 20 komponen pertama mempertahankan 0,925 variansi dari 64 fitur piksel — sinyal utama digit memang hidup di dimensi rendah, sisanya banyak derau. Data piksel berbagi satu satuan (intensitas 0–16) sehingga scaling tidak sekrusial pada data fitur campuran satuan.
- Baris 27–36 (sweep perplexity): pada ketiga nilai, titik se-digit saling berjarak jauh lebih pendek daripada titik berbeda digit — rasio 5,2 sampai 6,9. Pemisahan lokal terjaga di semua pengaturan. Perhatikan skala absolutnya: jarak digit-sama menyusut dari 10,284 ke 2,432 saat perplexity naik — peta “menyusut” tanpa data berubah, bukti angka jarak t-SNE tidak boleh dibaca sebagai ukuran dunia nyata. KLD terendah justru di perplexity besar, namun angka KLD antar perplexity tidak bisa dibandingkan langsung karena datanya diproses dengan parameter tetangga yang berbeda.
- Baris 39–43 (memetakan sepuluh digit): dengan perplexity 20, digit 0 menepi jauh ke kiri (−33,14; 2,64), digit 1 dan 4 di kanan atas, digit 6 di kiri bawah, digit 3 dan 9 di bawah, sedangkan digit 8 nyaris tepat di pusat peta (3,02; −3,07). Peta yang digambar dari angka-angka ini menampilkan sepuluh gumpalan yang hampir terpisah sempurna — dan posisi delapan yang terjepit di tengah masuk akal: bentuknya memang gabungan lengkung yang mudah tertukar dengan digit lain.
- Kolom rasio sebagai kualitas peta: rasio 6,92 pada perplexity 20 berarti rata-rata pasangan titik berbeda digit berjarak hampir tujuh kali pasangan se-digit — angka satu baris ini yang paling layak dilaporkan ketika Anda perlu menilai peta t-SNE secara kuantitatif, bukan jarak mentahnya.
Perjalanan Section Unsupervised Learning tuntas: dari konsep tanpa label, tiga algoritme clustering, alat ukur silhouette, hingga dua mesin reduksi dimensi. Seluruh benang merahnya — segmentasi pelanggan dengan k-means, evaluasi dengan silhouette, peringatan scaling — akan terpakai penuh pada Proyek Segmentasi Pelanggan di bagian akhir Course. Sebelum sampai ke proyek, giliran Anda memperkaya sisi masukan: merancang fitur baru dan memilih yang paling informatif, materi Section Feature Engineering dan Seleksi.
Referensi Resmi #
- t-SNE — scikit-learn User Guide (manifold learning) — penjelasan resmi mekanisme, perplexity, dan praktik penggunaan t-SNE.
- sklearn.manifold.TSNE — API Reference
— parameter lengkap termasuk
perplexity,init, danrandom_state. - sklearn.datasets.load_digits — API Reference — dataset digit 8x8 yang dipakai pada contoh.