การนำ t-SNE Python มาใช้: Kullback-Leibler divergence


11

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


อ้างอิง

[1] http://nbviewer.ipython.org/urls/gist.githubusercontent.com/AlexanderFabisch/1a0c648de22eff4a2a3e/raw/59d5bc5ed8f8fffa9f1f7fa1a

[2] http://homepage.tudelft.nl/19j49/t-SNE.html

[3] /programming/16571150/how-to-capture-stdout-output-from-a-python-function-call

คำตอบ:


4

แหล่งที่มาของ TSNE ใน scikit-learning นั้นเป็น Python บริสุทธิ์ fit_transform()วิธีการพอดีคือการเรียก_fit()ฟังก์ชั่นส่วนตัวที่จริงแล้วเรียก_tsne()ฟังก์ชั่นส่วนตัว ที่_tsne()ฟังก์ชั่นที่มีตัวแปรท้องถิ่นerrorซึ่งเป็นที่พิมพ์ออกมาในตอนท้ายของพอดี fit_transform()ดูเหมือนว่าคุณจะสวยได้อย่างง่ายดายเปลี่ยนหนึ่งหรือสองบรรทัดของรหัสที่มาจะมีค่าที่ส่งกลับไปยัง


โดยพื้นฐานแล้วสิ่งที่ฉันทำได้คือการตั้งค่า self.error = error ที่ส่วนท้ายของ _tsne () เพื่อรับข้อมูลจากอินสแตนซ์ TSNE หลังจากนั้น ใช่ แต่นั่นอาจหมายถึงการเปลี่ยนรหัส sklearn.manifold และฉันสงสัยว่านักพัฒนาคิดหาวิธีอื่นในการรับข้อมูลหรือไม่เพราะเหตุใดพวกเขาจึงไม่ทำเช่นนั้น นอกจากนี้หากฉันเปลี่ยนรหัสนั้นฉันจะต้องให้ทุกคนที่เรียกใช้รหัสของฉันมีการแฮ็คเดียวกันในการติดตั้งที่ผิดพลาด นั่นคือสิ่งที่คุณแนะนำหรือฉันผิดหรือเปล่า?
โจ๊ก

ใช่นั่นคือสิ่งที่ฉันแนะนำว่าเป็นทางออกที่เป็นไปได้ เนื่องจาก scikit-learning เป็นโอเพนซอร์สคุณสามารถส่งโซลูชันของคุณเป็นคำขอดึงและดูว่าผู้เขียนจะรวมไว้ในการเปิดตัวในอนาคต ฉันไม่สามารถพูดกับสาเหตุที่พวกเขาทำหรือไม่รวมสิ่งต่าง ๆ
แต้ม

2
ขอบคุณ ถ้าใครมีความสนใจในเรื่องนี้github.com/scikit-learn/scikit-learn/pull/3422
โจ๊ก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.