Isomap เชื่อมข้อมูลเป็นกราฟค่าน้ำหนัก แล้วใช้ระยะทางตามพื้นผิว (geodesic) ที่ประมาณจากกราฟ เพื่อป้อนให้ MDS ผลคือสามารถคลี่ manifold ที่โค้งให้อยู่ในมิติที่ต่ำกว่าได้
ขั้นตอน #
- สร้างกราฟ k-nearest neighbors หรือ \(\varepsilon\)-neighbors
- คำนวณเส้นทางที่สั้นที่สุดบนกราฟ (ประมาณระยะทางตามพื้นผิว)
- ส่งเมทริกซ์ระยะให้กับ Multidimensional Scaling (MDS) เพื่อได้พิกัดใหม่
ตัวอย่างด้วย Python #
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import make_swiss_roll
from sklearn.manifold import Isomap
X, color = make_swiss_roll(n_samples=1500, noise=0.05, random_state=0)
iso = Isomap(n_neighbors=10, n_components=2)
emb = iso.fit_transform(X)
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
axes[0].scatter(X[:, 0], X[:, 2], c=color, cmap="Spectral", s=5)
axes[0].set_title("Swiss roll 3 มิติ")
axes[1].scatter(emb[:, 0], emb[:, 1], c=color, cmap="Spectral", s=5)
axes[1].set_title("ผลฉายด้วย Isomap")
for ax in axes:
ax.set_xticks([])
ax.set_yticks([])
plt.tight_layout()
plt.show()
วิธีเลือกพารามิเตอร์ #
n_neighbors: เล็กไปกราฟขาดการเชื่อมต่อ ใหญ่ไประยะ geodesic จะคล้าย Euclideann_components: หากเน้น visualization ใช้ 2 หรือ 3 ถ้าต้องการลดมิติเพื่อโมเดลให้ใช้ค่าที่เหมาะกับงาน- ข้อมูลที่มี noise มากควรทำความสะอาดก่อน เพราะกราฟพึ่งพาระยะใกล้มาก
ข้อดี / ข้อจำกัด #
| ข้อดี | ข้อจำกัด |
|---|---|
| จัดการโครงสร้างไม่เชิงเส้นได้ดี | ต้องคำนวณ shortest path บนกราฟ ขนาดใหญ่จะช้า |
| พิกัดใหม่ตีความได้ตรงไปตรงมา | ไวต่อการเลือกพารามิเตอร์ k และ noise |
| เหมาะกับการมองภาพ manifold | ขยายไปยังข้อมูลมิติสูงจำนวนมากได้ยาก |
สรุป #
- Isomap = กราฟระยะทาง + MDS ช่วยคลี่ manifold ที่ซับซ้อนได้
- คุณภาพของกราฟคือหัวใจ จึงควรทดลองหลายค่าของเพื่อนบ้านและจัดการ noise ให้ดี
- ใช้ร่วมกับ t-SNE หรือ UMAP เพื่อเห็นมุมมองที่ต่างกันของข้อมูล