Dies ist der grundlegendste Algorithmus für die Regression. Algorithmen wie die Bayes'sche lineare Regression, neuronale Netze und Gauß'sche Prozesse, die später erscheinen werden, wurden mit Wahrscheinlichkeitstheorie hinzugefügt oder so entwickelt, dass sie auf höherdimensionale Räume angewendet werden können, aber der grundlegende Teil Sind üblich.
Angenommen, Sie beobachten eine Eingabe $ \ boldsymbol {x} = (x_1, x_2, \ cdots, x_N) ^ T $ und eine Ausgabe $ \ boldsymbol {t} = (t_1, t_2, \ cdots, t_N) ^ T $. .. (N ist die Anzahl der Daten) Angenommen, Sie möchten die Ausgabe $ t $ für die neue Eingabe $ x $ vorhersagen. Dies wird als "Rückgabeproblem" bezeichnet.
Betrachten Sie nun eine Funktion $ y (x) $. Wenn dieser Funktion $ x_1, x_2, \ cdots, x_N $ zugewiesen sind, ist die Ausgabe $ y (x_1), y (x_2), \ cdots, y (x_N) $ $ t_1, t_2, \ cdots. Wenn der Wert nahe bei t_N $ liegt, stimmt die Ausgabe $ t $ für die neue Eingabe $ x $ wahrscheinlich mit $ y (x) $ überein.
Bei der polymorphen Kurvenanpassung führen wir den Parameter $ \ boldsymbol {w} = (w_0, w_1, \ cdots, w_M) ^ T $ ein und betrachten das folgende Polynom. (M ist die Dimension des Polypolys: ein fester Parameter.)
y(x, \boldsymbol{w})=w_0+w_1x^1+w_2x^2+{\cdots}w_Mx^M= \boldsymbol{w}^T\boldsymbol{\phi}(x)
$ \ Boldsymbol {\ phi} (x) = (1, x, x ^ 2, \ cdots, x ^ M) ^ T $
Darüber hinaus wird das Ergebnis des Ersetzens dieser Funktion durch $ x_1, x_2, \ cdots, x_N $ wie folgt zusammengefasst.
\boldsymbol{y}(\boldsymbol{x}, \boldsymbol{w})=(y(x_1, \boldsymbol{w}),y(x_2, \boldsymbol{w}),\cdots,y(x_N, \boldsymbol{w}))^T=\boldsymbol{\Phi}\boldsymbol{w}
$ \ Boldsymbol {\ Phi} = (\ boldsymbol {\ phi} (x_1), \ boldsymbol {\ phi} (x_2), \ cdots, \ boldsymbol {\ phi} (x_N)) ^ T $
Suchen Sie $ \ boldsymbol {w} $, das so weit wie möglich mit $ \ boldsymbol {y} (\ boldsymbol {x}, \ boldsymbol {w}) $ und $ \ boldsymbol {t} $ übereinstimmt. Nehmen Sie dazu zuerst den Unterschied zwischen den beiden und quadrieren Sie ihn.
\begin{align}
E(\boldsymbol{w}) &= (\boldsymbol{y}(\boldsymbol{x}, \boldsymbol{w})-\boldsymbol{t})^T(\boldsymbol{y}(\boldsymbol{x}, \boldsymbol{w})-\boldsymbol{t})\\
&=\boldsymbol{w}^T\boldsymbol{\Phi}^T\boldsymbol{\Phi}\boldsymbol{w} - 2\boldsymbol{t}^T\boldsymbol{\Phi}\boldsymbol{w} +\boldsymbol{t}^T\boldsymbol{t}
\end{align}
Ich möchte $ \ boldsymbol {w} $ finden, das diesen Fehler $ E (\ boldsymbol {w}) $ so klein wie möglich macht. Wenn ich ihn also durch $ \ boldsymbol {w} $ differenziere und auf $ 0 $ setze,
\begin{align}
\frac{dE(\boldsymbol{w})}{d{\boldsymbol{w}}} &=2\boldsymbol{\Phi} ^T\boldsymbol{\Phi}\boldsymbol{w} - 2\boldsymbol{\Phi}^T\boldsymbol{t} = 0
\end{align}
Löse das,
\boldsymbol{w} =(\boldsymbol{\Phi} ^T\boldsymbol{\Phi})^{-1}\boldsymbol{\Phi}^T\boldsymbol{t}
Es wird sein. Lassen Sie es uns implementieren.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
#Trainingsdaten
data = np.array(
[[0.000000,0.349486],
[0.111111, 0.830839],
[0.222222, 1.007332],
[0.333333, 0.971507],
[0.444444, 0.133066],
[0.555556, 0.166823],
[0.666667, -0.848307],
[0.777778, -0.445686],
[0.888889, -0.563567],
[1.000000, 0.261502]])
x=data[:,0]
t=data[:,1]
#Plotdaten
plotS = 100
X = np.linspace(0,1,plotS)
Y = np.zeros(plotS)
def _phi(xn,M):
ret = np.zeros([M+1])
for m in range(M+1):
ret[m] += xn**m
return ret
def _Phi(x,M):
N = x.shape[0]
ret = np.zeros([N,M+1])
for n in range(N):
ret[n,:] = _phi(x[n],M)
return ret
plotArea = 0
for M in [0,1,3,9]:
#w lernen
Phi = _Phi(x,M)
w = np.linalg.inv(Phi.T.dot(Phi)).dot(Phi.T).dot(t)
plotArea += 1
plt.subplot(2,2,plotArea)
#Darstellung der Trainingsdaten
plt.plot(x,t,'o',c='w',ms=5,markeredgecolor='blue',markeredgewidth=1)
#Echtes Kurvendiagramm
plt.plot(X,np.sin(2 * np.pi * X),'g')
#Ungefähres Kurvendiagramm
for i in range(plotS):
Y[i] = w.dot(_phi(X[i],M))
plt.plot(X,Y,'r')
Recommended Posts