এমসিএমসি এবং পাইএমসির সাথে 2-গাউসীয় মিশ্রণের মডেল


10

সমস্যাটি

আমি একটি সাধারণ 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এবং sigmas2 গৌসিয়ানদের 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)

α

MCMC আলফা সারাংশ

এছাড়াও গাউসিয়ানদের কেন্দ্রগুলিও রূপান্তর করে না। উদাহরণ স্বরূপ:

এমসিএমসি কেন্দ্রগুলি সারসংক্ষেপ

α

তাহলে এখানে কি হচ্ছে? আমি কি কিছু ভুল করছি বা এমসিএমসি এই সমস্যার জন্য উপযুক্ত নয়?

আমি বুঝতে পেরেছি যে এমসিসিএম পদ্ধতিটি ধীর হবে, তবে তুচ্ছ হিস্টোগ্রাম ফিট জনসংখ্যার সমাধানে অপরিসীম পরিবেশ সম্পাদন করেছে বলে মনে হচ্ছে।

উত্তর:


6

পিআইএমসি যেভাবে এই মডেলের জন্য নমুনাগুলি আঁকছে তাতে সমস্যা দেখা দিয়েছে। হিসাবে ব্যাখ্যা করা অধ্যায় 5.8.1 PyMC নথিপত্রের, একটি বিন্যাস ভেরিয়েবলের সব উপাদান একসঙ্গে আপডেট করা হয়। এর মতো ছোট অ্যারেগুলির জন্য centerকোনও সমস্যা নয়, তবে categoryএটির মতো বৃহত অ্যারের জন্য এটি গ্রহণযোগ্যতার হারকে বাড়ে। এর মাধ্যমে আপনি গ্রহণযোগ্যতার হার দেখতে পাবেন

print mcmc.step_method_dict[category][0].ratio

ডকুমেন্টেশনে প্রস্তাবিত সমাধানটি হল স্কেলার-ভেলিয়েবলের অ্যারে ব্যবহার করা। এছাড়াও, আপনাকে ডিফল্ট পছন্দগুলি খারাপ হওয়ার কারণে প্রস্তাবনা বিতরণগুলির কয়েকটি কনফিগার করতে হবে। এখানে কোডটি আমার পক্ষে কাজ করে:

import pymc as pm
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)
alpha  = pm.Beta('alpha', alpha=2, beta=3)
category = pm.Container([pm.Categorical("category%i" % i, [alpha, 1 - alpha]) 
                         for i in range(nsamples)])
observations = pm.Container([pm.Normal('samples_model%i' % i, 
                   mu=centers[category[i]], tau=1/(sigmas[category[i]]**2), 
                   value=samples[i], observed=True) for i in range(nsamples)])
model = pm.Model([observations, category, alpha, sigmas, centers])
mcmc = pm.MCMC(model)
# initialize in a good place to reduce the number of steps required
centers.value = [mu1_true, mu2_true]
# set a custom proposal for centers, since the default is bad
mcmc.use_step_method(pm.Metropolis, centers, proposal_sd=sig1_true/np.sqrt(nsamples))
# set a custom proposal for category, since the default is bad
for i in range(nsamples):
    mcmc.use_step_method(pm.DiscreteMetropolis, category[i], proposal_distribution='Prior')
mcmc.sample(100)  # beware sampling takes much longer now
# check the acceptance rates
print mcmc.step_method_dict[category[0]][0].ratio
print mcmc.step_method_dict[centers][0].ratio
print mcmc.step_method_dict[alpha][0].ratio

proposal_sdএবং proposal_distributionঅপশন ব্যাখ্যা করা আছে অধ্যায় 5.7.1 । কেন্দ্রগুলির জন্য, আমি পোস্টেরিয়রের স্ট্যান্ডার্ড বিচ্যুতির সাথে মোটামুটিভাবে মিলানোর প্রস্তাবটি সেট করেছিলাম, যা ডেটার পরিমাণের কারণে ডিফল্টের চেয়ে অনেক ছোট। পিএমসি প্রস্তাবের প্রস্থের সাথে সামঞ্জস্য করার চেষ্টা করে, তবে এটি কেবল তখনই কার্যকর হয় যদি আপনার গ্রহণযোগ্যতার হার শুরু হওয়ার জন্য পর্যাপ্ত পরিমাণে বেশি থাকে। কারণ category, ডিফল্ট proposal_distribution = 'Poisson'যা খারাপ ফলাফল দেয় (আমি জানি না এটি কেন, তবে এটি অবশ্যই বাইনারি ভেরিয়েবলের জন্য কোনও বুদ্ধিমান প্রস্তাবের মতো মনে হয় না)।


