Regresja liniowa z matplotlib / numpy


89

Próbuję wygenerować regresję liniową na wygenerowanym przeze mnie wykresie punktowym, jednak moje dane są w formacie listy, a wszystkie przykłady użycia, które mogę znaleźć, polyfitwymagają użycia arange. arangenie akceptuje jednak list. Szukałem wysoko i nisko, jak przekonwertować listę na tablicę i nic nie wydaje się jasne. Czy coś mi brakuje?

Następnie, jak najlepiej mogę użyć mojej listy liczb całkowitych jako danych wejściowych do polyfit?

oto przykład polyfit, który śledzę:

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

Odpowiedzi:


187

arange generuje listy (no cóż, tablice numpy); wpisz help(np.arange)szczegóły. Nie musisz go wywoływać na istniejących listach.

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

Powinienem dodać, że raczej używam poly1dtutaj zamiast pisać "m * x + b" i odpowiedniki wyższego rzędu, więc moja wersja twojego kodu wyglądałaby mniej więcej tak:

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)

wprowadź opis obrazu tutaj


38

Ten kod:

from scipy.stats import linregress

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

podaje listę zawierającą:

slope: float
nachylenie linii regresji
przecięcie: float
przecięcie linii regresji
wartość r:
współczynnik korelacji zmiennoprzecinkowej wartość
p: zmiennoprzecinkowa
dwustronna wartość p dla testu hipotezy, którego hipotezą zerową jest zerowe nachylenie
stderr: float
Błąd standardowy oszacowania

Źródło


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

Użyj tego ..


Nie dodaje to nowego sposobu rozwiązania problemu - zostało to już zasugerowane w tej popularnej odpowiedzi .
Pan T

chcesz przekonwertować wygenerowaną listę na tablicę?
Aleena Rehman

Nie chcę nic konkretnego, to nie jest moje pytanie. Mówię tylko, że powtarzanie już ustalonej odpowiedzi nie jest tym, czego szuka SO. Przeczytaj link, który zamieściłem.
Pan 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
Widzę, napisałeś kilka komentarzy, ale powinieneś rozważyć dodanie kilku zdań wyjaśnienia, to zwiększa wartość Twojej odpowiedzi ;-)
MBT

1
Należy pamiętać, że chociaż fragment kodu może być użyteczną odpowiedzią sam w sobie, lepiej zostawić komentarz dla przyszłych czytelników, wyjaśniający, dlaczego to rozwiązuje problem. Dzięki!
Erty Seidohl

1
@ blue-phoenox cóż, myślałem, że ludzie są tu geniuszami, ale myślę, że wyjaśnię to następnym razem ..
Aleena Rehman

1

Inną szybką i nieprzyjemną odpowiedzią jest to, że możesz po prostu przekonwertować swoją listę na tablicę za pomocą:

import numpy as np
arr = np.asarray(listname)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.