t-SNE পাইথন বাস্তবায়ন: কুলব্যাক-লেবেলার বিচ্যুতি


11

টি-এসএনই, [১] এর মতো একটি নির্দিষ্ট শর্ত পূরণ না হওয়া অবধি ক্রমান্বয়ে কুলব্যাক-লেবলার (কেএল) বিচ্যুতি হ্রাস করে কাজ করে। টি-এসএনই-এর নির্মাতারা কেএল ডাইভার্জেন্সকে ভিজ্যুয়ালাইজেশনের জন্য পারফরম্যান্সের মানদণ্ড হিসাবে ব্যবহার করার পরামর্শ দিয়েছেন:

আপনি টি-এসএনই রিপোর্টগুলির কুলব্যাক-লেবলার ডাইভারজেন্সগুলির সাথে তুলনা করতে পারবেন। দশবার টি-এসএনই চালানো পুরোপুরি ঠিক আছে, এবং সর্বনিম্ন কেএল ডাইভারজেন্স সহ সমাধানটি নির্বাচন করুন [২]

আমি টি এসএনই এর দুটি বাস্তবায়ন চেষ্টা করেছি:

  • অজগর : sklearn.manifold.TSNE ()।
  • আর : tsne, লাইব্রেরি থেকে (tsne)।

এই উভয় বাস্তবায়ন, যখন ভার্বোসিটি সেট করা হয়, প্রতিটি পুনরাবৃত্তির জন্য ত্রুটি (কুলব্যাক-লেবেলার বিচ্যুতি) মুদ্রণ করুন। তবে তারা ব্যবহারকারীকে এই তথ্যটি পেতে দেয় না, যা আমার কাছে কিছুটা অদ্ভুত লাগে looks

উদাহরণস্বরূপ, কোড:

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 কে কেএল ডাইভার্জেন্স হওয়া উচিত। তবে আমি এই তথ্যটি মডেল বা টি থেকে পাই না (যা একটি সাধারণ নাম্পার.অ্যান্ডারায়)।

এই সমস্যার সমাধান করতে আমি পারলাম: i) আমার নিজের দ্বারা কেএল ডাইভারজেন্স গণনা করুন, ii) টিএসএনই () ফাংশনটির আউটপুট [3] ক্যাপচার এবং পার্সিংয়ের জন্য অজগরটিতে খারাপ কিছু করুন। তবে: i) কেএল ডাইভারজেনটি পুনরায় গণনা করতে বেশ বোকা হবে, যখন টিএসএনই () ইতিমধ্যে এটি গণনা করেছে, ii) কোডের ক্ষেত্রে কিছুটা অস্বাভাবিক হবে।

আপনার কি অন্য কোনও পরামর্শ আছে? এই লাইব্রেরিটি ব্যবহার করে এই তথ্য পাওয়ার কোনও মানক উপায় আছে?

আমি উল্লেখ করেছি যে আমি আর এর tsne গ্রন্থাগার চেষ্টা করেছি , তবে আমি পাইথন স্ক্লার্ন বাস্তবায়নে ফোকাস দেওয়ার উত্তরগুলি পছন্দ করব ।


তথ্যসূত্র

[1] http://nbviewer.ipython.org/urls/gist.githubusercontent.com/AlexenderFabisch/1a0c648de22eff4a2a3e/raw/59d5bc5ed8f8bfd9ff1f7faa749d1b095aa97d5a/t-SNEE.Ep

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

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

উত্তর:


4

বিজ্ঞান-শিখার টিএসএনই উত্সটি খাঁটি পাইথন-এ রয়েছে। ফিট fit_transform()পদ্ধতিটি আসলে একটি ব্যক্তিগত _fit()ফাংশনকে কল করে যা তারপরে একটি ব্যক্তিগত _tsne()ফাংশনকে ডাকে । এই _tsne()ফাংশনে একটি স্থানীয় ভেরিয়েবল রয়েছে errorযা ফিটের শেষে প্রিন্ট করা হয়। দেখে মনে হচ্ছে আপনি খুব সহজেই সেই মানটি ফিরে আসতে উত্স কোডের এক বা দুটি লাইন পরিবর্তন করতে পারেন fit_transform()


মূলত আমি যা করতে পারি তা হ'ল _tsne () এর শেষে self.error = ত্রুটি সেট করা, পরে এটি টিএসএনই উদাহরণ থেকে পুনরুদ্ধার করার জন্য। হ্যাঁ, তবে এর অর্থ হবে sklearn.manifold কোড পরিবর্তন করা, এবং আমি ভাবছিলাম যে বিকাশকারীরা তথ্য পাওয়ার জন্য অন্য কিছু উপায় নিয়ে ভাবেন বা না কেন তারা কেন করেন নি (যেমন: তাদের দ্বারা 'ত্রুটি' অকেজো বলে বিবেচিত হয়?)। তদ্ব্যতীত, আমি যদি সেই কোডটি পরিবর্তন করি তবে আমার কোড চালিত সমস্ত লোকের স্ক্লার্ন ইনস্টলেশনগুলিতে একই হ্যাক করার প্রয়োজন হবে। আপনার পরামর্শ অনুসারে কি এটিই নাকি আমি ভুল পেয়েছি?
জোকার

হ্যাঁ, এটিই আমি সম্ভাব্য সমাধান হিসাবে পরামর্শ দিয়েছি। যেহেতু স্কাইকিট-লার্ন ওপেন সোর্স, আপনি নিজের সমাধানটি একটি টানার অনুরোধ হিসাবেও জমা দিতে পারেন এবং দেখুন যে লেখকরা ভবিষ্যতে প্রকাশে এটি অন্তর্ভুক্ত করবেন কিনা। কেন তারা বিভিন্ন জিনিস অন্তর্ভুক্ত করেছিল বা না করায় আমি তার সাথে কথা বলতে পারি না।
ট্রে

2
ধন্যবাদ। অন্য কেউ যদি এতে আগ্রহী হন, github.com/scikit-learn/scikit-learn/pull/3422
জোকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.