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.