পাইথনে কেএল ডাইভারজেন গণনা করা হচ্ছে


22

আমি এটির পরিবর্তে নতুন এবং এটির পিছনে তাত্ত্বিক ধারণা সম্পর্কে আমার সম্পূর্ণ ধারণা আছে তা বলতে পারি না। আমি পাইথনের কয়েকটি পয়েন্টের তালিকার মধ্যে কেএল ডাইভারজেন গণনা করার চেষ্টা করছি। আমি এটি ব্যবহার করার জন্য http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mutual_info_score.html ব্যবহার করছি । যে সমস্যাটির মধ্যে আমি চালিয়ে যাচ্ছি তা হ'ল মানটি যে কোনও 2 টি সংখ্যার তালিকার জন্য (এটির 1.3862943611198906) একই। আমার অনুভূতি আছে যে আমি এখানে কিছু ধরণের তাত্ত্বিক ভুল করছি তবে এটি স্পষ্ট করতে পারছি না।

values1 = [1.346112,1.337432,1.246655]
values2 = [1.033836,1.082015,1.117323]
metrics.mutual_info_score(values1,values2)

এটি আমি যা চালাচ্ছি তার একটি উদাহরণ - কেবলমাত্র যে কোনও 2 ইনপুটের জন্য আমি একই আউটপুট পাচ্ছি। কোন পরামর্শ / সহায়তা প্রশংসা হবে!


কেএল দ্বারা, আপনি কি কুলব্যাক-লেবেলার বিচরণ বোঝাতে চান?
দাওয়ানি 33

হ্যাঁ, ঠিক তাই!
নন্দ

দৌড়ে sklearn.metrics.mutual_info_score([1.346112,1.337432,1.246655], [1.033836,1.082015,1.117323]), আমি মান পেতে 1.0986122886681096
ডওয়ানি 33

দুঃখিত, আমি মান 1 [1, 1.346112,1.337432,1.246655] এবং 2 এর মান 2 হিসাবে [1,1.033836,1.082015,1.117323] হিসাবে ব্যবহার করছি এবং তাই পার্থক্যের মান।
নন্দা

উত্তর:


18

প্রথমত, ক্লাস্টারিং ফলাফলগুলি মূল্যায়নের জন্য পারস্পরিক তথ্যsklearn.metrics.mutual_info_score প্রয়োগ করে , খাঁটি কুলব্যাক-লেবেলার বিচ্যুতি নয়!

এটি প্রান্তিকের পণ্য বিতরণের সাথে যৌথ বন্টনের কুলব্যাক-লেবেলার বিচরণের সমান।

কেএল ডাইভার্জেন্স (এবং এই জাতীয় কোনও পরিমাপ) ইনপুট ডেটার সমষ্টি 1 হওয়ার আশা করে । তা না হলে, তারা না সঠিক সম্ভাব্যতা ডিস্ট্রিবিউশন । যদি আপনার ডেটাতে 1 এর যোগফল না থাকে তবে সম্ভবত কেএল ডাইভারজেন্স ব্যবহার করা যথাযথ নয়! (কিছু ক্ষেত্রে, 1 টিরও কম পরিমাণের সমষ্টি হওয়া যেমন গ্রহণযোগ্য হতে পারে, উদাহরণস্বরূপ ডেটা হারিয়ে যাওয়ার ক্ষেত্রে))

আরও মনে রাখবেন যে বেস 2 লোগারিদম ব্যবহার করা সাধারণ। এটি কেবলমাত্র তফাতটিতে একটি ধ্রুবক স্কেলিং ফ্যাক্টর দেয়, তবে বেস 2 লোগারিদমগুলি ব্যাখ্যা করা আরও সহজ এবং আরও স্বজ্ঞাত স্কেল (0 থেকে লগ 2 এর পরিবর্তে 0 থেকে 1 = 0.69314 ..., বিটের পরিবর্তে বিটগুলিতে তথ্য পরিমাপ করা)।

> sklearn.metrics.mutual_info_score([0,1],[1,0])
0.69314718055994529

যেমন আমরা স্পষ্ট দেখতে পাচ্ছি, স্কলারনের এমআই ফলাফলটি লগ 2 এর পরিবর্তে প্রাকৃতিক লোগারিদম ব্যবহার করে মাপা যায়। এটি উপরে বর্ণিত হিসাবে দুর্ভাগ্যজনক পছন্দ।

দুর্ভাগ্যক্রমে কুলব্যাক-লেবেলার বিচ্যুতি ভঙ্গুর। উপরের উদাহরণে এটি যথাযথভাবে সংজ্ঞায়িত করা হয়নি: KL([0,1],[1,0])শূন্য দ্বারা বিভাজন ঘটায় এবং অনন্তের দিকে ঝুঁকে পড়ে। এটি অসম্পূর্ণও


মনে রাখবেন যে যখন scipy.stats.entropyএটি ব্যবহার করা হবে তখন এটি সম্ভাব্যতাগুলির মধ্যে একটিকে স্বাভাবিক করে তুলবে। দস্তাবেজগুলি থেকে ( scipy.github.io/devdocs/generated/scipy.stats.entropy.html ): "এই রুটিনটি পিকে এবং কিউকে যদি 1 এর সমষ্টি না করে তবে স্বাভাবিক করবে" "
ইটামার মুশকিন

15

স্কিপির এনট্রপি ফাংশন দুটি ভেক্টর পি এবং কিউ, যদি প্রত্যেকে সম্ভাব্যতা বন্টনকে উপস্থাপন করে, ফিড দেয় তবে কেএল ডাইভারজেন গণনা করবে। যদি দুটি ভেক্টর পিডিএফ না হয় তবে এটি প্রথমে প্রথমে স্বাভাবিক হবে।

