সমস্যাটি
আমি একটি সাধারণ 2-গাউসীয় মিশ্রণের জনসংখ্যার মডেল পরামিতিগুলি ফিট করতে চাই। বায়েশিয়ান পদ্ধতিগুলির চারপাশে সমস্ত হাইপ দেওয়া আছে আমি বুঝতে চাই যে এই সমস্যার জন্য বায়েশিয়ান অনুমানটি একটি উত্তম সরঞ্জাম যা traditionalতিহ্যবাহী মানানসই পদ্ধতিগুলি।
এখনও অবধি এমসিএমসি এই খেলনা উদাহরণটিতে খুব খারাপভাবে সম্পাদন করে তবে সম্ভবত আমি কিছু উপেক্ষা করেছি। সুতরাং কোড দেখতে দিন।
সরঞ্জাম
আমি পাইথন (2.7) + স্কিপি স্ট্যাক, এলএমফিট 0.8 এবং পাইএমসি 2.3 ব্যবহার করব।
বিশ্লেষণ পুনরুত্পাদন করার জন্য একটি নোটবুক এখানে পাওয়া যাবে
ডেটা তৈরি করুন
প্রথমে ডেটা তৈরি করা যাক:
from scipy.stats import distributions
# Sample parameters
nsamples = 1000
mu1_true = 0.3
mu2_true = 0.55
sig1_true = 0.08
sig2_true = 0.12
a_true = 0.4
# Samples generation
np.random.seed(3) # for repeatability
s1 = distributions.norm.rvs(mu1_true, sig1_true, size=round(a_true*nsamples))
s2 = distributions.norm.rvs(mu2_true, sig2_true, size=round((1-a_true)*nsamples))
samples = np.hstack([s1, s2])
হিস্টোগ্রাম এর samples
মতো দেখতে:
একটি "বিস্তৃত শীর্ষ", উপাদানগুলি চোখের দ্বারা স্পট করা শক্ত।
শাস্ত্রীয় পদ্ধতির: হিস্টোগ্রামে ফিট করুন
প্রথমে ধ্রুপদী পদ্ধতির চেষ্টা করি। এলএমফিট ব্যবহার করে এটি 2-পিক্স মডেল সংজ্ঞায়িত করা সহজ:
import lmfit
peak1 = lmfit.models.GaussianModel(prefix='p1_')
peak2 = lmfit.models.GaussianModel(prefix='p2_')
model = peak1 + peak2
model.set_param_hint('p1_center', value=0.2, min=-1, max=2)
model.set_param_hint('p2_center', value=0.5, min=-1, max=2)
model.set_param_hint('p1_sigma', value=0.1, min=0.01, max=0.3)
model.set_param_hint('p2_sigma', value=0.1, min=0.01, max=0.3)
model.set_param_hint('p1_amplitude', value=1, min=0.0, max=1)
model.set_param_hint('p2_amplitude', expr='1 - p1_amplitude')
name = '2-gaussians'
পরিশেষে আমরা মডেলটিকে সিমপ্লেক্স অ্যালগরিদম দিয়ে ফিট করি:
fit_res = model.fit(data, x=x_data, method='nelder')
print fit_res.fit_report()
ফলাফলটি নিম্নলিখিত চিত্র (লাল ড্যাশযুক্ত লাইনগুলি লাগানো কেন্দ্রগুলি):
এমনকি সমস্যাটি এক ধরণের কঠিন, যথাযথ প্রাথমিক মান এবং সীমাবদ্ধতা সহ মডেলগুলিকে বেশ যুক্তিসঙ্গত অনুমানে রূপান্তরিত করে।
বায়েশিয়ান পদ্ধতির: এমসিএমসি
আমি পিএএমসি-র মডেলকে হায়ারার্কিকাল ফ্যাশনে সংজ্ঞা দিয়েছি। centers
এবং sigmas
2 গৌসিয়ানদের 2 কেন্দ্র এবং 2 সিগমাস উপস্থাপনকারী হাইপারপ্রেমেটারগুলির জন্য প্রাইরিদের বিতরণ। alpha
প্রথম জনসংখ্যার ভগ্নাংশ এবং পূর্ব বিতরণটি এখানে একটি বিটা।
দুটি জনসংখ্যার মধ্যে একটি শ্রেণীবদ্ধ পরিবর্তনশীল চয়ন করে। এটি আমার বোধগম্য যে এই পরিবর্তনশীলটি ডেটা ( samples
) এর মতো আকারের হওয়া দরকার ।
পরিশেষে mu
এবং হ'ল tau
ডিটারমিনিস্টিক ভেরিয়েবলগুলি যা সাধারণ বিতরণের প্যারামিটারগুলি নির্ধারণ করে (তারা category
ভেরিয়েবলের উপর নির্ভর করে যাতে তারা এলোমেলোভাবে দুটি জনসংখ্যার জন্য দুটি মানের মধ্যে পরিবর্তন করে)
sigmas = pm.Normal('sigmas', mu=0.1, tau=1000, size=2)
centers = pm.Normal('centers', [0.3, 0.7], [1/(0.1)**2, 1/(0.1)**2], size=2)
#centers = pm.Uniform('centers', 0, 1, size=2)
alpha = pm.Beta('alpha', alpha=2, beta=3)
category = pm.Categorical("category", [alpha, 1 - alpha], size=nsamples)
@pm.deterministic
def mu(category=category, centers=centers):
return centers[category]
@pm.deterministic
def tau(category=category, sigmas=sigmas):
return 1/(sigmas[category]**2)
observations = pm.Normal('samples_model', mu=mu, tau=tau, value=samples, observed=True)
model = pm.Model([observations, mu, tau, category, alpha, sigmas, centers])
তারপরে আমি এমসিএমসি চালাচ্ছি বেশ দীর্ঘ সংখ্যক পুনরাবৃত্তি (আমার মেশিনে 1e5, ~ 60s) দিয়ে:
mcmc = pm.MCMC(model)
mcmc.sample(100000, 30000)
এছাড়াও গাউসিয়ানদের কেন্দ্রগুলিও রূপান্তর করে না। উদাহরণ স্বরূপ:
তাহলে এখানে কি হচ্ছে? আমি কি কিছু ভুল করছি বা এমসিএমসি এই সমস্যার জন্য উপযুক্ত নয়?
আমি বুঝতে পেরেছি যে এমসিসিএম পদ্ধতিটি ধীর হবে, তবে তুচ্ছ হিস্টোগ্রাম ফিট জনসংখ্যার সমাধানে অপরিসীম পরিবেশ সম্পাদন করেছে বলে মনে হচ্ছে।
proposal_distribution
এবংproposal_sd
এবং কেন ব্যবহারPrior
শ্রেণীগত ভেরিয়েবল জন্য ভাল?