Implémenté en Python PRML Chapitre 3 Régression linéaire bayésienne

Reconnaissance de formes et apprentissage automatique, le chapitre 3 reproduit comment la régression linéaire bayésienne fait converger la distribution prédite. Ce que nous faisons est presque la même que l'estimation bayésienne que nous avons faite au chapitre 1, seule la fonction de base est la fonction gaussienne (3.4). Par conséquent, le code est presque détourné.

Par rapport au chapitre 1, au chapitre 3, l'expression de la formule mathématique est réécrite pour manipuler les vecteurs, y a-t-il une intention dans ce domaine? Depuis que j'ai introduit le concept de vecteur de caractéristiques dans (3.16) ici, je me demande si c'est la manière de l'écrire, mais qu'en est-il?

Flux de mise en œuvre approximatif

(1) Ce que vous voulez trouver est la distribution prévue (3,57).

 p(t|{\bf x}, {\bf t}, \alpha, \beta) = N (t| {\bf m}^T_N \phi({\bf x}),  \sigma^2_N ({\bf x})) (3.58)

② La fonction de base est $ \ phi_i (x) = \ exp \ {- \ frac {(x- \ mu_j) ^ 2} {2s ^ 2} } $ in (3.4). Bien que 9 fonctions de base soient spécifiées, elles sont organisées de manière à être uniformément réparties car il n'y a aucune instruction sur la façon de les organiser.

(3) Puisqu'il existe les trois formules suivantes pour calculer la moyenne et la variance de la distribution prédite, appliquez chacune d'elles pour obtenir la distribution prédite.

{\bf m}_N = \beta{\bf S}_N\Phi(x_n)^{\bf T}{\bf t}(3.53)
\sigma^2_N(x) = \beta^{-1} + \phi({\bf x})^{\bf T} {\bf S}_N \phi({\bf x}). (3.59)
{\bf S}^{-1}_N = \alpha {\bf I} + \beta\Phi^{\bf T}\Phi(3.54)

code

En dessinant la figure, @ naoya_t's Cet article (Reproduction of the plate of bayesian linear regression (PRML§3.3)) montre comment les données de l'échantillon convergent à mesure qu'elles augmentent. ) Je n'étais pas convaincu que je pouvais trouver une idée pour dessiner plus joliment, alors je l'ai utilisée comme référence, presque comme une copie. Merci beaucoup.

import numpy as np
from numpy.linalg import inv
import pandas as pd
from pylab import *
import matplotlib.pyplot as plt

def func(x_train, y_train):
    # (3.4) Gaussian basis function
    def phi(s, mu_i, M, x):
        return np.array([exp(-(x - mu)**2 / (2 * s**2)) for mu in mu_i]).reshape((M, 1))

    #(3.53)' ((1.70)) Mean of predictive distribution
    def m(x, x_train, y_train, S):
        sum = np.array(zeros((M, 1)))
        for n in xrange(len(x_train)):
            sum += np.dot(phi(s, mu_i, M, x_train[n]), y_train[n])
        return Beta * phi(s, mu_i, M, x).T.dot(S).dot(sum)
    
    #(3.59)'((1.71)) Variance of predictive distribution   
    def s2(x, S):
        return 1.0/Beta + phi(s, mu_i, M, x).T.dot(S).dot(phi(s, mu_i, M, x))

    #(3.53)' ((1.72))
    def S(x_train, y_train):
        I = np.identity(M)
        Sigma = np.zeros((M, M))
        for n in range(len(x_train)):
            Sigma += np.dot(phi(s, mu_i, M, x_train[n]), phi(s, mu_i, M, x_train[n]).T)
        S_inv = alpha*I + Beta*Sigma
        S = inv(S_inv)
        return S
    
    #params for prior probability
    alpha = 0.1
    Beta = 9
    s = 0.1

    #use 9 gaussian basis functions
    M = 9

    # Assign basis functions
    mu_i = np.linspace(0, 1, M)
    
    S = S(x_train, y_train)

    #Sine curve
    x_real = np.arange(0, 1, 0.01)
    y_real = np.sin(2*np.pi*x_real)
    
    #Seek predictive distribution corespponding to entire x
    mean = [m(x, x_train, y_train, S)[0,0] for x in x_real]
    variance = [s2(x, S)[0,0] for x in x_real]
    SD = np.sqrt(variance)
    upper = mean + SD
    lower = mean - SD
    
    plot(x_train, y_train, 'bo')
    plot(x_real, y_real, 'g-')
    plot(x_real, mean, 'r-')
    fill_between(x_real, upper, lower, color='pink')
    xlim(0.0, 1.0)
    ylim(-2, 2)
    title("Figure 3.8")
    show()

