[PYTHON] (Maschinelles Lernen) Ich habe versucht, die Bayes'sche lineare Regression bei der Implementierung sorgfältig zu verstehen

Einführung

Ich studiere Bayes'sche Theorie. Dieses Mal werde ich die lineare Regression basierend auf der Bayes'schen Theorie zusammenfassen.   Die Bücher und Artikel, auf die ich mich bezog, lauten wie folgt.

Was ist Bayesianische lineare Regression?

Die Idee der linearen Regression, auf die Sie beim Erlernen des maschinellen Lernens stoßen, unterscheidet sich von der Idee der linearen Bayes'schen Regression, mit der wir uns diesmal befassen. Der Umriss ist unten dargestellt.  image.png

(Frequenztheorie) Lineare Regression

Eine lineare Regression, die auf der Methode des kleinsten Quadrats basiert, wird als frequenztheoretische lineare Regression bezeichnet, um sie von der Bayes'schen linearen Regression zu unterscheiden. * Wenn der Name nicht streng frequenzbasiert ist, würden wir uns freuen, wenn Sie einen Kommentar abgeben könnten.

Diese Methode kann auch mit Excel sehr einfach erhalten werden. Ich benutze es auch oft beim Zusammenstellen von Daten in meiner Arbeit. Nun, diese Methode ist sehr einfach zu überlegen.


E(w) = \frac {1}{2}\sum_{n=1}^{N}(y(x_n,w)-t_n)^2

Jedoch,

Sie müssen lediglich den Polynomkoeffizienten $ w $ finden, der $ E (w) $ minimiert und als Fehlerfunktion bezeichnet wird.

Bayesianische lineare Regression

Betrachten Sie andererseits die Bayes'sche lineare Regression. Berücksichtigen Sie die folgenden Wahrscheinlichkeiten für die beobachteten Daten $ X, Y $.


p(w|X,Y) = \frac {p(w)p(Y|X,w)}{p(X,Y)}

Hier,

Es wird sein.

Der Punkt der Bayes'schen Denkweise ist, dass alle nach Wahrscheinlichkeit (= Verteilung) organisiert sind. ** Ich verstehe, dass ich versuche, es als Distribution einschließlich der optimalen Lösung zu erfassen **.

Ein weiterer Punkt ist die Idee der Bayes'schen Schätzung. Es bezieht sich auf den Versuch, eine Wahrscheinlichkeit (= Nachwahrscheinlichkeit) mit einem Wert (= Vorwahrscheinlichkeit) zu finden, der im Voraus angenommen wird. Als ich es zum ersten Mal hörte, war es erfrischend.

In diesem Fall,p(w|X,Y)IstX,YGewichtsparameter wenn angegebenwIch möchte die Wahrscheinlichkeitsverteilung von finden. Dies ist der beobachtete WertX,GewichtsparameterwdurchYIst die vorhergesagte Verteilung vonp(Y|X,w)Es wird berechnet mit. Nun, ich frage mich, wie ich mit $ w $ rechnen soll, obwohl ich $ w $ hätte wissen wollen.

Bei dieser Bayes'schen Denkweise ist es notwendig, die Zeitachse zu berücksichtigen. Mit anderen Worten, es ist notwendig, den Zeitfluss zu berücksichtigen, um den Gewichtsparameter vorübergehend aus bestimmten Daten zu bestimmen und ihn jederzeit auf einen guten Wert zu aktualisieren. Dies ist eine sehr praktische Idee, um Daten aus einer kleinen Anzahl von Daten zu erhöhen.

