[PYTHON] (Apprentissage automatique) J'ai essayé de comprendre attentivement la régression linéaire bayésienne avec l'implémentation

introduction

J'étudie la théorie bayésienne. Cette fois, je résumerai la régression linéaire basée sur la théorie bayésienne.   Les livres et articles auxquels j'ai fait référence sont les suivants.

Qu'est-ce que la régression linéaire bayésienne?

L'idée de régression linéaire que vous rencontrez lors de l'apprentissage de l'apprentissage automatique est différente de celle de la régression linéaire bayésienne à laquelle nous avons affaire cette fois. Le contour est présenté ci-dessous.  image.png

(Théorie des fréquences) Régression linéaire

Une régression linéaire basée sur la méthode des moindres carrés est appelée régression linéaire théorique de la fréquence pour la distinguer de la régression linéaire bayésienne. * Si le nom n'est pas strictement basé sur la fréquence, nous vous serions reconnaissants de bien vouloir commenter.

Cette méthode peut être obtenue très facilement même avec Excel. Je l'utilise aussi souvent lors de la compilation de données dans mon travail. Eh bien, cette méthode est très simple à penser.


E(w) = \frac {1}{2}\sum_{n=1}^{N}(y(x_n,w)-t_n)^2

cependant,

Tout ce que vous avez à faire est de trouver le coefficient polynomial $ w $ qui minimise $ E (w) $, qui s'appelle cette fonction d'erreur.

Régression linéaire bayésienne

En revanche, considérons la régression linéaire bayésienne. Considérons les probabilités suivantes pour les données observées $ X, Y $.


p(w|X,Y) = \frac {p(w)p(Y|X,w)}{p(X,Y)}

ici,

Ce sera.

L'intérêt de la pensée bayésienne est que tous sont organisés par probabilité (= distribution). ** Je comprends que j'essaie de le capturer comme une distribution incluant la solution optimale **.

Un autre point est l'idée appelée estimation bayésienne. Il se réfère à l'acte d'essayer de trouver la probabilité (= post-probabilité) avec une valeur (= pré-probabilité) supposée à l'avance. Quand je l'ai entendu pour la première fois, c'était rafraîchissant.

Dans ce cas,p(w|X,Y)EstX,YParamètre de poids quand est donnéwJe veux trouver la distribution de probabilité de. C'est la valeur observéeX,Paramètre de poidswparYLa distribution prévue dep(Y|X,w)Il est calculé en utilisant. Au fait, je me demande comment calculer avec $ w $ même si j'aurais dû vouloir connaître $ w $.

Dans cette façon de penser bayésienne, il est nécessaire de considérer l'axe du temps. En d'autres termes, il est nécessaire de considérer l'écoulement du temps pour déterminer temporairement le paramètre de poids à partir d'une certaine donnée et le mettre à jour à une bonne valeur à tout moment. C'est une idée très pratique utilisée dans le processus d'augmentation des données à partir d'un petit nombre de données.

Trouvons en fait la distribution (transformation de formule en régression linéaire bayésienne)

Maintenant, je voudrais résoudre le problème de la régression par régression linéaire bayésienne. Considérez ce qui suit pour $ p (w | X, Y) $, avec le paramètre $ t $.

p(w|t) \propto p(t|w)p(w)

À l'origine, $ p (t) $ devrait arriver au dénominateur lors du calcul, mais comme le calcul est compliqué, nous le considérerons avec la formule proportionnelle $ \ propto $. Ici, $ p (t | w) $ et $ p (w) $ sont montrés ci-dessous, respectivement.

\begin{align}
p(t|w)&=\prod_{n=1}^N \left\{ \mathcal{N} (t_n|w^T\phi(x_n), \beta^{-1}) \right\}\\

\end{align}\\
p(w)=\mathcal{N}(w|m_0, S_0)

Il est formulé comme suit la distribution gaussienne.

De plus, les constantes et les fonctions sont affichées ci-dessous.

