Régression linéaire - python

Discutez d'informatique ici !
cocoflmt
Membre Naturel
Messages: 15
Enregistré le: 11 Oct 2020, 15:03

Régression linéaire - python

par cocoflmt » 23 Mar 2021, 20:34

Bonjour,

J'ai un devoir à réaliser en sciences de l'ingénieur et pour cela, j'ai besoin d'utiliser python, voici mon sujet et problème:
J'ai réalisé des mesures d'angles et de déplacements (4000 valeurs chacune...) que j'ai rangé des listes. Par la suite, j'avais besoin d'avoir un graphique de rotation et de vitesse : j'ai donc utilisé la méthode d'Euler afin de créer une fonction pour dériver les valeurs de mes listes et tracer le graphique que j'attendais.
J'ai ensuite réalisé une regression linéaire à l'aide SciPy (que nous n'avons pas réellement étudié en cours) et récupéré le coefficient directeur de la droite qui m'intéressait.
Mon but final était donc d'avoir la valeur du coefficient directeur de mon graphique de rotation en fonction de la vitesse.

Pour approfondir mon travail, mon professeur m'a suggéré de réaliser 2 nouvelles courbes explicitant le coefficient directeur de la droite passant par le maximum et une autre par le minimum de ma fonction.
Or j'ai tenté plusieurs choses, en vain. La courbe n'affiche qu'un point ou pas de point, et par conséquent, ma régression linéaire ne mène a rien... J'ai ajouté donc à une liste les valeurs maximales et le premier couple de points afin d'avoir 2 points.
Je ne sais pas si j'ai correctement expliqué mon problème mais voici donc le programme brut (qui n'est surement pas optimal mais je débute en python):

PROGRAMME:
# Modélisation du graphique
import scipy.stats as sc
droite=sc.linregress(D,A)
coefficient=droite.slope
print("coefficient directeur :",coefficient)

def maximum(liste):
maxi = liste[0]
for i in liste:
if i >= maxi:
maxi = i
return (maxi)

def minimum(liste):
mini = liste[0]
for i in liste:
if i <= mini:
mini = i
return (mini)

print("max angle:",maximum(angle)), print("max déplacement:",maximum(deplacement))
print("min angle:",minimum(angle)), print("min déplacement:",minimum(deplacement))

maxangle=[maximum(angle),-39.9731]
maxdeplacement=[maximum(deplacement),33.6499]
minangle=[minimum(angle),-39.715]
mindeplacement=[minimum(deplacement),33.6109]

B,C=derivee(maxdeplacement,maxangle)
X,Y=derivee(mindeplacement,minangle)

#plt(Y,X,'o')
#droite2=sc.linregress(C,B)
#coefficient2=droite2.slope
#print("coefficient directeur :",coefficient2)


Merci d'avance



Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: Régression linéaire - python

par fatal_error » 23 Mar 2021, 21:02

hi,

ton code est pas lisible
tu peux préserver la mise en page à l'aise des balises [code][ /code]

par ailleurs, pas besoin de 4000 points pour tester une regression linéaire
tu peux juste creer 5 points toi même pour debugguer

ca aura par ailleurs le bon gout (si jamais tu trouves pas) de rendre ton code reproduisible
la vie est une fête :)

cocoflmt
Membre Naturel
Messages: 15
Enregistré le: 11 Oct 2020, 15:03

Re: Régression linéaire - python

par cocoflmt » 23 Mar 2021, 22:51

fatal_error a écrit:hi,

ton code est pas lisible
tu peux préserver la mise en page à l'aise des balises [code][ /code]

par ailleurs, pas besoin de 4000 points pour tester une regression linéaire
tu peux juste creer 5 points toi même pour debugguer

ca aura par ailleurs le bon gout (si jamais tu trouves pas) de rendre ton code reproduisible



Bonsoir,
Merci pour votre réponse,
J'ai pris 4000 points car ce sont des données expérimentales provenant d'un TP. Étant donné que je cherche à avoir la meilleure précision possible, j'ai jugé nécessaire de laisser un bon nombre de points.
J'ai rajouté des points afin d'en avoir à minima 5 et, en effet, la régression linéaire est faisable.
Maintenant j'ai une question par rapport à mon problème en lui-même: quand je choisis 5 points au hasard parmi ceux de ma liste, mon choix influe directement sur la valeur de mon coefficient directeur. Comment puis-je palier à cela tout en étant certaine que ma droite passe par le point maximal ou minimal?

Merci

cocoflmt
Membre Naturel
Messages: 15
Enregistré le: 11 Oct 2020, 15:03

Re: Régression linéaire - python

par cocoflmt » 23 Mar 2021, 22:53

Code: Tout sélectionner
# Modélisation du graphique
import scipy.stats as sc
droite=sc.linregress(D,A)
coefficient=droite.slope
print("coefficient directeur :",coefficient)

def maximum(liste):
    maxi = liste[0]
    for i in liste:
        if i >= maxi:
            maxi = i
    return (maxi)

def minimum(liste):
    mini = liste[0]
    for i in liste:
        if i <= mini:
            mini = i
    return (mini)

print("max angle:",maximum(angle)), print("max déplacement:",maximum(deplacement))
print("min angle:",minimum(angle)), print("min déplacement:",minimum(deplacement))

maxangle=[maximum(angle),-39.9731, angle[2345],angle[456], angle[800]]
maxdeplacement=[maximum(deplacement),33.6499, deplacement[2345], deplacement[456],deplacement[800]]

minangle=[minimum(angle),-39.715,angle[1234], angle[3000], angle[567]]
mindeplacement=[minimum(deplacement),33.6109, deplacement[1234], deplacement[3000], deplacement[567]]

B,C=derivee(maxdeplacement,maxangle)
X,Y=derivee(mindeplacement,minangle)

plt(Y,X,'o')
droite2=sc.linregress(Y,X)
coefficient2=droite2.slope
print("coefficient directeur minimal :",coefficient2)

plt(C,B,'o')
droite3=sc.linregress(C,B)
coefficient3=droite3.slope
print("coefficient directeur maximal:",coefficient3)

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: Régression linéaire - python

par fatal_error » 24 Mar 2021, 21:28

je pense que tu peux regarder plus précisément ce qu'est une régression linéaire.
pour forcer ta droite de coefficients (a,b) à passer par le point (x_m, y_m) tu as de faite la contrainte
y_m = ax_m + b idem b = y_m-ax_m

il reste juste qu'à reporter dans le probleme d'optimisation pour déduire a:
min_a somme_i(y_i - (ax_i + y_m-ax_m)^2
tu peux probablement résoudre "mano"

mais sinon, j'imagine que en bidouillant les x/y d'une translation on peut se retrouver avec une forme type somme_i (y'_i -(ax'_i + b))^2 et du coup on peut passer linregress(x', y') pour trouver a
la vie est une fête :)

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 9 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite