Lineare Regression mit Matplotlib / Numpy


87

Ich versuche, eine lineare Regression für ein von mir generiertes Streudiagramm zu generieren. Meine Daten sind jedoch im Listenformat, und alle Beispiele, die ich für polyfitdie Verwendung finden kann, müssen verwendet werden arange. arangeakzeptiert jedoch keine Listen. Ich habe hoch und niedrig gesucht, wie man eine Liste in ein Array konvertiert, und nichts scheint klar zu sein. Vermisse ich etwas

Wie kann ich meine Liste der Ganzzahlen am besten als Eingabe für die verwenden polyfit?

Hier ist das Polyfit-Beispiel, dem ich folge:

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

Versuchen Sie regplotvon seaborn: stackoverflow.com/a/42263217/911945
Anton Tarasenko

Antworten:


181

arange generiert Listen (na ja, numpy Arrays); Typ help(np.arange)für die Details. Sie müssen es nicht in vorhandenen Listen aufrufen.

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

Ich sollte hinzufügen, dass ich poly1dhier eher "m * x + b" und die Äquivalente höherer Ordnung schreibe, damit meine Version Ihres Codes ungefähr so ​​aussieht:

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)

Geben Sie hier die Bildbeschreibung ein


37

Dieser Code:

from scipy.stats import linregress

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

gibt eine Liste mit folgendem aus:

Steigung: Float
Steigung des Regressionslinienabschnitts
: Floatabschnitt
der Regressionslinie
r-Wert: Float-
Korrelationskoeffizient
p-Wert: Float
zweiseitiger p-Wert für einen Hypothesentest, dessen Nullhypothese lautet, dass die Steigung Null ist
stderr: float
Standardfehler der Schätzung

Quelle


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

Benutze das ..


Dies ist kein neuer Weg, um das Problem anzugehen - es wurde bereits in dieser populären Antwort vorgeschlagen .
Herr T

Möchten Sie die generierte Liste in ein Array konvertieren?
Aleena Rehman

Ich möchte nichts Bestimmtes, das ist nicht meine Frage. Ich sage nur, dass das Wiederholen einer bereits etablierten Antwort nicht wirklich das ist, wonach SO sucht. Bitte lesen Sie den Link, den ich gepostet habe.
Herr 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
Ich verstehe, Sie haben einige Kommentare geschrieben, aber Sie sollten ein paar Erklärungssätze hinzufügen, dies erhöht den Wert Ihrer Antwort ;-)
MBT

1
Bitte beachten Sie, dass ein Code-Snippet zwar selbst eine nützliche Antwort sein kann, es jedoch vorzuziehen ist, zukünftigen Lesern einen Kommentar zu hinterlassen, warum dies das Problem löst. Vielen Dank!
Erty Seidohl

1
@ Blue-Phoenixox Nun, ich dachte, die Leute sind hier genial, aber ich denke, ich werde es beim nächsten Mal erklären.
Aleena Rehman

1

Eine andere schnelle und schmutzige Antwort ist, dass Sie Ihre Liste einfach in ein Array konvertieren können, indem Sie:

import numpy as np
arr = np.asarray(listname)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.