=\prod_{n=1}^N \left\{ \mathcal{N} (t_n|w^T\phi(x_n), \beta^{-1}) \right\} \mathcal{N}(w|m_0, S_0)\\
\propto \left( \prod_{n=1}^N exp\left[ -\frac{1}{2} \left\{ t_n - w^T \phi(x_n) \right\}^2 \beta \right] \right) exp\left[ -\frac{1}{2} (w - m_0)^TS_0^{-1}(w - m_0) \right]\\
= exp\left[  -\frac{1}{2} \left\{ \beta \sum_{n=1}^N \left( t_n - w^T\phi(x_n) \right)^2 + (w - m_0)^TS_0^{-1}(w - m_0) \right\} \right]

Peut être transformé avec. Après cela, nous développerons soigneusement cette formule.

\beta \sum_{n=1}^N \left( t_n - w^T\phi(x_n) \right)^2 + (w - m_0)^TS_0^{-1}(w - m_0)\\
= \beta \left( \begin{array}{c}
t_1 - w^T\phi(x_1) \\
\vdots\\
t_N - w^T\phi(x_N)
\end{array} \right)^T
\left( \begin{array}{c}
t_1 - w^T\phi(x_1) \\
\vdots\\
t_N - w^T\phi(x_N)
\end{array} \right)
+ (w - m_0)^TS_0^{-1}(w - m_0)

Il peut être exprimé par $ w ^ T \ phi (x_1) = \ phi ^ T (x_1) w $. Donc,

= \beta \left( \begin{array}{c}
t_1 - \phi^T(x_1)w \\
\vdots\\
t_N - \phi^T(x_N)w
\end{array} \right)^T
\left( \begin{array}{c}
t_1 - \phi^T(x_1)w \\
\vdots\\
t_N - \phi^T(x_N)w
\end{array} \right)
+ (w - m_0)^TS_0^{-1}(w - m_0)\\

Ce sera. Maintenant, ici, la fonction de base est exprimée sous une forme appelée matrice de conception comme indiqué ci-dessous.

\Phi = \left( \begin{array}{c}
\phi^T(x_1) \\
\vdots\\
\phi^T(x_N)
\end{array} \right)

Nous l'utiliserons pour résumer davantage. Les termes de seulement $ \ beta $ et $ m $ sont des termes constants, mais ils sont regroupés sous la forme $ C $.

= \beta (t - \Phi w)^T(t - \Phi w) + (w - m_0)^TS_0^{-1}(w - m_0)\\
= \beta ( w^T\Phi^T\Phi w - w^T\Phi^Tt - t^T\Phi w ) + w^TS_0^{-1}w - w^TS_0^{-1}m_0 - m_0^TS_0^{-1}w + C\\

Puisque $ S_0 $ est covariant, il s'agit d'une matrice symétrique. Par conséquent, puisque sa matrice inverse est également une matrice symétrique, elle peut être exprimée comme $ (S_0 ^ {-1}) ^ T = S_0 ^ {-1} $. Appliquer ceci au coefficient $ w $

= w^T(S_0^{-1} + \beta \Phi^T\Phi)w - w^T(S_0^{-1}m_0 + \beta \Phi^T t) - (S_0^{-1}m_0 + \beta \Phi^T t)^Tw + C

Ici, si $ R = S_0 ^ {-1} m_0 + \ beta \ Phi ^ Tt $

= w^TS_N^{-1}w - w^TR - R^Tw + C

J'ai pu résumer. De plus, il peut être résumé par complétion de carré et factorisation à partir d'ici, mais c'est un calcul assez difficile. Confirmez la correspondance en développant la formule qui est complétée dans Amanojaku.

Développer l'expression

\mathcal{N}(w|m_N, S_N)\\
\propto exp\left\{ -\frac{1}{2} (w - m_N)^T S_N^{-1} (w - m_N) \right\}

Encore une fois, nous ne discuterons que du contenu de $ - \ frac {1} {2} $ dans $ exp $ dans l'équation de distribution gaussienne.

(w - m_N)^T S_N^{-1} (w - m_N)\\

