গড় এবং স্ট্যান্ডার্ড বিচ্যুতি অনুমান করার জন্য এখানে প্রত্যাশা ম্যাক্সিমাইজেশন (ইএম) এর একটি উদাহরণ রয়েছে। কোডটি পাইথনে রয়েছে, তবে আপনি ভাষাটির সাথে পরিচিত না থাকলেও এটি অনুসরণ করা সহজ হওয়া উচিত।
ইমের জন্য প্রেরণা
নীচে দেখানো লাল এবং নীল পয়েন্ট দুটি পৃথক সাধারণ বিতরণ থেকে আঁকা, যার প্রতিটি নির্দিষ্ট গড় এবং মানক বিচ্যুতি:
লাল বিতরণের জন্য "সত্য" গড় এবং স্ট্যান্ডার্ড বিচ্যুতি পরামিতিগুলির যুক্তিসঙ্গত অনুমানগুলি গণনা করতে আমরা খুব সহজেই লাল পয়েন্টগুলিতে নজর দিতে পারি এবং প্রত্যেকের অবস্থান রেকর্ড করতে পারি, এবং তারপরে পরিচিত সূত্রগুলি (এবং একইভাবে নীল দলের জন্য) ব্যবহার করতে পারি ।
এখন কেসটি বিবেচনা করুন যেখানে আমরা জানি যে পয়েন্টের দুটি গ্রুপ রয়েছে তবে আমরা দেখতে পাচ্ছি না কোন পয়েন্টটি কোন গ্রুপের অন্তর্গত। অন্য কথায়, রঙগুলি লুকানো রয়েছে:
কীভাবে পয়েন্টগুলি দুটি গ্রুপে ভাগ করা যায় তা মোটেই সুস্পষ্ট নয়। আমরা এখন কেবলমাত্র লাল বিতরণ বা নীল বিতরণের পরামিতিগুলির অবস্থানগুলি এবং গণনা অনুমানগুলি সন্ধান করতে অক্ষম।
এই সমস্যাটি সমাধান করতে ইএম ব্যবহার করা যেতে পারে।
প্যারামিটারগুলি অনুমান করতে EM ব্যবহার করা হচ্ছে
উপরে বর্ণিত পয়েন্টগুলি তৈরি করতে এখানে কোড ব্যবহৃত হচ্ছে। আপনি যে পয়েন্টগুলি থেকে আঁকেন সেগুলি সাধারণ বিতরণের প্রকৃত উপায় এবং মানক বিচ্যুতিগুলি আপনি দেখতে পারেন। ভেরিয়েবলগুলি red
এবং blue
লাল এবং নীল দলের প্রতিটি পয়েন্টের অবস্থান যথাক্রমে ধরে রাখুন:
import numpy as np
from scipy import stats
np.random.seed(110) # for reproducible random results
# set parameters
red_mean = 3
red_std = 0.8
blue_mean = 7
blue_std = 2
# draw 20 samples from normal distributions with red/blue parameters
red = np.random.normal(red_mean, red_std, size=20)
blue = np.random.normal(blue_mean, blue_std, size=20)
both_colours = np.sort(np.concatenate((red, blue)))
আমরা যদি পারে প্রতিটি বিন্দু রঙ দেখতে, যদি আমরা চেষ্টা উপায়ে এবং স্ট্যান্ডার্ড ডেভিয়েশন গ্রন্থাগার ফাংশন ব্যবহার করে পুনরুদ্ধার হবে:
>>> np.mean(red)
2.802
>>> np.std(red)
0.871
>>> np.mean(blue)
6.932
>>> np.std(blue)
2.195
তবে যেহেতু রঙগুলি আমাদের থেকে লুকানো রয়েছে, তাই আমরা ইএম প্রক্রিয়াটি শুরু করব ...
প্রথমত, আমরা কেবলমাত্র প্রতিটি গ্রুপের পরামিতিগুলির জন্য মানগুলি অনুমান করি ( পদক্ষেপ 1 )। এই অনুমানগুলি ভাল হতে হবে না:
# estimates for the mean
red_mean_guess = 1.1
blue_mean_guess = 9
# estimates for the standard deviation
red_std_guess = 2
blue_std_guess = 1.7
খুব খারাপ অনুমান - এর অর্থ দেখতে দেখতে পয়েন্টগুলির একটি গ্রুপের কোনও "মাঝারি" থেকে তারা অনেক দূরে।
ইএম দিয়ে চালিয়ে যেতে এবং এই অনুমানগুলি উন্নত করার জন্য, আমরা প্রতিটি ডেটা পয়েন্টের (তার গোপন বর্ণ নির্বিশেষে) গড় এবং মানক বিচ্যুতি ( পদক্ষেপ 2 ) এর জন্য এই অনুমানগুলির অধীনে উপস্থিত হওয়ার সম্ভাবনা গণনা করি ।
ভেরিয়েবল both_colours
প্রতিটি ডাটা পয়েন্ট ধারণ করে। ফাংশন stats.norm
প্রদত্ত প্যারামিটারগুলির সাথে সাধারণ বিতরণের আওতায় পয়েন্টটির সম্ভাব্যতা গণনা করে:
likelihood_of_red = stats.norm(red_mean_guess, red_std_guess).pdf(both_colours)
likelihood_of_blue = stats.norm(blue_mean_guess, blue_std_guess).pdf(both_colours)
এটি আমাদের বলে, উদাহরণস্বরূপ, আমাদের বর্তমান অনুমানের সাথে ডেটা পয়েন্টটি 1.761 এ নীল (0.00003) এর চেয়ে লাল (0.189) হওয়ার বেশি সম্ভাবনা রয়েছে।
আমরা এই দুটি সম্ভাব্য মানকে ওজনে ( পদক্ষেপ 3 ) রূপান্তর করতে পারি যাতে সেগুলি নীচে হিসাবে 1 এর সমষ্টি হয়:
likelihood_total = likelihood_of_red + likelihood_of_blue
red_weight = likelihood_of_red / likelihood_total
blue_weight = likelihood_of_blue / likelihood_total
আমাদের বর্তমান অনুমান এবং আমাদের নতুন-গণনা করা ওজন সহ, আমরা এখন প্যারামিটারগুলির জন্য ধাপ 4 ( ধাপ 4 ) নতুন, সম্ভবত আরও ভাল গণনা করতে পারি । আমাদের গড়ের জন্য একটি ক্রিয়া এবং মান বিচ্যুতির জন্য একটি ফাংশন প্রয়োজন:
def estimate_mean(data, weight):
return np.sum(data * weight) / np.sum(weight)
def estimate_std(data, weight, mean):
variance = np.sum(weight * (data - mean)**2) / np.sum(weight)
return np.sqrt(variance)
এগুলি ডেটাগুলির গড় এবং স্ট্যান্ডার্ড বিচ্যুতিতে সাধারণ ফাংশনগুলির সাথে খুব মিল। পার্থক্যটি হ'ল একটি weight
প্যারামিটার ব্যবহার যা প্রতিটি ডাটা পয়েন্টকে একটি ওজন নির্ধারণ করে।
এই ওজনকে EM এর মূল চাবিকাঠি। কোনও ডাটা পয়েন্টে কোনও রঙের ওজন যত বেশি হয়, তত বেশি ডেটা পয়েন্ট সেই কলরের প্যারামিটারগুলির জন্য পরবর্তী অনুমানগুলিকে প্রভাবিত করে। শেষ পর্যন্ত, এটি প্রতিটি প্যারামিটারটিকে সঠিক দিকে টানানোর প্রভাব ফেলে।
নতুন অনুমানগুলি এই ফাংশনগুলির সাথে গণনা করা হয়:
# new estimates for standard deviation
blue_std_guess = estimate_std(both_colours, blue_weight, blue_mean_guess)
red_std_guess = estimate_std(both_colours, red_weight, red_mean_guess)
# new estimates for mean
red_mean_guess = estimate_mean(both_colours, red_weight)
blue_mean_guess = estimate_mean(both_colours, blue_weight)
EM প্রক্রিয়াটি এই ধাপে দ্বিতীয় ধাপ থেকে পরবর্তী ধাপে পুনরাবৃত্তি হয়। প্রদত্ত সংখ্যার পুনরাবৃত্তির জন্য পদক্ষেপগুলি পুনরায় বলতে পারি (20 বলুন), বা প্যারামিটারগুলি রূপান্তর না হওয়া পর্যন্ত।
পাঁচটি পুনরাবৃত্তির পরে, আমরা দেখতে পাই আমাদের প্রাথমিক খারাপ অনুমানগুলি আরও ভাল হতে শুরু করে:
20 টি পুনরাবৃত্তির পরে, EM প্রক্রিয়াটি কমবেশি রূপান্তরিত হয়েছে:
তুলনার জন্য, এখানে ইএম প্রক্রিয়াটির ফলাফলগুলি গণনা করা মানের সাথে তুলনা করা হয় যেখানে রঙের তথ্য গোপন করা হয় না:
| EM guess | Actual
----------+----------+--------
Red mean | 2.910 | 2.802
Red std | 0.854 | 0.871
Blue mean | 6.838 | 6.932
Blue std | 2.227 | 2.195
দ্রষ্টব্য: এই উত্তরটি এখানে স্ট্যাক ওভারফ্লোতে আমার উত্তর থেকে অভিযোজিত হয়েছিল ।