Régression linéaire en python
Exemple : Régression linéaire en python
Voici un premier exemple de régression linéaire en python en utilisant l'algorithme de descente du gradient :
1
import numpy as np
2
3
class Model:
4
def __init__(self, a, b):
5
self.a = a
6
self.b = b
7
def f(self, x):
8
return self.a * x + self.b
9
def __call__(self, x, y):
10
derreur_df = (2 * ( self.a * x + self.b - y ))
11
dJ_da = np.mean(derreur_df * x )
12
dJ_db = np.mean(derreur_df)
13
return dJ_da, dJ_db
14
def perte(model,x,y):
15
return np.mean((model.f(x)-y) ** 2)
16
17
x = np.array([1,2,3,4],np.float32)
18
y = np.array([3,5,7,10],np.float32)
19
alpha = 0.005
20
norme_epsilon= 1000
21
seuil_epsilon = 12
22
ma_fonction = Model(7.3, 5.5 )
23
chemin =list()
24
for i in range(1000):
25
dJ_da, dJ_db = ma_fonction(x, y)
26
norme_epsilon = np.abs(dJ_da) + np.abs(dJ_db)
27
ma_fonction.a = ma_fonction.a - alpha * dJ_da
28
ma_fonction.b = ma_fonction.b - alpha * dJ_db
29
print('Perte : ', ma_fonction.b,perte(ma_fonction, x, y))
30
print('(a, b) : (', ma_fonction.a,', ',ma_fonction.b,')')
Exemple : Complément du programme précédent
L'exemple précédent ne faisait que la recherche d'une solution en utilisant la descente du gradient. Le programme suivant illustre graphiquement cette méthode :
1
import numpy as np
2
import matplotlib as mpl
3
from mpl_toolkits.mplot3d import Axes3D
4
from matplotlib import pyplot as plt
5
6
class Model:
7
def __init__(self, a, b):
8
self.a = a
9
self.b = b
10
def f(self, x):
11
return self.a * x + self.b
12
def __call__(self, x, y):
13
derreur_df = (2 * ( self.a * x + self.b - y ))
14
dJ_da = np.mean(derreur_df * x )
15
dJ_db = np.mean(derreur_df)
16
return dJ_da, dJ_db
17
def perte(model,x,y):
18
return np.mean((model.f(x)-y) ** 2)
19
20
x = np.array([1,2,3,4],np.float32)
21
y = np.array([3,5,7,10],np.float32)
22
alpha = 0.005
23
norme_epsilon= 1000
24
seuil_epsilon = 12
25
ma_fonction = Model(7.3, 5.5 )
26
chemin =list()
27
for i in range(1000):
28
dJ_da, dJ_db = ma_fonction(x, y)
29
norme_epsilon = np.abs(dJ_da) + np.abs(dJ_db)
30
ma_fonction.a = ma_fonction.a - alpha * dJ_da
31
ma_fonction.b = ma_fonction.b - alpha * dJ_db
32
chemin.append([ma_fonction.a, ma_fonction.b,perte(ma_fonction, x, y)])
33
34
35
aa = np.arange(-5 + ma_fonction.a, 5 + ma_fonction.a, 0.05)
36
bb = np.arange(-5 + ma_fonction.b, 5 + ma_fonction.b, 0.05)
37
a_, b_ = np.meshgrid(aa, bb)
38
zz = np.zeros(a_.shape,np.float32)
39
for idx in range(x.shape[0]):
40
zz = zz + (a_ * x[idx] + b_ - y[idx]) ** 2
41
plt.figure(1)
42
plt.plot(x, ma_fonction.f( x) , c='g')
43
plt.scatter(x, y, c='r')
44
plt.legend(['model', 'data'])
45
fig = plt.figure(2)
46
ax = fig.gca(projection='3d')
47
surf = ax.plot_wireframe(a_, b_, zz/x.shape[0],
48
rstride=10, cstride=10)
49
ax.plot([x[0] for x in chemin], [x[1] for x in chemin], [x[2] for x in chemin], label='gradient descendant')
50
ax.scatter([x[0] for x in chemin], [x[1] for x in chemin], [x[2] for x in chemin],c='r')
51
ax.legend()
52
plt.show()
Exemple : Régression linéaire par moindre carré en utilisant python
Ce programme permet d'obtenir la meilleure équation de droite au sens des moindres carrés.
1
def reglin(x, y):
2
# Calcul de l'équation de la droite y= a x + b en utilisant les moindres carrés
3
m = np.ones((x.shape[0],2),np.float32)
4
m[:,0]=x.transpose()
5
p = np.matmul(np.matmul(np.linalg.inv(np.matmul(m.transpose(),m)),m.transpose()),y.reshape(x.shape[0],1))
6
return p[0,0], p[1,0]
7
8
x = np.array([1,2,3,4],np.float32)
9
y = np.array([3,5,7,10],np.float32)
10
a_mc2, b_mc2 = reglin(x,y)
11
model_ref = Model(a_mc2,b_mc2)
12
print('Perte MC22: ', perte(model_ref(x), y).numpy())
13