পারস্পরিক তথ্য সম্পর্কিত, তবে কেএল ডাইভারজেন্সের মতো নয়

"এই ওজনযুক্ত পারস্পরিক তথ্যকে ওজনযুক্ত কেএল-ডাইভারজেন্সের একটি রূপ, যা কিছু ইনপুটগুলির জন্য নেতিবাচক মান গ্রহণ করে এবং এমন কিছু উদাহরণ রয়েছে যেখানে ওজনযুক্ত পারস্পরিক তথ্য নেতিবাচক মূল্যবোধও গ্রহণ করে"


6

আমি সাইকিটলার্ন বাস্তবায়নের সাথে নিশ্চিত নই, তবে পাইথনে কেএল ডাইভারজেন্সের দ্রুত বাস্তবায়ন এখানে দেওয়া হয়েছে:

import numpy as np

def KL(a, b):
    a = np.asarray(a, dtype=np.float)
    b = np.asarray(b, dtype=np.float)

    return np.sum(np.where(a != 0, a * np.log(a / b), 0))


values1 = [1.346112,1.337432,1.246655]
values2 = [1.033836,1.082015,1.117323]

print KL(values1, values2)

আউটপুট: 0.775279624079

কিছু লাইব্রেরিতে প্রয়োগের দ্বন্দ্ব থাকতে পারে , তাই ব্যবহারের আগে নিশ্চিত হয়ে নিন যে আপনি তাদের ডক্সটি পড়েছেন।


1
আমি এটি চেষ্টাও করেছিলাম তবে এটি নেতিবাচক মানগুলি ফিরিয়েছিল যা আমার মনে হয়, এটি কোনও বৈধ মান নয়। এরপরে অল্প কিছু গবেষণা আমাকে এই ফলাফলটিতে পেয়ে গেল mathoverflow.net/questions/43849/… যা ইনপুটটি কীভাবে সম্ভাব্য বন্টন হতে পারে সে সম্পর্কে আলোচনা করে। এখানেই আমার ভুল হয়েছে বলে অনুমান করুন।
নন্দা 11

@ নন্দা লিঙ্কটির জন্য ধন্যবাদ। আমার 0.775279624079আপনার ইনপুটগুলির জন্য ফেরত দেয় এবং স্কলারন মেট্রিক্স ফেরত দেয় 1.3862943611198906। এখনও বিভ্রান্ত! তবে, স্ক্রিপ্টে
QN

1
আমি জানি তুমি কী বোঝাতে চাও! ফলাফলটি সঠিকভাবে অনুভব করে না বলে তাদের মধ্যে 3 টি পৃথক মান পেতে 3 টি বিভিন্ন ফাংশন চেষ্টা করেছি। ইনপুট মানগুলি অবশ্যই একটি যৌক্তিক ত্রুটি তাই আমার পদ্ধতির পুরোপুরি পরিবর্তন করে!
নন্দা

@Nanda আহা, এখন পরিষ্কার :) ব্যাখ্যা করার জন্য ধন্যবাদ
Dawny33

2

এই কৌশলটি শর্তযুক্ত কোড এড়ায় এবং সেইজন্য আরও ভাল পারফরম্যান্স সরবরাহ করতে পারে।

import numpy as np

def KL(P,Q):
""" Epsilon is used here to avoid conditional code for
checking that neither P nor Q is equal to 0. """
     epsilon = 0.00001

     # You may want to instead make copies to avoid changing the np arrays.
     P = P+epsilon
     Q = Q+epsilon

     divergence = np.sum(P*np.log(P/Q))
     return divergence

# Should be normalized though
values1 = np.asarray([1.346112,1.337432,1.246655])
values2 = np.asarray([1.033836,1.082015,1.117323])

# Note slight difference in the final result compared to Dawny33
print KL(values1, values2) # 0.775278939433

দুর্দান্ত কৌশল! আমি কীভাবে এটি একটি সময়ের মানদণ্ডে অন্যান্য সমাধানের সাথে তুলনা করে তা দেখতে আগ্রহী।
অবশ্যই

0

বিতরণ (গুলি) থেকে নিম্নলিখিত তিনটি নমুনা বিবেচনা করুন।

values1 = np.asarray([1.3,1.3,1.2])
values2 = np.asarray([1.0,1.1,1.1])
values3 = np.array([1.8,0.7,1.7])

স্পষ্টতই, মান 1 এবং মান 2 আরও কাছাকাছি, তাই আমরা মান 3 এর surpriseসাথে তুলনা করার সময় কম হওয়া বা এনট্রপি আশা করি ।

from scipy.stats import entropy
print("\nIndividual Entropy\n")
print(entropy(values1))
print(entropy(values2))
print(entropy(values3))

print("\nPairwise Kullback Leibler divergence\n")
print(entropy(values1, qk=values2))
print(entropy(values1, qk=values3))
print(entropy(values2, qk=values3))

আমরা নিম্নলিখিত আউটপুট দেখতে:

Individual Entropy

1.097913446793334
1.0976250611902076
1.0278436769863724 #<--- this one had the lowest, but doesn't mean much.

Pairwise Kullback Leibler divergence

0.002533297351606588
0.09053972625203921 #<-- makes sense
0.09397968199352116 #<-- makes sense

আমরা এটি উপলব্ধি করতে দেখছি কারণ মান 1 এবং মান 3 এবং মান 2 এবং মান 3 এর মধ্যে মানগুলি মান 1 থেকে 2 মান পরিবর্তনের পরিবর্তে আরও কঠোর হয় K কেএল-ডি এবং এটির জন্য প্যাকেজগুলি প্যাকেজগুলি বোঝার জন্য এটি আমার বৈধতা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.