Regressione lineare con matplotlib / numpy


89

Sto cercando di generare una regressione lineare su un grafico a dispersione che ho generato, tuttavia i miei dati sono in formato elenco e tutti gli esempi che posso trovare sull'utilizzo polyfitrichiedono l'utilizzo arange. arangenon accetta elenchi però. Ho cercato in alto e in basso su come convertire un elenco in un array e nulla sembra chiaro. Mi sto perdendo qualcosa?

In seguito, come posso utilizzare al meglio il mio elenco di numeri interi come input per polyfit?

ecco l'esempio di polyfit che sto seguendo:

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() 

Risposte:


187

arange genera elenchi (beh, array numpy); digitare help(np.arange)per i dettagli. Non è necessario richiamarlo su elenchi esistenti.

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

Dovrei aggiungere che tendo a usare poly1dqui piuttosto che scrivere "m * x + b" e gli equivalenti di ordine superiore, quindi la mia versione del tuo codice sarebbe simile a questa:

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)

inserisci qui la descrizione dell'immagine


38

Questo codice:

from scipy.stats import linregress

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

fornisce un elenco con quanto segue:

pendenza: float
pendenza della retta di regressione
intercetta: float
intercetta della retta di regressione
valore r: float
coefficiente di correlazione valore
p: float
bilaterale valore p per un test di ipotesi la cui ipotesi nulla è che la pendenza sia zero
stderr: float
Errore standard della stima

fonte


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()

Usa questo ..


Questo non aggiunge un nuovo modo per affrontare il problema: è già stato suggerito in questa risposta popolare .
Mr. T

vuoi convertire l'elenco generato in un array?
Aleena Rehman

Non voglio niente di specifico, questa non è la mia domanda. Sto solo dicendo che ripetere una risposta già stabilita non è proprio quello che SO sta cercando. Si prega di leggere il link, che ho pubblicato.
Mr. 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
Capisco, hai scritto alcuni commenti, ma dovresti considerare di aggiungere alcune frasi di spiegazione, questo aumenta il valore della tua risposta ;-)
MBT

1
Tieni presente che mentre uno snippet di codice può essere una risposta utile da solo, è preferibile lasciare qualche commento ai futuri lettori sul motivo per cui questo risolve il problema. Grazie!
Erty Seidohl

1
@ blue-phoenox beh, pensavo che le persone fossero geniali qui ma immagino che spiegherò la prossima volta ..
Aleena Rehman

1

Un'altra risposta rapida e sporca è che puoi semplicemente convertire il tuo elenco in un array usando:

import numpy as np
arr = np.asarray(listname)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.