"Lineare Regression" und "Probabilistische Version der linearen Regression" in Python "Bayes lineare Regression"

Motivation

Ablauf, wie man eine lineare Regression findet

Basisfunktion

――In "linearer Regression" definieren Sie zunächst eine sogenannte "Basisfunktion".

** Polygonbasis **

\phi_i(x)=x^i\hspace{1.0em}(i=0,\cdots,M-1)

** Gaußsche Basis **

\phi_i(x)=\exp\left\{-\frac{(x-c_i)^2}{2s^2}\right\}\hspace{1.0em}(i=0,\cdots,M-1)

So finden Sie eine lineare Regression

--Die Basisfunktion wird zuerst bestimmt und festgelegt, und die Funktion f (x), für die Sie die lineare Summe ermitteln möchten, wird verwendet.

f(x)= \sum^{M-1}_{i=0}w_i\phi_i(x) = w^T\phi(x) \hspace{1.0em}(Gleichung 1)

--F (x) kann durch Bestimmen des Parameters $ w_i $ erhalten werden, daher sollte es eine Möglichkeit geben, $ w_i $ entsprechend zu bestimmen.

E(w)=\frac{1}{2}\sum^N_{n=1}(f(x_n)-t_n)^2 
=\frac{1}{2}\sum^N_{n=1}\left(\sum^{M-1}_{i=0}w_{i}x^{i}_{n}-t_n\right)^2 \hspace{1.0em}(Gleichung 2)

Beispieldaten

Bei einem Diagramm wie dem folgenden möchte ich seine lineare Regression finden

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

X = np.array([0.02, 0.12, 0.19, 0.27, 0.42, 0.51, 0.64, 0.84, 0.88, 0.99])
t = np.array([0.05, 0.87, 0.94, 0.92, 0.54, -0.11, -0.78, -0.79, -0.89, -0.04])

plt.xlim([0,1.0])
plt.ylim([-1.5,1.5])
plt.plot(X, t, 'o')
plt.show()

output_3_0.png

Finden Sie die Beziehung zwischen X und t durch lineare Regression

Finden Sie die lineare Regression mithilfe der Polynombasis

Polygonbasis

Definiert durch die folgende Formel (Repost)

\phi_i(x)=x^i\hspace{1.0em}(i=0,\cdots,M-1)
f(x)=w_{1}+w_{2}x+w_{3}x^2+w_{4}x^3
\frac{\partial E(w)}{\partial w_m}=\sum^N_{n=1}\phi_m(x_n)\left(\sum^M_{j=1}w_j\phi_j(x_n)-t_n\right)=0 \hspace{1.0em}(m=1,\cdots,M) \hspace{1.0em}(Gleichung 3)
w = (\phi^T\phi)^{-1}\phi^{T}t \hspace{1.0em}(Gleichung 4)

Φ ist jedoch eine Matrix, die wie folgt definiert ist.

	\phi=\left(
	\begin{array}{ccc} 
    	\phi_{1}(x_1) & \phi_{2}(x_1) & \cdots & \phi_{M}(x_1)  \\ 
    	\vdots & \vdots& & \vdots      \\ 
        \phi_{1}(x_N) & \phi_{2}(x_N) & \cdots & \phi_{M}(x_N)\\ 
	\end{array}  
	\right) \hspace{1.0em}(Gleichung 5)

Finden Sie eine lineare Regression auf Polynombasis (Funktion dritter Ordnung) (Implementierung der obigen Inhalte)

Schreiben Sie den obigen Inhalt so wie er ist in den Code und finden Sie die lineare Regression mit der Polynombasis (Funktion dritter Ordnung). (* Normalisierungsbegriffe werden hier nicht berücksichtigt)

#Wenn eine Polynombasis für die Merkmalsfunktion φ verwendet wird
def phi(x):
    return [1, x, x**2, x**3]