if __name__ == "__main__":
    # Maximum observed data points (underlining function plus some noise)
    x_train = np.linspace(0, 1, 26)

    #Set "small level of random noise having a Gaussian distribution"
    loc = 0
    scale = 0.3
    y_train =  np.sin(2*np.pi*x_train) + np.random.normal(loc,scale,26)


    #Sample data pick up
    def randidx(n, k):
        r = range(n)
        shuffle(r)
        return sort(r[0:k])

    for k in (1, 2, 5, 26):
        indices = randidx(size(x_train), k)
        func(x_train[indices], y_train[indices])

résultat

Screen Shot 2015-09-21 at 00.20.33.png Screen Shot 2015-09-21 at 00.21.00.png Screen Shot 2015-09-21 at 00.21.21.png Screen Shot 2015-09-21 at 00.21.32.png

référence

Reproduction de la régression linéaire bayésienne (PRML §3.3)

Recommended Posts

Implémenté en Python PRML Chapitre 3 Régression linéaire bayésienne
Implémenté en Python PRML Chapitre 1 Estimation bayésienne
PRML Chapitre 4 Implémentation Python de la régression logistique bayésienne
Implémenté en Python PRML Chapitre 7 SVM non linéaire
Implémenté dans Python PRML Chapter 5 Neural Network
Implémenté dans Python PRML Chapitre 1 Ajustement de courbe polygonale
Régression linéaire en ligne en Python
"Régression linéaire" et "Version probabiliste de la régression linéaire" en Python "Régression linéaire de Bayes"
Implémenté en Python PRML Chapitre 4 Classification par algorithme Perceptron
Régression linéaire en Python (statmodels, scikit-learn, PyMC3)
Régression linéaire en ligne en Python (estimation robuste)
PRML Chapitre 6 Implémentation Python Gaussian Return
PRML Chapitre 1 Implémentation de Python pour l'ajustement de courbe bayésienne
Reproduction sur plaque de régression linéaire bayésienne (PRML §3.3)
J'ai essayé d'implémenter la régression logistique de Cousera en Python
J'ai essayé d'implémenter le filtre anti-spam bayésien de Robinson avec python
Implémentation de SimRank en Python
J'ai essayé d'implémenter la régression linéaire bayésienne par échantillonnage de Gibbs en python
PRML Chapitre 12 Mise en œuvre de l'analyse principale bayésienne Python
Recherche linéaire en Python
Implémentation de Shiritori en Python
Analyse de régression avec Python
Implémentation python de la classe de régression linéaire bayésienne
Coursera Machine Learning Challenge en Python: ex1 (régression linéaire)
Expression de régression multiple en Python
Implémentation de Supreme Solver dans Python 3
Analyse de régression simple avec Python
[Python] Régression linéaire avec scicit-learn
PRML Chapter 7 Implémentation de Python Vector Machine associée pour les problèmes de régression
Première analyse de régression simple en Python
Implémentation de la segmentation d'image en python (Union-Find)
100 Language Processing Knock Chapitre 1 en Python
PRML Chapitre 5 Implémentation Python du réseau neuronal
GPyOpt, un package d'optimisation bayésienne en Python
Règles d'apprentissage Widrow-Hoff implémentées en Python
Implémentation de la méthode de propagation d'étiquettes en Python
PRML Chapitre 3 Preuve Implémentation approximative de Python
Implémentation des règles d'apprentissage Perceptron en Python
Implémenté en 1 minute! LINE Notify en Python
Introduction à la modélisation statistique bayésienne avec python ~ Essai de régression linéaire avec MCMC ~
PRML Chapitre 8 Algorithme Somme des produits Implémentation Python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Livre de canard implémenté en Python "Modélisation statistique Bayes avec Stan et R"
PRML Chapter 5 Implémentation Python de réseau à densité mixte
Un client HTTP simple implémenté en Python
PRML Chapitre 9 Implémentation Python de distribution gaussienne mixte
Valeurs authentiques et vecteurs propres: Algèbre linéaire en Python <7>
PRML Chapitre 14 Implémentation Python de modèle mixte conditionnel
Implémentation PRML Chapitre 3 Modèle de fonction de base linéaire
PRML Chapitre 10 Implémentation Python de distribution gaussienne mixte
PRML Chapter 2 Student t-Distribution Python Implementation
J'ai essayé d'utiliser l'optimisation bayésienne de Python
<Cours> Machine learning Chapitre 1: Modèle de régression linéaire
Régression linéaire
Indépendance et base linéaires: Algèbre linéaire en Python <6>
Mise en œuvre du tri Stuge dans Python 3 (tri à bulles et tri rapide)
PRML §3.3.1 Reproduire le diagramme de convergence de la distribution des paramètres par régression linéaire bayésienne
Introduction aux vecteurs: Algèbre linéaire en Python <1>
Introduction à la vérification de l'efficacité Chapitre 1 écrit en Python