Régression linéaire avec matplotlib / numpy


87

J'essaie de générer une régression linéaire sur un nuage de points que j'ai généré, mais mes données sont au format liste, et tous les exemples que je peux trouver d'utilisation polyfitnécessitent l'utilisation arange. arangen'accepte pas les listes. J'ai cherché haut et bas comment convertir une liste en tableau et rien ne semble clair. Est-ce que je manque quelque chose?

Ensuite, comment puis-je utiliser au mieux ma liste d'entiers comme entrées dans le polyfit?

voici l'exemple polyfit que je suis:

from pylab import * 

x = arange(data) 
y = arange(data) 

m,b = polyfit(x, y, 1) 

plot(x, y, 'yo', x, m*x+b, '--k') 
show() 

Réponses:


183

arange génère des listes (enfin, des tableaux numpy); tapez help(np.arange)pour les détails. Vous n'avez pas besoin de l'appeler sur les listes existantes.

>>> x = [1,2,3,4]
>>> y = [3,5,7,9] 
>>> 
>>> m,b = np.polyfit(x, y, 1)
>>> m
2.0000000000000009
>>> b
0.99999999999999833

Je devrais ajouter que j'ai tendance à utiliser poly1dici plutôt que d'écrire "m * x + b" et les équivalents d'ordre supérieur, donc ma version de votre code ressemblerait à ceci:

import numpy as np
import matplotlib.pyplot as plt

x = [1,2,3,4]
y = [3,5,7,10] # 10, not 9, so the fit isn't perfect

coef = np.polyfit(x,y,1)
poly1d_fn = np.poly1d(coef) 
# poly1d_fn is now a function which takes in x and returns an estimate for y

plt.plot(x,y, 'yo', x, poly1d_fn(x), '--k')
plt.xlim(0, 5)
plt.ylim(0, 12)

entrez la description de l'image ici


38

Ce code:

from scipy.stats import linregress

linregress(x,y) #x and y are arrays or lists.

donne une liste avec les éléments suivants:

pente: pente flottante
de la ligne de régression
intersection: intersection flottante
de la droite de régression
valeur r:
coefficient de corrélation float valeur
p: valeur p à
deux côtés flottante pour un test d'hypothèse dont l'hypothèse nulle est que la pente est nulle
stderr: float
Erreur standard de l'estimation

La source


4
import numpy as np
import matplotlib.pyplot as plt 
from scipy import stats

x = np.array([1.5,2,2.5,3,3.5,4,4.5,5,5.5,6])
y = np.array([10.35,12.3,13,14.0,16,17,18.2,20,20.7,22.5])
gradient, intercept, r_value, p_value, std_err = stats.linregress(x,y)
mn=np.min(x)
mx=np.max(x)
x1=np.linspace(mn,mx,500)
y1=gradient*x1+intercept
plt.plot(x,y,'ob')
plt.plot(x1,y1,'-r')
plt.show()

Utilisez ceci ..


Cela n'ajoute pas une nouvelle façon d'aborder le problème - cela a déjà été suggéré dans cette réponse populaire .
M. T

voulez-vous convertir la liste générée en un tableau?
Aleena Rehman

Je ne veux rien de précis, ce n'est pas ma question. Je dis simplement que répéter une réponse déjà établie n'est pas vraiment ce que SO recherche. Veuillez lire le lien, j'ai posté.
M. T

2
from pylab import * 

import numpy as np
x1 = arange(data) #for example this is a list
y1 = arange(data) #for example this is a list 
x=np.array(x) #this will convert a list in to an array
y=np.array(y)
m,b = polyfit(x, y, 1) 

plot(x, y, 'yo', x, m*x+b, '--k') 
show()

1
Je vois, vous avez écrit quelques commentaires, mais vous devriez envisager d'ajouter quelques phrases d'explication, cela augmente la valeur de votre réponse ;-)
MBT

1
Veuillez noter que si un extrait de code peut être une réponse utile en soi, il est préférable de laisser des commentaires aux futurs lecteurs sur les raisons pour lesquelles cela résout le problème. Merci!
Erty Seidohl

1
@ blue-phoenox eh bien je pensais que les gens sont géniaux ici mais je suppose que je vais vous expliquer la prochaine fois ..
Aleena Rehman

1

Une autre réponse rapide et sale est que vous pouvez simplement convertir votre liste en un tableau en utilisant:

import numpy as np
arr = np.asarray(listname)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.