PHI = np.array([phi(x) for x in X])
#Berechnung des obigen Teils (Gleichung 4). np.dot:Finden Sie das innere Produkt np.linalg.inv:Finden Sie die Umkehrung
w = np.dot(np.linalg.inv(np.dot(PHI.T, PHI)), np.dot(PHI.T, t))
#Np, um die Lösung simultaner Gleichungen zu finden.linalg.Sie können auch die Lösungsfunktion verwenden. Das geht schneller. np.linalg.solve(A, b): A^{-1}gibt zurück b
#w = np.linalg.solve(np.dot(PHI.T, PHI), np.dot(PHI.T, t))

xlist = np.arange(0, 1, 0.01) #Der x-Punkt der linearen Regressionsgleichung. 0.Zeichnen Sie fein in 01 Einheiten und geben Sie es als Linie aus
ylist = [np.dot(w, phi(x)) for x in xlist] #Lineare Regressionsgleichung y

plt.plot(xlist, ylist) #Lineare Regressionsgleichung
plt.plot(X, t, 'o')
plt.show()

output_8_0.png

#Die Ausgabe w wird durch die obige Berechnung erhalten
w
array([ -0.14051447,  11.51076413, -33.6161329 ,  22.33919877])

Mit anderen Worten wurde als Ergebnis der linearen Regression die Regressionsgleichung $ f (x) = -0,14 + 11,5x-33,6x ^ 2 + 22,3x ^ 3 $ erhalten.

Finden Sie die lineare Regression auf der Gaußschen Basis

Gaußsche Basis

Die Gaußsche Basis ist eine glockenförmige Funktion (keine Verteilung), die durch die folgende Gleichung definiert wird

\phi_i(x)=\exp\left\{-\frac{(x-c_i)^2}{2s^2}\right\}\hspace{1.0em}(i=0,\cdots,M-1)\hspace{1.0em}(Gleichung 6)

Gaußsche Basisvariable s

Gaußsche Basisvariable c_i

Finden Sie eine lineare Regression auf Gaußscher Basis (Implementierung der obigen)

Lassen Sie uns zunächst einfach ein Diagramm erstellen, in dem die in der obigen linearen Regression verwendete Merkmalsfunktion φ von "Polypoly-Basis" in "Gauß-Basis" umgeschrieben wird.

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

X = np.array([0.02, 0.12, 0.19, 0.27, 0.42, 0.51, 0.64, 0.84, 0.88, 0.99])
t = np.array([0.05, 0.87, 0.94, 0.92, 0.54, -0.11, -0.78, -0.79, -0.89, -0.04])

#Wenn eine Gaußsche Basis für die Merkmalsfunktion φ verwendet wird
#phi gibt einen 12-dimensionalen Vektor zurück, indem 1 addiert wird, um den konstanten Term zusätzlich zu den 11 Gaußschen Basisfunktionen darzustellen.
#Gaußsche Basis (0 zu 1).0 bis 0.11 Punkte in Schritten von 1)+Gibt insgesamt 12 Punkte (Dimensionen) zurück, einen Punkt des konstanten Terms
def phi(x): 
    s = 0.1 #Gaußsche Basis "Breite"
    #Gleichung 6 aufschreiben
    return np.append(1, np.exp(-(x - np.arange(0, 1 + s, s)) ** 2 / (2 * s * s)))

PHI = np.array([phi(x) for x in X])
w = np.linalg.solve(np.dot(PHI.T, PHI), np.dot(PHI.T, t))

xlist = np.arange(0, 1, 0.01)
ylist = [np.dot(w, phi(x)) for x in xlist]

plt.plot(xlist, ylist)
plt.plot(X, t, 'o')
plt.show()

output_14_0.png

Die 12-dimensionale Gaußsche Basis ist völlig überlernt, weil sie mehr Freiheit und Ausdruckskraft hat als die 4-dimensionale polymorphe Basis.

Bayesianische lineare Regression, die die lineare Regression probabilisiert

――Die stochastische lineare Regression basiert auf der Idee, dass "den beobachteten Daten zufälliges Rauschen hinzugefügt wird".

