2015-12-08 10 views
12

क्या इस साधारण पीएमएमसी मॉडल को गति देने का कोई तरीका है? 20-40 डेटा बिंदुओं पर, फिट होने में ~ 5-11 सेकंड लगते हैं।पीईएमसी मार्कोव मॉडल को कैसे गति दें?

running on 40 points 
[-----------------100%-----------------] 2000 of 2000 complete in 11.5 sec 
11.54 secs to run 

(80 अंकों के साथ यह 20 सेकंड लेता है):

import pymc 
import time 
import numpy as np 
from collections import OrderedDict 

# prior probability of rain 
p_rain = 0.5 
variables = OrderedDict() 
# rain observations 
data = [True, True, True, True, True, 
     False, False, False, False, False]*4 
num_steps = len(data) 
p_rain_given_rain = 0.9 
p_rain_given_norain = 0.2 
p_umbrella_given_rain = 0.8 
p_umbrella_given_norain = 0.3 
for n in range(num_steps): 
    if n == 0: 
     # Rain node at time t = 0 
     rain = pymc.Bernoulli("rain_%d" %(n), p_rain) 
    else: 
     rain_trans = \ 
      pymc.Lambda("rain_trans", 
         lambda prev_rain=variables["rain_%d" %(n-1)]: \ 
         prev_rain*p_rain_given_rain + (1-prev_rain)*p_rain_given_norain) 
     rain = pymc.Bernoulli("rain_%d" %(n), p=rain_trans) 
    umbrella_obs = \ 
     pymc.Lambda("umbrella_obs", 
        lambda rain=rain: \ 
        rain*p_umbrella_given_rain + (1-rain)*p_umbrella_given_norain) 
    umbrella = pymc.Bernoulli("umbrella_%d" %(n), p=umbrella_obs, 
           observed=True, 
           value=data[n]) 
    variables["rain_%d" %(n)] = rain 
    variables["umbrella_%d" %(n)] = umbrella 

print "running on %d points" %(len(data)) 
all_vars = variables.values() 
t_start = time.time() 
model = pymc.Model(all_vars) 
m = pymc.MCMC(model) 
m.sample(iter=2000) 
t_end = time.time() 
print "\n%.2f secs to run" %(t_end - t_start) 

केवल 40 डेटा बिंदुओं के साथ, इसे चलाने के लिए 11 सेकंड लेता है। यह एक खिलौना उदाहरण है। Lambda() के अंदर अभिव्यक्तियां जो संक्रमण निर्धारित करती हैं, अभ्यास अधिक जटिल होती हैं। यह मूल कोड संरचना लचीला है (जबकि संक्रमण मैट्रिस के साथ मॉडल एन्कोडिंग कम लचीला है)। क्या समान कोड संरचना रखने का कोई तरीका है लेकिन बेहतर प्रदर्शन प्राप्त करें? यदि आवश्यक हो तो पीएमएमसी 3 पर स्विच करने के लिए खुश है। धन्यवाद।

+0

pymc का कौन सा संस्करण उपयोग कर रहे हैं? 2.3.6 के लिए pymc प्रलेखन में मुझे Bernoulli फ़ंक्शन नहीं मिल सकता है, केवल Bernoulli_like [Doc] (https://pymc-devs.github.io/pymc/)। – CodeMonkey

+0

यह 2.2 – slushy

+0

में मौजूद है मुझे अनुकूलन के बारे में एक ही चिंता है (https://stackoverflow.com/questions/42205123/how-to-fit-a-method-belonging-to-an-instance-with-pymc3) –

उत्तर

3

मार्कोव-चेन मोंटे कार्लो एक ज्ञात अनुक्रमिक समस्या है।

इसका मतलब है कि रनटाइम आनुपातिक चरणों की संख्या और आपके फिटनेस फ़ंक्शन का रन टाइम।

, कुछ गुर आप कर सकते हैं, लेकिन:

  • उपयोग PyPy में अपने अगले कदम के
  • उपयोग एकाधिक शुरू अंक सुधार करने के लिए (
  • उपयोग गिब्स नमूना (पुनर्लेखन की आवश्यकता है, pymc समर्थित नहीं) समानांतर)
  • उपयोग कई शाखाओं (समानांतर में)
  • उपयोग अनुमानी श्रृंखला को रोकने के लिए पहले
  • उपयोग सन्निकटन च या अंक कि करीब हैं पहले से ही

कठिन दृष्टिकोण अभिकलन करने के लिए:

  • उपयोग Numba (मशीन कोड के लिए फिटनेस फंक्शन संकलित)
  • सी (या समान)
  • उपयोग में अपनी फिटनेस समारोह पुनर्लेखन देशी एमसीएमसी कोड (गैर पायथन, उपर्युक्त की आवश्यकता है)

अंत में वहां बहुत सारे शोध हैं:

http://www.mas.ncl.ac.uk/~ndjw1/docs/pbc.pdf

https://sites.google.com/site/parallelmcmc/

http://pyinsci.blogspot.com/2010/12/efficcient-mcmc-in-python.html (PyPy)

+0

होने के नाते एक बहुत ही सामान्य सवाल का जवाब, मैंने संक्षेप में रहने की कोशिश की। कृपया विनिर्देशों के लिए टिप्पणी करें ... –

संबंधित मुद्दे