Regresi linier dengan matplotlib / numpy


89

Saya mencoba membuat regresi linier pada plot pencar yang telah saya buat, namun data saya dalam format daftar, dan semua contoh yang dapat saya temukan tentang penggunaan polyfitmemerlukan penggunaan arange. arangetidak menerima daftar. Saya telah mencari tinggi dan rendah tentang cara mengonversi daftar ke array dan tidak ada yang tampak jelas. Apakah saya melewatkan sesuatu?

Selanjutnya, bagaimana cara terbaik menggunakan daftar bilangan bulat saya sebagai input ke polyfit?

berikut adalah contoh polyfit yang saya ikuti:

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

Jawaban:


187

arange menghasilkan daftar (baik, array numpy); ketik help(np.arange)untuk detailnya. Anda tidak perlu menyebutnya di daftar yang ada.

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

Saya harus menambahkan bahwa saya cenderung menggunakan di poly1dsini daripada menulis "m * x + b" dan ekuivalen tingkat tinggi, jadi versi kode saya akan terlihat seperti ini:

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)

masukkan deskripsi gambar di sini


38

Kode ini:

from scipy.stats import linregress

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

memberikan daftar sebagai berikut:

kemiringan: kemiringan float
dari garis regresi
memotong: titik potong mengambang
dari garis regresi
nilai-r:
koefisien korelasi float
nilai-p: nilai-p
dua sisi float untuk uji hipotesis yang hipotesis nolnya adalah bahwa kemiringannya nol
stderr: float
Kesalahan standar dari perkiraan

Sumber


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

Gunakan ini ..


Ini tidak menambahkan cara baru untuk mengatasi masalah - ini telah disarankan dalam jawaban populer ini .
Tn. T

apakah Anda ingin mengubah daftar yang dihasilkan menjadi array?
Aleena Rehman

Saya tidak ingin sesuatu yang spesifik, ini bukan pertanyaan saya. Saya hanya mengatakan bahwa mengulangi jawaban yang sudah mapan tidak benar-benar, apa yang dicari SO. Silakan baca tautannya, saya memposting.
Tn. 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
Saya mengerti, Anda telah menulis beberapa komentar, tetapi Anda harus mempertimbangkan untuk menambahkan beberapa kalimat penjelasan, ini meningkatkan nilai jawaban Anda ;-)
MBT

1
Harap dicatat bahwa meskipun potongan kode dapat menjadi jawaban yang berguna, lebih baik meninggalkan beberapa komentar untuk pembaca selanjutnya tentang mengapa ini menyelesaikan masalah. Terima kasih!
Erty Seidohl

1
@ blue-phoenox yah saya pikir orang-orang jenius di sini tapi saya kira saya akan menjelaskan lain kali ..
Aleena Rehman

1

Jawaban cepat dan kotor lainnya adalah Anda bisa mengonversi daftar Anda menjadi array menggunakan:

import numpy as np
arr = np.asarray(listname)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.