p(t|w,x) = N(t|\mu,\beta^{-1})=\frac{1}{Z}\exp\left\{-\frac{1}{2}\beta(t-\mu)^2\right\} \hspace{1.0em}(Gleichung 7)\\
Jedoch,\mu=f(x)=\sum^M_{i=1}w_i\phi_i(x), Z=\sqrt{2\pi\beta^{-1}}

――Die Wahrscheinlichkeit kann durch Multiplizieren der Wahrscheinlichkeit an jedem Punkt erhalten werden, und es kann $ w $ erhalten werden, das sie maximiert.

\ln{p(T|w,X)}=-\frac{1}{2}\beta\sum^N_{n=1}\left(t_n-\sum^{M}_{i=1}w_{i}\phi_i(x_n)\right)^2+C \hspace{1.0em}(Gleichung 8)

Finden Sie die hintere Verteilung p (t | w, x) aus der vorherigen Verteilung p (w)

-Ex-post-Verteilungp(t|w,x)Insbesondere da x ein Eingabewert ist, behandeln Sie ihn als Konstantep(t|w,x)Ebenfallsp(t|w)Notiert als

p(w|t)=p(t|w)p(w)/p(t) \\
p(t)=\int p(t,w)dw=\int p(t|w)p(w)dw
p(w|t)=\frac{1}{Z'}\exp\left\{-\frac{1}{2}(w-m)^T\sum^{-1}(w-m)\right\} \hspace{1.0em}(Gleichung 9)\\
jedoch\\
m=\beta t\sum\phi(x)\\
\sum^{-1}=\alpha I+\beta\phi(x)\phi(x)^T
N(w|\mu,\sum)=\frac{1}{Z}\exp\left\{(-(w-\mu)^T\sum^{-1}(w-\mu)\right\}
p(w|t)=N(w|m,\sum)
p(w|t,x)=N(w|m_N,\sum_N) \hspace{1.0em}(Gleichung 10)\\
jedoch\\
m_N=\beta \sum_N\phi^{T}t\\
\sum^{-1}_N=\alpha I+\beta\phi^T\phi

-Als Ergebnis zuerst die Datenpunkte(x_1,t_1)Für seine hintere Verteilungp(w|t_1,x_1)Und betrachten Sie es erneut als eine vorherige Verteilung, einen weiteren Datenpunkt(x_2,t_2)Die folgende posteriore Verteilung mitp(w|t_1,t_2,x_1,x_2)Kann durch Wiederholen des Suchvorgangs erhalten werden ...p(w|t_1,…,t_N,x_1,…,x_N)Wird die gleiche Verteilung haben wie

Regularisierung der Bayes'schen linearen Regression

Implementierung der Bayes'schen linearen Regression

Vergleichen wir sowohl die Bayes'sche lineare Regression (blaue Linie) als auch die normale lineare Regression (grüne Linie) im Diagramm.

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

X = np.array([0.02, 0.12, 0.19, 0.27, 0.42, 0.51, 0.64, 0.84, 0.88, 0.99])
t = np.array([0.05, 0.87, 0.94, 0.92, 0.54, -0.11, -0.78, -0.79, -0.89, -0.04])

#Wenn eine Gaußsche Basis für die Merkmalsfunktion φ verwendet wird
def phi(x): 
    s = 0.1
    return np.append(1, np.exp(-(x - np.arange(0, 1 + s, s)) ** 2 / (2 * s * s)))

PHI = np.array([phi(x) for x in X])

#(Wie oben) Lösen nur einer linearen Regression auf Gaußscher Basis → Überlernen
w = np.linalg.solve(np.dot(PHI.T, PHI), np.dot(PHI.T, t))

#Lösen der linearen Bayes'schen Regression auf Gauß'scher Basis → Vermeiden Sie Überlernen
#Eine Abschrift von Gleichung 10 oben
alpha = 0.1 #Zwischenlagerung
beta = 9.0  #Zwischenlagerung
Sigma_N = np.linalg.inv(alpha * np.identity(PHI.shape[1]) + beta * np.dot(PHI.T, PHI)) #np.identity(PHI.shape[1])Ist eine 12-dimensionale Einheitsmatrix, die in der Gaußschen Basis angegeben ist
mu_N = beta * np.dot(Sigma_N, np.dot(PHI.T, t))

xlist = np.arange(0, 1, 0.01) 
plt.plot(xlist, [np.dot(w, phi(x)) for x in xlist], 'g')     #Zeichnen Sie die Lösung der gewöhnlichen linearen Regression
plt.plot(xlist, [np.dot(mu_N, phi(x)) for x in xlist], 'b')  #Zeichnen Sie die Lösung der Bayes'schen linearen Regression
plt.plot(X, t, 'o') #Zeichnen Sie Beispielpunkte
plt.show()

output_20_0.png

Was war Kovarianz Σ_N?

#Kovarianzmatrix Sigma_Gut lesbare Anzeige von N.
print "\n".join(' '.join("% .2f" % x for x in y) for y in Sigma_N)
 2.94 -2.03 -0.92 -1.13 -1.28 -1.10 -1.21 -1.14 -1.23 -1.06 -0.96 -2.08
-2.03  2.33 -0.70  1.95  0.13  1.02  0.85  0.65  0.98  0.70  0.65  1.44
-0.92 -0.70  2.52 -1.86  1.97 -0.29  0.42  0.59  0.13  0.40  0.32  0.63
-1.13  1.95 -1.86  3.02 -1.66  1.50  0.17  0.29  0.73  0.33  0.36  0.82
-1.28  0.13  1.97 -1.66  2.82 -1.11  1.39  0.22  0.55  0.49  0.40  0.92
-1.10  1.02 -0.29  1.50 -1.11  2.39 -1.35  1.72 -0.29  0.53  0.46  0.69
-1.21  0.85  0.42  0.17  1.39 -1.35  2.94 -2.06  2.39 -0.02  0.25  1.01
-1.14  0.65  0.59  0.29  0.22  1.72 -2.06  4.05 -2.72  1.43  0.37  0.67
-1.23  0.98  0.13  0.73  0.55 -0.29  2.39 -2.72  3.96 -1.41  1.23  0.59
-1.06  0.70  0.40  0.33  0.49  0.53 -0.02  1.43 -1.41  3.30 -2.27  2.05
-0.96  0.65  0.32  0.36  0.40  0.46  0.25  0.37  1.23 -2.27  3.14 -0.86
-2.08  1.44  0.63  0.82  0.92  0.69  1.01  0.67  0.59  2.05 -0.86  2.45

Visualisieren Sie die vorhergesagte Verteilung

-(Idee) posteriore Verteilungp(w|X)Ist die Verteilung des Parameters w, sop(y|w,x)Eine "Funktion", die die Verteilung von y zurückgibt, wenn x angegeben ist.p(y|X,x)(Tatsächlich ist es nicht möglich, die Verteilung durch die Verteilung zu ersetzen, es handelt sich also nur um ein Bild.)

#Normalverteilungswahrscheinlichkeitsdichtefunktion
def normal_dist_pdf(x, mean, var): 
    return np.exp(-(x-mean) ** 2 / (2 * var)) / np.sqrt(2 * np.pi * var)

#Sekundärformat( x^Berechnen Sie T A x)
def quad_form(A, x):
    return np.dot(x, np.dot(A, x))

xlist = np.arange(0, 1, 0.01)
tlist = np.arange(-1.5, 1.5, 0.01)
z = np.array([normal_dist_pdf(tlist, np.dot(mu_N, phi(x)),1 / beta + quad_form(Sigma_N, phi(x))) for x in xlist]).T

plt.contourf(xlist, tlist, z, 5, cmap=plt.cm.binary)
plt.plot(xlist, [np.dot(mu_N, phi(x)) for x in xlist], 'r')
plt.plot(X, t, 'go')
plt.show()

output_26_0.png

Über den Hyperparameter α der vorherigen Verteilung

Frühere Geschichte

Recommended Posts

"Lineare Regression" und "Probabilistische Version der linearen Regression" in Python "Bayes lineare Regression"
Implementiert in Python PRML Kapitel 3 Bayesianische lineare Regression
Online lineare Regression in Python
Python-Implementierung der Bayes'schen linearen Regressionsklasse
Lineare Regression in Python (Statmodelle, Scikit-Learn, PyMC3)
Echte Werte und Eigenvektoren: Lineare Algebra in Python <7>
Online lineare Regression in Python (Robuste Schätzung)
Plattenreproduktion der Bayes'schen linearen Regression (PRML §3.3)
Lineare Unabhängigkeit und Basis: Lineare Algebra in Python <6>
Liste der in Python verfügbaren Löser und Modellierer für lineares Design (LP)
Projekt Euler # 1 "Vielfaches von 3 und 5" in Python
Ich habe versucht, die Bayes'sche lineare Regression durch Gibbs-Sampling in Python zu implementieren
Einheitsmatrix und inverse Matrix: Lineare Algebra in Python <4>
Inneres Produkt und Vektor: Lineare Algebra in Python <2>
Matrixberechnung und lineare Gleichungen: Lineare Algebra in Python <3>
Erläuterung der Bearbeitungsentfernung und Implementierung in Python
Lineare Suche in Python
Regressionsanalyse mit Python
Ich habe die Geschwindigkeit regulärer Ausdrücke in Ruby, Python und Perl (Version 2013) verglichen.
Verarbeitung von CSV-Daten in voller und halber Breite in Python
Berechnung der Standardabweichung und des Korrelationskoeffizienten in Python
Unterschied zwischen Ruby und Python in Bezug auf Variablen
[Python] Berechnung der Differenz von Datum und Zeit in Monaten und Jahren
Coursera Machine Learning Challenge in Python: ex1 (lineare Regression)
Implementierung der Bayes'schen Varianzschätzung des Themenmodells in Python
Beispiel für das Abrufen des Modulnamens und des Klassennamens in Python
Zusammenfassung der Datumsverarbeitung in Python (Datum / Uhrzeit und Datum)
Versionsverwaltung von Node, Ruby und Python mit anyenv
Hinweise zur Verwendung von StatsModels, die lineare Regression und GLM in Python verwenden können
Mehrfacher Regressionsausdruck in Python
Objektäquivalenzbeurteilung in Python
Upgrade von Python Anaconda
Überprüfen Sie die OpenSSL-Version von Python 2.6
Stapel und Warteschlange in Python
Einfache Regressionsanalyse mit Python
[Python] Lineare Regression mit Scicit-Learn
Unittest und CI in Python
Implementierung der schnellen Sortierung in Python
Quellinstallation und Installation von Python
Lassen Sie das Gleichungsdiagramm der linearen Funktion in Python zeichnen
Referenzreihenfolge von Klassenvariablen und Instanzvariablen in "self. Klassenvariablen" in Python
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
Erste Computerphysik: Quantenmechanik und lineare Algebra mit Python.
[Python] Stärken und Schwächen von DataFrame in Bezug auf den Zeitaufwand
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
[Python] Taple-Version des Pulldowns der Präfektur
Bildpixel-Manipulation in Python
Die Geschichte von Python und die Geschichte von NaN
Pakete, die MIDI mit Python Midi und Pretty_Midi verarbeiten
Zählen Sie die Anzahl der thailändischen und arabischen Zeichen in Python gut
Unterschied zwischen list () und [] in Python
Erste einfache Regressionsanalyse in Python
Unterschied zwischen == und ist in Python
Installation von SciPy und matplotlib (Python)
Zeigen Sie Fotos in Python und HTML an
Sortieralgorithmus und Implementierung in Python
Python: Anwendung des überwachten Lernens (Rückkehr)
Zeitdelta in Python 2.7-Serie teilen