Hồi quy tuyến tính với matplotlib / numpy


87

Tôi đang cố gắng tạo hồi quy tuyến tính trên một biểu đồ phân tán mà tôi đã tạo, tuy nhiên dữ liệu của tôi ở định dạng danh sách và tất cả các ví dụ tôi có thể tìm thấy về cách sử dụng đều polyfityêu cầu sử dụng arange. arangekhông chấp nhận danh sách mặc dù. Tôi đã tìm kiếm cao và thấp về cách chuyển đổi một danh sách thành một mảng và dường như không có gì rõ ràng. Tui bỏ lỡ điều gì vậy?

Sau đây, làm cách nào tốt nhất để tôi có thể sử dụng danh sách các số nguyên của mình làm đầu vào cho polyfit?

đây là ví dụ về polyfit mà tôi đang theo dõ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() 

Hãy thử regplottừ seaborn: stackoverflow.com/a/42263217/911945
Anton Tarasenko

Câu trả lời:


183

arange tạo danh sách (tốt, mảng không có hạt); gõ help(np.arange)để biết chi tiết. Bạn không cần phải gọi nó trong danh sách hiện có.

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

Tôi nên nói thêm rằng tôi có xu hướng sử dụng poly1dở đây hơn là viết ra "m * x + b" và các từ tương đương bậc cao hơn, vì vậy phiên bản mã của tôi sẽ trông giống như sau:

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)

nhập mô tả hình ảnh ở đây


38

Mã này:

from scipy.stats import linregress

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

đưa ra một danh sách với những điều sau:

độ dốc: độ dốc float
của điểm
chặn đường hồi quy : điểm chặn float
của đường hồi quy
r-value:
hệ số tương quan float
p-value: giá trị p
hai phía đối với kiểm định giả thuyết có giả thuyết rỗng là độ dốc bằng 0
stderr: float
Sai số chuẩn của ước tính

Nguồn


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

Dùng cái này ..


Điều này không thêm một cách mới để giải quyết vấn đề - nó đã được đề xuất trong câu trả lời phổ biến này .
Anh T

bạn có muốn chuyển đổi danh sách đã tạo thành một mảng không?
Aleena Rehman

Tôi không muốn bất cứ điều gì cụ thể, đây không phải là câu hỏi của tôi. Tôi chỉ nói rằng lặp lại một câu trả lời đã được thiết lập không thực sự, những gì SO đang tìm kiếm. Vui lòng đọc liên kết, tôi đã đăng.
Anh 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
Tôi hiểu rồi, bạn đã viết một số ý kiến, nhưng bạn nên cân nhắc việc thêm một vài câu giải thích, điều này làm tăng giá trị của câu trả lời của bạn ;-)
MBT

1
Xin lưu ý rằng mặc dù đoạn mã tự nó có thể là một câu trả lời hữu ích, nhưng tốt hơn hết bạn nên để lại một số bình luận cho người đọc trong tương lai về lý do tại sao đoạn mã này giải quyết được vấn đề. Cảm ơn!
Erty Seidohl

1
@ blue-phoenox à, tôi đã nghĩ mọi người là thiên tài ở đây nhưng tôi đoán tôi sẽ giải thích vào lần sau ..
Aleena Rehman

1

Một câu trả lời nhanh chóng và dễ hiểu khác là bạn chỉ có thể chuyển đổi danh sách của mình thành một mảng bằng cách sử dụng:

import numpy as np
arr = np.asarray(listname)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.