PyMC (ehemals PyMC3) ist ein Python-Paket für die bayesianische statistische Modellierung mit Schwerpunkt auf fortgeschrittenen Markov-Ketten-Monte-Carlo- (MCMC) und Variationsinferenz- (VI) Algorithmen. Aufgrund seiner Flexibilität und Erweiterbarkeit ist es auf eine Vielzahl von Problemen anwendbar.
Schauen Sie sich die PyMC-Übersicht oder eines der vielen Beispiele an! Bei Fragen zu PyMC besuchen Sie unser PyMC-Diskursforum.
x ~ N(0,1)
übersetzt in x = Normal('x',0,1)
Das Pflanzenwachstum kann durch mehrere Faktoren beeinflusst werden, und das Verständnis dieser Zusammenhänge ist für die Optimierung landwirtschaftlicher Praktiken von entscheidender Bedeutung.
Stellen Sie sich vor, wir führen ein Experiment durch, um das Wachstum einer Pflanze anhand verschiedener Umgebungsvariablen vorherzusagen.
import pymc as pm
# Taking draws from a normal distribution
seed = 42
x_dist = pm . Normal . dist ( shape = ( 100 , 3 ))
x_data = pm . draw ( x_dist , random_seed = seed )
# Independent Variables:
# Sunlight Hours: Number of hours the plant is exposed to sunlight daily.
# Water Amount: Daily water amount given to the plant (in milliliters).
# Soil Nitrogen Content: Percentage of nitrogen content in the soil.
# Dependent Variable:
# Plant Growth (y): Measured as the increase in plant height (in centimeters) over a certain period.
# Define coordinate values for all dimensions of the data
coords = {
"trial" : range ( 100 ),
"features" : [ "sunlight hours" , "water amount" , "soil nitrogen" ],
}
# Define generative model
with pm . Model ( coords = coords ) as generative_model :
x = pm . Data ( "x" , x_data , dims = [ "trial" , "features" ])
# Model parameters
betas = pm . Normal ( "betas" , dims = "features" )
sigma = pm . HalfNormal ( "sigma" )
# Linear model
mu = x @ betas
# Likelihood
# Assuming we measure deviation of each plant from baseline
plant_growth = pm . Normal ( "plant growth" , mu , sigma , dims = "trial" )
# Generating data from model by fixing parameters
fixed_parameters = {
"betas" : [ 5 , 20 , 2 ],
"sigma" : 0.5 ,
}
with pm . do ( generative_model , fixed_parameters ) as synthetic_model :
idata = pm . sample_prior_predictive ( random_seed = seed ) # Sample from prior predictive distribution.
synthetic_y = idata . prior [ "plant growth" ]. sel ( draw = 0 , chain = 0 )
# Infer parameters conditioned on observed data
with pm . observe ( generative_model , { "plant growth" : synthetic_y }) as inference_model :
idata = pm . sample ( random_seed = seed )
summary = pm . stats . summary ( idata , var_names = [ "betas" , "sigma" ])
print ( summary )
Aus der Zusammenfassung können wir ersehen, dass der Mittelwert der abgeleiteten Parameter sehr nahe an den festen Parametern liegt
Parameter | bedeuten | sd | hdi_3% | hdi_97% | mcse_mean | mcse_sd | ess_bulk | ess_tail | r_hat |
---|---|---|---|---|---|---|---|---|---|
Betas[Sonnenlichtstunden] | 4.972 | 0,054 | 4.866 | 5.066 | 0,001 | 0,001 | 3003 | 1257 | 1 |
Betas[Wassermenge] | 19.963 | 0,051 | 19.872 | 20.062 | 0,001 | 0,001 | 3112 | 1658 | 1 |
Betas[Bodenstickstoff] | 1.994 | 0,055 | 1.899 | 2.107 | 0,001 | 0,001 | 3221 | 1559 | 1 |
Sigma | 0,511 | 0,037 | 0,438 | 0,575 | 0,001 | 0 | 2945 | 1522 | 1 |
# Simulate new data conditioned on inferred parameters
new_x_data = pm . draw (
pm . Normal . dist ( shape = ( 3 , 3 )),
random_seed = seed ,
)
new_coords = coords | { "trial" : [ 0 , 1 , 2 ]}
with inference_model :
pm . set_data ({ "x" : new_x_data }, coords = new_coords )
pm . sample_posterior_predictive (
idata ,
predictions = True ,
extend_inferencedata = True ,
random_seed = seed ,
)
pm . stats . summary ( idata . predictions , kind = "stats" )
Die neuen Daten, die auf abgeleiteten Parametern basieren, würden wie folgt aussehen:
Ausgabe | bedeuten | sd | hdi_3% | hdi_97% |
---|---|---|---|---|
Pflanzenwachstum[0] | 14.229 | 0,515 | 13.325 | 15.272 |
Pflanzenwachstum[1] | 24.418 | 0,511 | 23.428 | 25.326 |
Pflanzenwachstum[2] | -6,747 | 0,511 | -7.740 | -5,797 |
# Simulate new data, under a scenario where the first beta is zero
with pm . do (
inference_model ,
{ inference_model [ "betas" ]: inference_model [ "betas" ] * [ 0 , 1 , 1 ]},
) as plant_growth_model :
new_predictions = pm . sample_posterior_predictive (
idata ,
predictions = True ,
random_seed = seed ,
)
pm . stats . summary ( new_predictions , kind = "stats" )
Die neuen Daten würden im obigen Szenario wie folgt aussehen:
Ausgabe | bedeuten | sd | hdi_3% | hdi_97% |
---|---|---|---|---|
Pflanzenwachstum[0] | 12.149 | 0,515 | 11.193 | 13.135 |
Pflanzenwachstum[1] | 29.809 | 0,508 | 28.832 | 30.717 |
Pflanzenwachstum[2] | -0,131 | 0,507 | -1.121 | 0,791 |
Um PyMC auf Ihrem System zu installieren, befolgen Sie die Anweisungen im Installationshandbuch.
Bitte wählen Sie aus Folgendem:
Wir nutzen discourse.pymc.io als unseren Hauptkommunikationskanal.
Wenn Sie eine Frage zur Modellierung oder Verwendung von PyMC stellen möchten, empfehlen wir Ihnen, diese in unserem Diskursforum in der Kategorie „Fragen“ zu posten. Sie können auch Funktionen in der Kategorie „Entwicklung“ vorschlagen.
Sie können uns auch auf diesen Social-Media-Plattformen folgen, um Updates und andere Ankündigungen zu erhalten:
Um ein Problem mit PyMC zu melden, verwenden Sie bitte den Issue-Tracker.
Wenn Sie schließlich nichttechnische Informationen zum Projekt benötigen, senden Sie uns eine E-Mail.
Apache-Lizenz, Version 2.0
Bitte kontaktieren Sie uns, wenn Ihre Software hier nicht aufgeführt ist.
Eine ständig aktualisierte Liste finden Sie hier und hier bei Google Scholar.
Weitere Informationen finden Sie auf der GitHub-Mitwirkendenseite. Lesen Sie auch unsere Verhaltenskodex-Richtlinien für ein besseres Beitragserlebnis.
PyMC ist ein gemeinnütziges Projekt unter dem Dach von NumFOCUS. Wenn Sie PyMC finanziell unterstützen möchten, können Sie hier spenden.
Professionelle Beratungsunterstützung erhalten Sie von PyMC Labs.