t-SNE ดังที่ [1] ทำงานโดยลดการเบี่ยงเบน Kullback-Leibler (KL) อย่างต่อเนื่องจนกว่าจะบรรลุเงื่อนไขบางประการ ผู้สร้าง t-SNE แนะนำให้ใช้ KL divergence เป็นเกณฑ์ประสิทธิภาพสำหรับการสร้างภาพข้อมูล:
คุณสามารถเปรียบเทียบความแตกต่าง Kullback-Leibler ที่รายงาน T-SNE เป็นการดีที่จะเรียกใช้ t-SNE สิบครั้งและเลือกโซลูชันที่มีค่าเบี่ยงเบน KL ต่ำสุด [2]
ฉันลองใช้งานสองแบบของ t-SNE:
- หลาม : sklearn.manifold.TSNE ()
- R : tsne จากไลบรารี่ (tsne)
การประยุกต์ใช้ทั้งสองนี้เมื่อตั้งค่าการใช้คำฟุ่มเฟือยพิมพ์ข้อผิดพลาด (Kullback-Leibler divergence) สำหรับการวนซ้ำแต่ละครั้ง อย่างไรก็ตามพวกเขาไม่อนุญาตให้ผู้ใช้รับข้อมูลนี้ซึ่งดูแปลกสำหรับฉัน
ตัวอย่างเช่นรหัส:
import numpy as np
from sklearn.manifold import TSNE
X = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])
model = TSNE(n_components=2, verbose=2, n_iter=200)
t = model.fit_transform(X)
ผลิต:
[t-SNE] Computing pairwise distances...
[t-SNE] Computed conditional probabilities for sample 4 / 4
[t-SNE] Mean sigma: 1125899906842624.000000
[t-SNE] Iteration 10: error = 6.7213750, gradient norm = 0.0012028
[t-SNE] Iteration 20: error = 6.7192064, gradient norm = 0.0012062
[t-SNE] Iteration 30: error = 6.7178683, gradient norm = 0.0012114
...
[t-SNE] Error after 200 iterations: 0.270186
ตอนนี้เท่าที่ฉันเข้าใจ0.270186ควรเป็นความแตกต่างของ KL อย่างไรก็ตามฉันไม่สามารถรับข้อมูลนี้ไม่ได้มาจากแบบจำลองหรือจากt (ซึ่งเป็น numpy.ndarray ง่าย ๆ )
เพื่อแก้ปัญหานี้ฉันทำได้: i) คำนวณ KL divergence ด้วยตัวเอง ii) ทำสิ่งที่น่ารังเกียจในไพ ธ อนสำหรับการจับและแยกวิเคราะห์เอาต์พุตของฟังก์ชัน TSNE () [3] อย่างไรก็ตาม: i) ค่อนข้างโง่ในการคำนวณ KL divergence อีกครั้งเมื่อ TSNE () ได้คำนวณไปแล้ว ii) จะผิดปกติเล็กน้อยในแง่ของรหัส
คุณมีข้อเสนอแนะอื่น ๆ หรือไม่? มีวิธีมาตรฐานในการรับข้อมูลนี้โดยใช้ห้องสมุดนี้หรือไม่?
ที่ผมกล่าวถึงฉันพยายามRห้องสมุด tsne 's แต่ฉันไม่ต้องการคำตอบที่จะมุ่งเน้นไปที่หลามการดำเนิน sklearn
อ้างอิง
[2] http://homepage.tudelft.nl/19j49/t-SNE.html
[3] /programming/16571150/how-to-capture-stdout-output-from-a-python-function-call