Thématiques principales

samedi 15 septembre 2018

IA: Equation normale

Il y a quelques jours, j'avais parlé de l’équation normale dans la régression linéaire [1]. Nous n'avions pas traité de son utilisation dans la régression linéaire parque:
  • c'est la solution analytique et que du coup c'est la solution simple
  • elle ne s'applique qui si les jeux de données sont limitées
  • c'est pas fun car on voulait utiliser la descente de gradient.
Du coup nous l'avions laissé de coté, la pauvre....

Aujourd'hui on va rendre a l’équation normale ce qui appartient à l’équation normale, c'est a dire la régression linéaire.

Dans le principe, l’équation normale [2] est la résolution analytique parfaite des coefficients du modèle linéaire:



Avec Theta, le vecteur des coefficients du modèle, X le vecteur des données d'entrée et Y le vecteur des données de sortie attendues.

Pour illustrer cela, prenons un exemple en python:


1
2
3
4
5
6
7
import numpy as np
 
MAX=1000
    
X=  np.arange( 0, MAX )
T= 4+3*X  
Y= T + (np.random.rand(1,MAX)-0.5)[0]*3000 

Dans cet exemple, nous allons construire une série de valeur de 0 a 3000, on en calcule la série T équivalente selon une droite dont on va bruité les données: la série Y.

Représentons ces données:

1
2
3
4
5
import matplotlib.pyplot as plt
fig = plt.figure(1,figsize=(8,8))
plt.plot(X,T,"b-")# model lineaire
plt.plot(X,Y,"r.")# model lineaire bruité
plt.show(



Donc on a bien déployer nos données autour de la droite T. Avant de chercher des paramètres, en première approche, nous pourrions nous demander si l’équation normale est capable de nous retrouver les paramètres initiaux de la droite avant que celle ci ne soit bruitée.

Appliquons l'equation normale a (X,T) afin de voir si le Theta resultant est bien le couple (4,3):


1
2
3
4
5
Xmat=np.c_[np.ones((len(X),1)),np.mat(X).T]
Ymat=np.mat(T).T

Verif=np.linalg.inv(Xmat.T.dot(Xmat)).dot(Xmat.T).dot(T)
print(Verif)

De résultat:

[[4.]
 [3.]]

Cool! Au moins on sait que l'on sait retrouver nos paramètres! A noter la préparation des données avec la fonction c_ (concatenate) et ones qui permet de construire une matrice unitaire (rempli de 1). L'objectif de cette préparation est de permettre de produire une paire de valeur.

Maintenant reprenons nos données buitées et calculons nos paramètres, au passage calculons les valeurs résultants du modèle sur l'ensemble des valeurs d'entrées:

1
2
3
4
Xmat=np.c_[np.ones((len(X),1)),np.mat(X).T]
Ymat=np.mat(Y).T
TheTa=np.linalg.inv(Xmat.T.dot(Xmat)).dot(Xmat.T).dot(Ymat)
print(TheTa)

donnant:

[[-165.91134982]
 [   3.24312348]]

OK cela ne correspond pas a nos paramètres initiaux. Mais peut etre que cela donne une bonne approximation de nos données. Superposons les graphes:


1
2
3
4
5
6
ThetaD=np.array(TheTa[0])+np.array(TheTa[1])*X
fig = plt.figure(1,figsize=(8,8))
plt.plot(X,Y,"r.")# model lineaire bruité
plt.plot(X,T,"b-")# model lineaire
plt.plot(X,ThetaD.T,"y-") # taux erreur de base deux precedents
plt.show()

Effectivement nos deux droites ne sont pas les mêmes, cependant, au vue de la dispersion, celle estimé est une assez bonne approximation de la première. Bien sur c'est lorsque l'on sortira du périmètre de l'ensemble [0-1000] que les encarts se feront les plus important. Il faudra donc en tenir compte lors de l'utilisation du modèle résultant de façon a minimiser les erreurs.

Voila, en fournissant une solution analytique, l’équation normale fourni une approche assez immédiate pour la détermination des paramètres de notre modèle. Apres il reste comme tout autre approche limité par l'ensemble des données du jeu d’apprentissage dont la taille peut rendre celle ci rédhibitoire.

Références

[1] https://un-est-tout-et-tout-est-un.blogspot.com/2018/09/started-ia-neuromimetique-la-regression.html
[2] http://gilles.dubois10.free.fr/geometrie_affine/eucliequanorm.html

Aucun commentaire:

Enregistrer un commentaire