Régressions polynomiales

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 247 fois - Téléchargée 10 fois

Contenu du snippet

La régression polynomiale est une analyse statistique qui décrit la variation d'une variable aléatoire.

Ce programme en générera une au hasard. Il utilise les biblothéques numpy et matplotlib.pyplot. Pour accomplir sa tâche, il définit un polynôme de degré m arbitrairement. Ensuite, il génère une liste de n points appartenant au polynôme précédemment défini. Et on y ajoute du bruit. Après, on établit le système à m+1 équations sous forme matricielle. Sa solution sera les coefficients du polynôme qui correspondra à la régression voulu.

Ce procédé sera réitéré m+1 fois.

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

#Pour les matrices !
# i : n° ligne
# j : n° colonne
# A[i][j]

#Pour les vecteurs !
# i : n° ligne
# transpose(u[i]) = U[i][0]

from numpy import *
import matplotlib.pyplot as plt
from random import randint, random

def somme(l):
 s = 0
 for i in l:
  s += i
 return s

def graph(x,y,X,a):
 p = [ 0 for i in range(len(a)) ]
 plt.plot(x,y,'o')
 p[0], = plt.plot(X,P(a[0],X))
 for i in range(1,len(a)):
  p[i], = plt.plot(X,P(a[i],X))
  
 plt.legend(p, [ "deg(P)=" + str(len(a)-1) ] + [ "deg(P)=" + str(i) for i in range(len(a)-1) ])
 plt.text(x[0], y[0], "r = " + str( coeffCorr(x,y) ))
 plt.xlabel( "X" )
 plt.ylabel( "Y" )
 
 plt.show()

def P(a,x):
 return somme( [ a[ len(a)-i-1 ]*x**i for i in range(len(a)) ] )

def esp(x):
 return somme(x) / len(x)

def var(x):
 return esp( [ e**2 for e in x ] ) - esp(x)**2

def coeffCorr(x,y):
 return ( esp( [ x[i]*y[i] for i in range(n) ] ) - esp(x)*esp(y) ) / ( sqrt(var(x))*sqrt(var(y)) )

#nbre de couples
n = randint(4,19)
#degre polynome generateur
m = randint(2,4)

a = [ [ random()*randint(-4,5) for i in range(m) ] ]
x = [ random() ]
for i in range(1,n):
 x += [ x[-1] + random() ]
y = [ P(a[0],x[i]) + random()*randint(-100,99) for i in range(n) ]


for k in range(m+1):
 s = [ somme([ x[i]**j for i in range(n) ]) for j in range(1,k*2+1) ]
 t = [ somme([ y[i]*x[i]**j for i in range(n) ]) for j in range(k+1) ]

 M = [ [ 0.0 for j in range(k+1) ] for i in range(k+1) ]
 T = [ [ float(t[k-i]) ] for i in range(k+1) ]

 for j in range(k+1):
  for i in range(1+j,k+1):
   M[i][j] = s[2*k-j-i-1]
   M[j][i] = M[i][j]

 for j in range(k+1):
  if j == k:
   M[j][j] = n
  else:
   M[j][j] = s[2*(k-j)-1]
   
 a.append( linalg.solve( array(M), array(T) ) )

t = linspace(floor(x[0]),ceil(x[-1]),(ceil(x[-1])-floor(x[0])+1)*10)
graph(x,y,t,a)


Pour de plus ample informations, veuillez vous reporter à la page wikipédia associée : https://fr.wikipedia.org/wiki/R%C3%A9gression_polynomiale.

Pour les plus matheux des lecteurs, la démonstration pour retouver la matrice associé au sytème est très abordable (niveau bac+1).

Si question il existe, merci de me la formuler.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.