[PYTHON] Schéma de schéma PRML Figure 1.4 Ajustement de la courbe polygonale

Qu'est-ce que l'ajustement de courbe polymorphe?

Il s'agit de l'algorithme de régression le plus élémentaire. Des algorithmes tels que la régression linéaire bayésienne, les réseaux de neurones et les processus gaussiens qui apparaîtront plus tard ont été ajoutés à la théorie des probabilités ou conçus pour pouvoir être appliqués à des espaces de dimensions plus élevées, mais la partie de base Sont communs.

Chose que tu veux faire

Supposons que vous observiez une entrée $ \ boldsymbol {x} = (x_1, x_2, \ cdots, x_N) ^ T $ et une sortie $ \ boldsymbol {t} = (t_1, t_2, \ cdots, t_N) ^ T $. .. (N est le nombre de données) Supposons maintenant que vous vouliez prédire la sortie $ t $ pour la nouvelle entrée $ x $. C'est ce qu'on appelle le "problème de retour".

Considérons maintenant une fonction $ y (x) $. Lorsque $ x_1, x_2, \ cdots, x_N $ sont affectés à cette fonction, la sortie $ y (x_1), y (x_2), \ cdots, y (x_N) $ est $ t_1, t_2, \ cdots. Si la valeur est proche de, t_N $, alors la sortie $ t $ pour la nouvelle entrée $ x $ est susceptible de correspondre à $ y (x) $.

Dans l'ajustement de courbe polymorphe, nous introduisons le paramètre $ \ boldsymbol {w} = (w_0, w_1, \ cdots, w_M) ^ T $ et considérons le polynôme suivant. (M est la dimension du polypoly: un paramètre fixe.)

y(x, \boldsymbol{w})=w_0+w_1x^1+w_2x^2+{\cdots}w_Mx^M= \boldsymbol{w}^T\boldsymbol{\phi}(x)

Cependant, $ \ boldsymbol {\ phi} (x) = (1, x, x ^ 2, \ cdots, x ^ M) ^ T $

De plus, le résultat de la substitution de $ x_1, x_2, \ cdots, x_N $ pour cette fonction est résumé comme suit.

\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}

Cependant, $ \ boldsymbol {\ Phi} = (\ boldsymbol {\ phi} (x_1), \ boldsymbol {\ phi} (x_2), \ cdots, \ boldsymbol {\ phi} (x_N)) ^ T $

Trouvez $ \ boldsymbol {w} $, qui correspond autant que possible à $ \ boldsymbol {y} (\ boldsymbol {x}, \ boldsymbol {w}) $ avec $ \ boldsymbol {t} $. Pour ce faire, prenez d'abord la différence entre les deux et ajustez-la.

\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}

Je veux trouver $ \ boldsymbol {w} $ qui rend cette erreur $ E (\ boldsymbol {w}) $ aussi petite que possible, donc si je la différencie par $ \ boldsymbol {w} $ et la règle sur $ 0 $,

\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}

Résolvez ceci,

\boldsymbol{w} =(\boldsymbol{\Phi} ^T\boldsymbol{\Phi})^{-1}\boldsymbol{\Phi}^T\boldsymbol{t}

Ce sera. Mettons-le en œuvre.

Code source

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


import numpy as np
import matplotlib.pyplot as plt


#Données d'entraînement
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]


#Tracer les données
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 apprentissage
    Phi = _Phi(x,M)
    w = np.linalg.inv(Phi.T.dot(Phi)).dot(Phi.T).dot(t)

    plotArea += 1
    plt.subplot(2,2,plotArea)

    #Tracé des données d'entraînement
    plt.plot(x,t,'o',c='w',ms=5,markeredgecolor='blue',markeredgewidth=1)

    #Tracé de courbe vraie
    plt.plot(X,np.sin(2 * np.pi * X),'g')

    #Tracé de courbe approximatif
    for i in range(plotS):
        Y[i] = w.dot(_phi(X[i],M))
    plt.plot(X,Y,'r')

Résultat d'exécution

test.png

Recommended Posts

Schéma de schéma PRML Figure 1.4 Ajustement de la courbe polygonale
Implémenté dans Python PRML Chapitre 1 Ajustement de courbe polygonale
[Python] Ajustement de courbe avec polypoly
PRML Chapitre 1 Implémentation de Python pour l'ajustement de courbe bayésienne
Exercice de dessin de diagramme PRML 1.4 Transformation non linéaire de la fonction de densité de probabilité