Finden Sie tatsächlich die Verteilung (Formeltransformation in der Bayes'schen linearen Regression)

Nun möchte ich das Regressionsproblem durch Bayes'sche lineare Regression lösen. Betrachten Sie Folgendes für $ p (w | X, Y) $ mit dem Parameter $ t $.

p(w|t) \propto p(t|w)p(w)

Ursprünglich sollte $ p (t) $ bei der Durchführung der Berechnung auf den Nenner kommen, aber da die Berechnung kompliziert ist, werden wir sie mit der Proportionalformel $ \ propto $ betrachten. Hier sind unten $ p (t | w) $ und $ p (w) $ gezeigt.

\begin{align}
p(t|w)&=\prod_{n=1}^N \left\{ \mathcal{N} (t_n|w^T\phi(x_n), \beta^{-1}) \right\}\\

\end{align}\\
p(w)=\mathcal{N}(w|m_0, S_0)

Es wird so formuliert, dass es der Gaußschen Verteilung folgt.

Zusätzlich werden Konstanten und Funktionen unten gezeigt.

=\prod_{n=1}^N \left\{ \mathcal{N} (t_n|w^T\phi(x_n), \beta^{-1}) \right\} \mathcal{N}(w|m_0, S_0)\\
\propto \left( \prod_{n=1}^N exp\left[ -\frac{1}{2} \left\{ t_n - w^T \phi(x_n) \right\}^2 \beta \right] \right) exp\left[ -\frac{1}{2} (w - m_0)^TS_0^{-1}(w - m_0) \right]\\
= exp\left[  -\frac{1}{2} \left\{ \beta \sum_{n=1}^N \left( t_n - w^T\phi(x_n) \right)^2 + (w - m_0)^TS_0^{-1}(w - m_0) \right\} \right]

Kann mit transformiert werden. Danach werden wir diese Formel sorgfältig entwickeln.

\beta \sum_{n=1}^N \left( t_n - w^T\phi(x_n) \right)^2 + (w - m_0)^TS_0^{-1}(w - m_0)\\
= \beta \left( \begin{array}{c}
t_1 - w^T\phi(x_1) \\
\vdots\\
t_N - w^T\phi(x_N)
\end{array} \right)^T
\left( \begin{array}{c}
t_1 - w^T\phi(x_1) \\
\vdots\\
t_N - w^T\phi(x_N)
\end{array} \right)
+ (w - m_0)^TS_0^{-1}(w - m_0)

Es kann ausgedrückt werden als $ w ^ T \ phi (x_1) = \ phi ^ T (x_1) w $. Deshalb,

= \beta \left( \begin{array}{c}
t_1 - \phi^T(x_1)w \\
\vdots\\
t_N - \phi^T(x_N)w
\end{array} \right)^T
\left( \begin{array}{c}
t_1 - \phi^T(x_1)w \\
\vdots\\
t_N - \phi^T(x_N)w
\end{array} \right)
+ (w - m_0)^TS_0^{-1}(w - m_0)\\

Es wird sein. Hier wird die Basisfunktion in einer Form ausgedrückt, die als Entwurfsmatrix bezeichnet wird (siehe unten).

\Phi = \left( \begin{array}{c}
\phi^T(x_1) \\
\vdots\\
\phi^T(x_N)
\end{array} \right)

Wir werden dies zur weiteren Zusammenfassung verwenden. Die Begriffe nur $ \ beta $ und $ m $ sind konstante Begriffe, werden jedoch als $ C $ zusammengefasst.

= \beta (t - \Phi w)^T(t - \Phi w) + (w - m_0)^TS_0^{-1}(w - m_0)\\
= \beta ( w^T\Phi^T\Phi w - w^T\Phi^Tt - t^T\Phi w ) + w^TS_0^{-1}w - w^TS_0^{-1}m_0 - m_0^TS_0^{-1}w + C\\

Da $ S_0 $ kovariant ist, handelt es sich um eine symmetrische Matrix. Da seine inverse Matrix ebenfalls eine symmetrische Matrix ist, kann sie daher als $ (S_0 ^ {-1}) ^ T = S_0 ^ {-1} $ ausgedrückt werden. Wenden Sie dies auf den $ w $ -Koeffizienten an

= w^T(S_0^{-1} + \beta \Phi^T\Phi)w - w^T(S_0^{-1}m_0 + \beta \Phi^T t) - (S_0^{-1}m_0 + \beta \Phi^T t)^Tw + C

Hier, wenn $ R = S_0 ^ {-1} m_0 + \ beta \ Phi ^ Tt $

= w^TS_N^{-1}w - w^TR - R^Tw + C

Ich konnte zusammenfassen. Darüber hinaus kann es von hier aus durch quadratische Vervollständigung und Faktorisierung zusammengefasst werden, aber es ist eine ziemlich schwierige Berechnung. Bestätigen Sie die Übereinstimmung, indem Sie die in Amanojaku vervollständigte Formel erweitern.

Ausdruck erweitern

\mathcal{N}(w|m_N, S_N)\\
\propto exp\left\{ -\frac{1}{2} (w - m_N)^T S_N^{-1} (w - m_N) \right\}

Wieder werden wir nur den Inhalt von $ - \ frac {1} {2} $ in $ exp $ in der Gaußschen Verteilungsgleichung diskutieren.

(w - m_N)^T S_N^{-1} (w - m_N)\\

Hier sind $ m_N und S_N $ wie folgt angegeben.

m_N = S_N(S_0^{-1} m_0 + \beta \Phi^Tt) = S_NR\\
S_N^{-1} = S_0^{-1} + \beta \Phi^T \Phi

Hier erscheint $ S_N $ auch in der Zielformel, die aus der posterioren Verteilung abgeleitet wurde. Erweitern Sie sie also nicht, sondern erweitern Sie $ m_N $.

(w - m_N)^T S_N^{-1} (w - m_N)\\
= (w - S_NR)^T S_N^{-1} (w - S_NR)\\
= w^T S_N^{-1} w - w^T R - R^Tw + C

Daher posteriore Verteilungp(w|t)Wann\mathcal{N}(w|m_N, S_N)Hat die gleiche Normalverteilung.

Ich werde es implementieren und überprüfen.

Lassen Sie uns dieses Mal zufällig generierte Datenpunkte basierend auf der $ sin $ -Funktion zurückverfolgen.

Erstellen Sie eine Planungsmatrix

beyes.ipynb



#Machen Sie eine Planungsprozession
Phi = np.array([phi(x) for x in X])
 
#Hyperparameter
alpha = 0.1
beta = 9.0
M = 12

Erstellen Sie eine zufällig verteilte Sünde wie eine Funktion

beyes.ipynb



n = 10
X = np.random.uniform(0, 1, n)
T = np.sin(2 * np.pi * X) + np.random.normal(0, 0.1, n)
plt.scatter(X, T)
plt.plot(np.linspace(0,1), np.sin(2 * np.pi * np.linspace(0,1)), c ="g")
plt.show()

015.png

Finden Sie den Mittelwert und die Varianz der hinteren Wahrscheinlichkeiten

Für eine einfache Berechnung setzen Sie diesmal $ m_0 = 0 $, $ S_0 = α ^ {-1} I $ $ S_N ^ {-1} = αI + \ beta \ Phi ^ T \ Phi $, $ m_N = βS_N \ Phi ^ Tt $.

beyes.ipynb


#Streuung der posterioren Wahrscheinlichkeiten
S = np.linalg.inv(alpha * np.eye(M) + beta * Phi.T.dot(Phi))
#Durchschnittliche Ex-post-Wahrscheinlichkeit
m = beta * S.dot(Phi.T).dot(T)

Illustriert

beyes.ipynb


x_, y_ = np.meshgrid(np.linspace(0,1), np.linspace(-1.5, 1.5))
Z = np.vectorize(norm)(x_,y_)
x = np.linspace(0,1)
y = [m.dot(phi(x__)) for x__ in x]
 
plt.figure(figsize=(10,6))
plt.pcolor(x_, y_, Z, alpha = 0.2)
plt.colorbar()
plt.scatter(X, T)
#Durchschnitt der vorhergesagten Verteilung
plt.plot(x, y)
#Echte Verteilung
plt.plot(np.linspace(0,1), np.sin(2 * np.pi * np.linspace(0,1)), c ="g")
plt.show()
 
#Probenparameter aus der posterioren Verteilung
m_list = [np.random.multivariate_normal(m, S) for i in range(5)]
 
for m_ in m_list:
    x = np.linspace(0,1)
    y = [m_.dot(phi(x__)) for x__ in x]
    plt.plot(x, y, c = "r")
    plt.plot(np.linspace(0,1), np.sin(2 * np.pi * np.linspace(0,1)), c ="g")

013.png

Der Schatten zeigt, wo die Wahrscheinlichkeitsdichte hoch ist.

Am Ende

Dieses Mal haben wir die lineare Bayes'sche Regression vom Konzept bis zur Implementierung zusammengefasst. Ich war fast ratlos, weil die Ausdrucksentwicklung sehr kompliziert war. Die Idee ist jedoch sehr einfach und eine wichtige Idee beim maschinellen Lernen, wie man aus einer kleinen Datenmenge eine plausible Wahrscheinlichkeit erhält.

Ich werde weiterhin lernen, die Gefühle von Bayesian tief zu verstehen.

Das vollständige Programm finden Sie hier. https://github.com/Fumio-eisan/Beyes_20200512

Recommended Posts

(Maschinelles Lernen) Ich habe versucht, die Bayes'sche lineare Regression bei der Implementierung sorgfältig zu verstehen
(Maschinelles Lernen) Ich habe versucht, den EM-Algorithmus in der gemischten Gaußschen Verteilung sorgfältig mit der Implementierung zu verstehen.
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Ich habe maschinelles Lernen mit liblinear versucht
Ich habe versucht, die Bayes'sche lineare Regression durch Gibbs-Sampling in Python zu implementieren
Lineare Regression des maschinellen Lernens
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Implementierung ~
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (zweite Hälfte).
Ich habe versucht, die beim maschinellen Lernen verwendeten Bewertungsindizes zu organisieren (Regressionsmodell).
Ich habe versucht, die Bayes'sche Optimierung zu durchlaufen. (Mit Beispielen)
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Maschinelles Lernen: Überwacht - Lineare Regression
Verstehe maschinelles Lernen ~ Ridge Regression ~.
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (erste Hälfte).
Ich habe versucht, mit Python (Mac OS X) eine Umgebung für maschinelles Lernen zu erstellen.
Onkel SE mit verhärtetem Gehirn versuchte, maschinelles Lernen zu studieren
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Anfänger des maschinellen Lernens versuchen eine lineare Regression
Ich habe versucht, LightGBM mit Yellowbrick zu lernen
Ich habe versucht, es sorgfältig zu verstehen, während ich den Algorithmus Adaboost beim maschinellen Lernen implementiert habe (+ ich habe mein Verständnis der Array-Berechnung vertieft)
(Python) Erwarteter Wert ・ Ich habe versucht, die Monte-Carlo-Probenahme sorgfältig zu verstehen
Ich habe versucht, Deep Learning mit Spark × Keras × Docker skalierbar zu machen
Einführung in die Bayes'sche statistische Modellierung mit Python ~ Versuch einer linearen Regression mit MCMC ~
[Maschinelles Lernen] Ich habe versucht, so etwas wie Bilder weiterzugeben
Ich habe versucht, Othello AI mit Tensorflow zu machen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Einführung ~
Ich habe versucht, das überwachte Lernen des maschinellen Lernens auch für Serveringenieure auf leicht verständliche Weise zu verstehen 1
Ich habe versucht, das überwachte Lernen des maschinellen Lernens auch für Serveringenieure auf leicht verständliche Weise zu verstehen 2
Ich habe versucht, einen Linebot zu erstellen (Implementierung)
Ich habe eine multiple Regressionsanalyse mit Polypoly-Regression versucht
Algorithmus für maschinelles Lernen (Verallgemeinerung der linearen Regression)
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Notieren Sie die Schritte zum Verständnis des maschinellen Lernens
Ich habe versucht, mit Hy anzufangen
Maschinelles Lernen mit Python (2) Einfache Regressionsanalyse
Ich habe Python 3.5.1 installiert, um maschinelles Lernen zu studieren
<Kurs> Maschinelles Lernen Kapitel 1: Lineares Regressionsmodell
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, TSP mit QAOA zu lösen
Algorithmus für maschinelles Lernen (Zusammenfassung und Regularisierung der linearen Regression)
Ich habe versucht, Deep Learning zu implementieren, das nicht nur mit NumPy tiefgreifend ist
Mayungos Python Learning Episode 2: Ich habe versucht, Zeichen mit Variablen zu löschen
Ich habe versucht, Gitarrenakkorde in Echtzeit mithilfe von maschinellem Lernen zu klassifizieren
Ich habe versucht, den entscheidenden Baum (CART) zu verstehen, um ihn sorgfältig zu klassifizieren
Ich habe mit Python mit dem maschinellen Lernen begonnen (ich habe auch angefangen, in Qiita zu posten). Datenvorbereitung
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Battle Edition ~
[Python] Einfache Einführung in das maschinelle Lernen mit Python (SVM)
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Mayungos Python Learning Episode 5: Ich habe versucht, vier Regeln mit Zahlen zu machen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe versucht, Keras in TFv1.1 zu integrieren