Matplotlib / numpy ile doğrusal regresyon


89

Oluşturduğum bir dağılım grafiğinde doğrusal bir regresyon oluşturmaya çalışıyorum, ancak verilerim liste biçiminde ve kullanma ile ilgili bulabildiğim tüm örnekler kullanmayı polyfitgerektirir arange. arangeyine de listeleri kabul etmiyor. Bir listeyi bir diziye nasıl dönüştüreceğim konusunda çok araştırdım ve hiçbir şey net görünmüyor. Bir şey mi kaçırıyorum?

Bundan sonra, tamsayılar listemi polyfit? Girdisi olarak en iyi nasıl kullanabilirim ?

işte takip ettiğim polyfit örneği:

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

Yanıtlar:


187

arange listeler (iyi, uyuşuk diziler) üretir ; yazın help(np.arange)Ayrıntılar için. Mevcut listelerde aramanıza gerek yok.

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

poly1d"M * x + b" ve daha yüksek mertebeden eşdeğerlerini yazmak yerine burada kullanma eğiliminde olduğumu eklemeliyim , böylece kodunuzun sürümünün şuna benzer bir şeye benzeyecektir:

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)

görüntü açıklamasını buraya girin


38

Bu kod:

from scipy.stats import linregress

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

aşağıdakileri içeren bir liste verir:

eğim:
regresyon çizgisinin kayan eğimi
kesişim noktası: regresyon çizgisinin kayan noktalı
kesişim noktası
r değeri: kayan
korelasyon katsayısı
p-değeri:
sıfır hipotezi eğimin sıfır olduğu bir hipotez testi için iki taraflı p-değeri
float stderr: float
Tahminin standart hatası

Kaynak


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

Bunu kullan ..


Bu, sorunu çözmek için yeni bir yol eklemiyor - bu popüler cevapta zaten önerilmişti .
Bay T

Üretilen listeyi bir diziye dönüştürmek istiyor musunuz?
Aleena Rehman

Spesifik bir şey istemiyorum, bu benim sorum değil. Ben sadece, SO'nun aradığı şey, zaten belirlenmiş bir cevabı tekrar etmenin gerçekten olmadığını söylüyorum. Lütfen bağlantıyı okuyun, gönderdim.
Bay 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
Anlıyorum, bazı yorumlar yazmışsınız, ancak birkaç cümle açıklama eklemeyi düşünmelisiniz, bu cevabınızın değerini artırır ;-)
MBT

1
Bir kod parçacığı kendi başına yararlı bir yanıt olabilirken , gelecekteki okuyucular için bunun sorunu neden çözdüğüne dair bazı yorumlar bırakmanın tercih edildiğini lütfen unutmayın . Teşekkürler!
Erty Seidohl

1
@ blue-phoenox pekala burada insanların dahi olduğunu düşündüm ama sanırım bir dahaki sefere açıklayacağım ..
Aleena Rehman

1

Hızlı ve kirli bir başka cevap da, listenizi aşağıdakileri kullanarak bir diziye dönüştürebileceğinizdir:

import numpy as np
arr = np.asarray(listname)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.