ধন্যবাদ, এটি সত্যিই দরকারী, যদিও এটি প্রায় অসহ্যভাবে ধীর হয়ে যায়। আপনি সংক্ষেপে অর্থ ব্যাখ্যা করতে পারবেন proposal_distributionএবং proposal_sdএবং কেন ব্যবহার Priorশ্রেণীগত ভেরিয়েবল জন্য ভাল?
ব্যবহারকারী2304916

ধন্যবাদ, টম আমি একমত যে পোইসন এখানে একটি বিজোড় পছন্দ। আমি একটি সমস্যা খুলেছি
twiecki

2

σ

sigmas = pm.Exponential('sigmas', 0.1, size=2)

হালনাগাদ:

আমি আপনার মডেলের এই অংশগুলি পরিবর্তন করে ডেটার প্রাথমিক পরামিতিগুলির কাছাকাছি পৌঁছেছি:

sigmas = pm.Exponential('sigmas', 0.1, size=2)
alpha  = pm.Beta('alpha', alpha=1, beta=1)

এবং কিছু পাতলা করে এমসিএমসি'র সাহায্যে:

mcmc.sample(200000, 3000, 10)

ফলাফল:

আরম্ভ

সেন্টার

sigmas

পোস্টারিয়রগুলি আপনি খুব সুন্দর নন ... বিইউজিএস বইয়ের ১১..6 ধারায় তারা এই ধরণের মডেল নিয়ে আলোচনা করেন এবং উল্লেখ করেন যে সুস্পষ্ট সমাধান ছাড়াই রূপান্তর সমস্যা রয়েছে। এখানেও চেক করুন


এটি একটি ভাল পয়েন্ট, আমি এখন গামা ব্যবহার করছি। তবুও আলফা ট্রেস সর্বদা 0 (0.4 এর পরিবর্তে) থাকে। আমার উদাহরণটিতে কিছু বোকা বাগ লুক্কায়িত থাকলে আমি অবাক হই।
ব্যবহারকারীর 30304916

আমি গ্যামার (.1, .1) চেষ্টা করেছি তবে এক্সপ (.1) ভাল কাজ করছে বলে মনে হচ্ছে। এছাড়াও, যখন mcmc.sample(60000, 3000, 3)
স্বতঃসংশোধন

2

এছাড়াও, মিশ্রণ মডেলগুলির জন্য MCMC ব্যবহারের জন্য অ-সনাক্তকরণযোগ্যতা একটি বড় সমস্যা। মূলত, আপনি যদি নিজের ক্লাস্টারের অর্থ এবং ক্লাস্টার কার্যভারগুলিতে লেবেলগুলি স্যুইচ করেন তবে সম্ভাবনা পরিবর্তন হয় না এবং এটি নমুনাটিকে (শৃঙ্খলার মধ্যে বা শৃঙ্খলের মধ্যে) বিভ্রান্ত করতে পারে। আপনি যে জিনিসটি প্রশমিত করার চেষ্টা করতে পারেন তা হ'ল পাইএমসি 3-তে সম্ভাব্য ব্যবহার । পটেনশিয়াল সহ একটি জিএমএমের একটি ভাল বাস্তবায়ন এখানে । এই ধরণের সমস্যার জন্য পূর্ববর্তীটি সাধারণত উচ্চতর মাল্টিমোডাল যা একটি বড় সমস্যাও উপস্থাপন করে। পরিবর্তে আপনি ইএম (বা বৈকল্পিক অনুক্রম) ব্যবহার করতে চাইতে পারেন।

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