使用matplotlib / numpy进行线性回归


87

我正在尝试在已生成的散点图上生成线性回归,但是我的数据是列表格式,并且可以找到所有使用polyfitrequire的示例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() 

Answers:


183

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值:浮子
对于假设检验,其零假设是斜率为零双面p值
标准错误:浮
估计的标准误

资源


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'5

我不想要任何特定的东西,这不是我的问题。我只是说重复一个已经确定的答案并不是真的,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 '18年

1
@ blue-phoenox好,我以为这里的人都是天才,但我想我下次再讲..
Aleena Rehman

1

另一个快速而肮脏的答案是,您可以使用以下方法将列表转换为数组:

import numpy as np
arr = np.asarray(listname)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.