Ici, $ m_N et S_N $ sont donnés comme suit.

m_N = S_N(S_0^{-1} m_0 + \beta \Phi^Tt) = S_NR\\
S_N^{-1} = S_0^{-1} + \beta \Phi^T \Phi

Ici, $ S_N $ apparaît également dans la formule cible dérivée de la distribution postérieure, alors ne le développez pas, mais développez $ m_N $.

(w - m_N)^T S_N^{-1} (w - m_N)\\
= (w - S_NR)^T S_N^{-1} (w - S_NR)\\
= w^T S_N^{-1} w - w^T R - R^Tw + C

Par conséquent, la distribution postérieurep(w|t)Quand\mathcal{N}(w|m_N, S_N)A la même distribution normale.

Je vais le mettre en œuvre et le vérifier.

Cette fois, retraçons les points de données générés aléatoirement en fonction de la fonction $ sin $.

Faire une matrice de planification

beyes.ipynb



#Faire une procession de planification
Phi = np.array([phi(x) for x in X])
 
#Hyper paramètres
alpha = 0.1
beta = 9.0
M = 12

Créer une fonction de sinus distribuée de manière aléatoire

beyes.ipynb



n = 10
X = np.random.uniform(0, 1, n)
T = np.sin(2 * np.pi * X) + np.random.normal(0, 0.1, n)
plt.scatter(X, T)
plt.plot(np.linspace(0,1), np.sin(2 * np.pi * np.linspace(0,1)), c ="g")
plt.show()

015.png

Trouvez la moyenne et la variance des probabilités postérieures

Pour un calcul facile cette fois, définissez $ m_0 = 0 $, $ S_0 = α ^ {-1} I $ $ S_N ^ {-1} = αI + \ beta \ Phi ^ T \ Phi $, $ m_N = βS_N \ Phi ^ Tt $.

beyes.ipynb


#Dispersion des probabilités postérieures
S = np.linalg.inv(alpha * np.eye(M) + beta * Phi.T.dot(Phi))
#Probabilité moyenne ex post facto
m = beta * S.dot(Phi.T).dot(T)

Illustré

beyes.ipynb


x_, y_ = np.meshgrid(np.linspace(0,1), np.linspace(-1.5, 1.5))
Z = np.vectorize(norm)(x_,y_)
x = np.linspace(0,1)
y = [m.dot(phi(x__)) for x__ in x]
 
plt.figure(figsize=(10,6))
plt.pcolor(x_, y_, Z, alpha = 0.2)
plt.colorbar()
plt.scatter(X, T)
#Moyenne de la distribution prévue
plt.plot(x, y)
#Distribution authentique
plt.plot(np.linspace(0,1), np.sin(2 * np.pi * np.linspace(0,1)), c ="g")
plt.show()
 
#Exemple de paramètres obtenus à partir de la distribution postérieure
m_list = [np.random.multivariate_normal(m, S) for i in range(5)]
 
for m_ in m_list:
    x = np.linspace(0,1)
    y = [m_.dot(phi(x__)) for x__ in x]
    plt.plot(x, y, c = "r")
    plt.plot(np.linspace(0,1), np.sin(2 * np.pi * np.linspace(0,1)), c ="g")

013.png

L'ombre montre où la densité de probabilité est élevée.

À la fin

Cette fois, nous avons résumé la régression linéaire bayésienne du concept à la mise en œuvre. J'étais presque perdu car le développement de l'expression était très compliqué. Cependant, l'idée est très simple et importante dans l'apprentissage automatique de savoir comment obtenir une probabilité plausible à partir d'une petite quantité de données.

Je continuerai d'apprendre à comprendre profondément les sentiments du bayésien.

Le programme complet est ici. https://github.com/Fumio-eisan/Beyes_20200512

Recommended Posts

