การถดถอยเชิงเส้นด้วย matplotlib / numpy


89

ฉันพยายามที่จะสร้างการถดถอยเชิงเส้นในพล็อตที่กระจายผมได้สร้าง แต่ข้อมูลของฉันอยู่ในรูปแบบรายการและตัวอย่างทั้งหมดที่ฉันสามารถหาของใช้จำเป็นต้องใช้polyfit ไม่ยอมรับรายการแม้ว่า ฉันได้ค้นหาสูงและต่ำเกี่ยวกับวิธีการแปลงรายการเป็นอาร์เรย์และดูเหมือนไม่มีอะไรชัดเจน ฉันพลาดอะไรไปรึเปล่า?arangearange

ต่อไปนี้ฉันจะใช้รายการจำนวนเต็มเป็นข้อมูลเข้าได้ดีที่สุดpolyfitอย่างไร

นี่คือตัวอย่าง polyfit ที่ฉันกำลังติดตาม:

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

ลองregplotจากseaborn: stackoverflow.com/a/42263217/911945
Anton Tarasenko

คำตอบ:


187

arange สร้างรายการ (ดีอาร์เรย์ numpy); พิมพ์help(np.arange)สำหรับรายละเอียด คุณไม่จำเป็นต้องเรียกมันในรายการที่มีอยู่

>>> 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" และเทียบเท่าลำดับที่สูงกว่าดังนั้นโค้ดของคุณเวอร์ชันของฉันจะมีลักษณะดังนี้

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)

ใส่คำอธิบายภาพที่นี่


38

รหัสนี้:

from scipy.stats import linregress

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

ให้รายชื่อดังต่อไปนี้:

ความชัน: ความชันลอย
ของเส้น
ตัดการถดถอย: การสกัดกั้นลอย
ของเส้นถดถอยค่า
r:
สัมประสิทธิ์สหสัมพันธ์ลอยค่า
p-value: ค่าp
สองด้านลอยสำหรับการทดสอบสมมติฐานซึ่งมีสมมติฐานว่างคือความชันเป็นศูนย์
stderr: float
ข้อผิดพลาดมาตรฐานของการประมาณการ

ที่มา


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

ใช้สิ่งนี้ ..


นี่ไม่ได้เพิ่มวิธีใหม่ในการแก้ไขปัญหา แต่ได้รับการแนะนำในคำตอบยอดนิยมนี้
นาย T

คุณต้องการแปลงรายการที่สร้างเป็นอาร์เรย์หรือไม่?
Aleena Rehman

ฉันไม่ต้องการอะไรที่เฉพาะเจาะจงนี่ไม่ใช่คำถามของฉัน ฉันแค่บอกว่าการทำซ้ำคำตอบที่ตั้งไว้แล้วนั้นไม่ใช่สิ่งที่ SO กำลังมองหา โปรดอ่านลิงค์ที่ฉันโพสต์
นาย 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
ฉันเห็นว่าคุณเขียนความคิดเห็นไว้บ้างแล้ว แต่คุณควรพิจารณาเพิ่มคำอธิบายสองสามประโยคซึ่งจะช่วยเพิ่มมูลค่าให้กับคำตอบของคุณ ;-)
MBT

1
โปรดทราบว่าในขณะที่ข้อมูลโค้ดสามารถเป็นคำตอบที่เป็นประโยชน์เกี่ยวกับของตัวเองก็ยังดีกว่าที่จะปล่อยให้ความเห็นบางอย่างสำหรับผู้อ่านในอนาคตเกี่ยวกับสาเหตุที่แก้ปัญหานี้ ขอบคุณ!
Erty Seidohl

1
@ blue-phoenox ดีฉันคิดว่าคนที่นี่เป็นอัจฉริยะ แต่ฉันเดาว่าฉันจะอธิบายในครั้งต่อไป ..
Aleena Rehman

1

คำตอบที่รวดเร็วและสกปรกอีกประการหนึ่งคือคุณสามารถแปลงรายการของคุณเป็นอาร์เรย์โดยใช้:

import numpy as np
arr = np.asarray(listname)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.