[PYTHON] PRML-Diagrammzeichnung Abbildung 1.4 Polygonkurvenanpassung

Was ist eine polymorphe Kurvenanpassung?

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.

Was du machen willst

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.

Quellcode

#!/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')

Ausführungsergebnis

test.png

Recommended Posts

PRML-Diagrammzeichnung Abbildung 1.4 Polygonkurvenanpassung
Implementiert in Python PRML Kapitel 1 Polygonkurvenanpassung
[Python] Kurvenanpassung mit Polypolyse
PRML Kapitel 1 Bayesian Curve Fitting Python-Implementierung
PRML-Diagrammzeichnung Aufgabe 1.4 Nichtlineare Transformation der Wahrscheinlichkeitsdichtefunktion