(Apprentissage automatique) J'ai essayé de comprendre attentivement la régression linéaire bayésienne avec l'implémentation
(Apprentissage automatique) J'ai essayé de comprendre attentivement l'algorithme EM dans la distribution gaussienne mixte avec l'implémentation.
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
J'ai essayé l'apprentissage automatique avec liblinear
J'ai essayé d'implémenter la régression linéaire bayésienne par échantillonnage de Gibbs en python
Régression linéaire d'apprentissage automatique
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Implémentation ~
J'ai essayé de comprendre attentivement la fonction d'apprentissage dans le réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique (deuxième moitié)
J'ai essayé d'organiser les index d'évaluation utilisés en machine learning (modèle de régression)
J'ai essayé de passer par l'optimisation bayésienne. (Avec des exemples)
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
Machine Learning: Supervision - Régression linéaire
Comprendre l'apprentissage automatique ~ régression de crête ~.
J'ai essayé de comprendre attentivement la fonction d'apprentissage dans le réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique (première moitié)
J'ai essayé de créer un environnement d'apprentissage automatique avec Python (Mac OS X)
Oncle SE avec un cerveau endurci a essayé d'étudier l'apprentissage automatique
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
J'ai essayé d'implémenter ListNet d'apprentissage de rang avec Chainer
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé d'écrire dans un modèle de langage profondément appris
Les débutants en apprentissage automatique essaient la régression linéaire
J'ai essayé d'apprendre LightGBM avec Yellowbrick
J'ai essayé de bien le comprendre en implémentant l'algorithme Adaboost en machine learning (+ j'ai approfondi ma compréhension du calcul de tableaux)
(Python) Valeur attendue ・ J'ai essayé de comprendre attentivement l'échantillonnage Monte Carlo
J'ai essayé de rendre le deep learning évolutif avec Spark × Keras × Docker
Introduction à la modélisation statistique bayésienne avec python ~ Essai de régression linéaire avec MCMC ~
[Apprentissage automatique] J'ai essayé de faire quelque chose comme passer des images
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Introduction ~
J'ai essayé de comprendre l'apprentissage supervisé de l'apprentissage automatique d'une manière facile à comprendre, même pour les ingénieurs serveurs 1
J'ai essayé de comprendre l'apprentissage supervisé de l'apprentissage automatique d'une manière facile à comprendre, même pour les ingénieurs serveurs 2
J'ai essayé de créer un linebot (implémentation)
J'ai essayé l'analyse de régression multiple avec régression polypoly
Algorithme d'apprentissage automatique (généralisation de la régression linéaire)
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de visualiser AutoEncoder avec TensorFlow
Enregistrez les étapes pour comprendre l'apprentissage automatique
J'ai essayé de commencer avec Hy
Apprentissage automatique avec python (2) Analyse de régression simple
J'ai installé Python 3.5.1 pour étudier l'apprentissage automatique
<Cours> Machine learning Chapitre 1: Modèle de régression linéaire
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai essayé de résoudre TSP avec QAOA
Algorithme d'apprentissage automatique (résumé de régression linéaire et régularisation)
J'ai essayé de mettre en œuvre un apprentissage en profondeur qui n'est pas profond avec uniquement NumPy
Mayungo's Python Learning Episode 2: J'ai essayé de mettre des caractères avec des variables
J'ai essayé de classer les accords de guitare en temps réel en utilisant l'apprentissage automatique
J'ai essayé de comprendre l'arbre de décision (CART) pour classer soigneusement
J'ai commencé l'apprentissage automatique avec Python (j'ai également commencé à publier sur Qiita) Préparation des données
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Battle Edition ~
[Python] Introduction facile à l'apprentissage automatique avec python (SVM)
J'ai essayé d'implémenter la lecture de Dataset avec PyTorch
J'ai essayé d'utiliser lightGBM, xg boost avec Boruta
J'ai essayé d'apprendre le fonctionnement logique avec TF Learn
J'ai essayé de déplacer GAN (mnist) avec keras
Mayungo's Python Learning Episode 5: J'ai essayé de faire quatre règles avec des nombres
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de détecter rapidement un mouvement avec OpenCV
J'ai essayé d'intégrer Keras dans TFv1.1