[PYTHON] Gaußscher Prozess mit pymc3

Ich werde versuchen, anhand des Gaußschen Prozesses anhand der auf dieser Website enthaltenen Daten zu Shampoo-Verkäufen zu schätzen.

https://machinelearningmastery.com/time-series-datasets-for-machine-learning/

Der Gaußsche Prozess ist ein typisches nichtparametrisches Regressionsmodell. Es hat den Vorteil, dass es gegenüber nichtlinearen Daten stark ist und die Schätzungsunsicherheit bestätigen kann.

import os
import pandas as pd
shampoo_df = pd.read_csv('../data/shampoo.csv')
shampoo_df
shampoo_df.plot.line(x='Month', y='Sales',c="k");

image.png

image.png

Im Folgenden wird die Grenzwahrscheinlichkeit berechnet, um eine angemessene Wahrscheinlichkeit und ein vorheriges Verteilungspaar zu erhalten.


with pm.Model() as shampoo_model:
    ρ=pm.HalfCauchy('ρ', 1) #Je größer die Längenskala ist, desto näher scheinen die Bewegungen zu sein.<= Selbstkorreliert
    η = pm.HalfCauchy('η', 1) #Je größer die Längenskala ist, desto näher scheinen die Bewegungen zu sein.<= Selbstkorreliert
    
    M = pm.gp.mean.Linear(coeffs=(shampoo_df.index/shampoo_df.Sales).mean()) #Ursprünglicher Wert
    K= (η**2) * pm.gp.cov.ExpQuad(1, ρ)

    σ = pm.HalfCauchy('σ', 1)
    gp = pm.gp.Marginal(mean_func=M, cov_func=K) 
    gp.marginal_likelihood("recruits", X=shampoo_df.index.values.reshape(-1,1), 
                           y=shampoo_df.Sales.values, noise=σ)
    trace = pm.sample(1000)

pm.traceplot(trace);

image.png

Die Schätzung der meisten Wahrscheinlichkeiten erzeugt ein gut angepasstes Modell durch Maximieren der Wahrscheinlichkeitsfunktion p (X | θ) in Bezug auf den Parameter θ, verwendet jedoch nicht die vorherige Verteilung p (θ). Andererseits scheint der Fall, in dem eine vorherige Verteilung vorliegt, als maximale posteriore Wahrscheinlichkeitsschätzung bezeichnet zu werden.

Weitere Informationen finden Sie in den folgenden Büchern. Atsushi Suyama. Startup-Serie zum maschinellen Lernen Einführung in das maschinelle Lernen durch Bayesianische Inferenz (japanische Ausgabe) (Kindle Locations 2154-2156). Kindle Edition.

Erhalten Sie die optimalen Parameter, indem Sie die maximale hintere Wahrscheinlichkeit schätzen.


with shampoo_model:
    marginal_post = pm.find_MAP()

{'ρ_log__': array(2.88298779), 'η_log__': array(5.63830367), 'σ_log__': array(4.13876033), 'ρ': array(17.86757799), 'η': array(280.98567051), 'σ': array(62.72501496)}


X_pred=np.array([r for r in range(X_pred.max()+10)]).reshape(-1,1)

with shampoo_model:
    shampoo_pred = gp.conditional("shampoo_", X_pred)
    samples=pm.sample_ppc([marginal_post], vars=[shampoo_pred] ,samples=100)



fig = plt.figure(figsize=(10,5)); 
ax = fig.gca()

from pymc3.gp.util import plot_gp_dist
plot_gp_dist(ax, samples["shampoo_"], X_pred);

ax.plot(shampoo_df.index, shampoo_df.Sales, 'dodgerblue', ms=5, alpha=0.5);
ax.plot(shampoo_df.index, shampoo_df.Sales, 'ok', ms=5, alpha=0.5);
plt.show()

In pm.sample_ppc wird eine Stichprobe aus der posterioren Vorhersageverteilung basierend auf den Parametern in marginal_post durchgeführt.

image.png

Recommended Posts

Gaußscher Prozess mit pymc3
Gaußscher Prozess kehrt mit PyMC3 Personal Notes zurück
Rückkehr nach dem Gaußschen Verfahren
Gaußsche Prozessregression mit GPy
Töte den Prozess mit sudo kill -9
ShinobiLayer: Prozessüberwachung mit erweiterter Überwachung
Überwachen Sie Tomcat-Prozesse mit dem Zabbix-Agenten
Verarbeiten Sie Feedly-XML mit Python.
Implementieren Sie den Gaußschen Prozess in Pyro
"Gauß-Prozess und maschinelles Lernen" Gauß-Prozessregression nur mit Python-Numpy implementiert
Verarbeiten Sie Pubmed .xml-Daten mit Python
Verarbeiten Sie Pubmed .xml-Daten mit Python [Teil 2]
PRML Kapitel 6 Gaussian Return Python-Implementierung
Automatisieren Sie den WEB-Prozess mit Heroku + Selen + Chrome
selenium.common.exceptions.WebDriverException: Nachricht: Prozess unerwartet mit Status 1 geschlossen
Verarbeiten Sie mehrere Listen mit for in Python
Verwendung von Gensim mit R (Hierarchical Dirichlet Process)
Fügen Sie Bildern mit Python2.7 Gaußsches Rauschen hinzu
Gaußsche Prozessregression Numpy Implementierung und GPy
Bildverarbeitung mit Python 100 Knock # 9 Gauß-Filter