将斜率乘以X列表时键入Error

时间:2019-04-03 18:18:12

标签: python python-2.7 numpy linear-regression

以下是我遇到的问题:

线性回归-给出16个价格对(作为因变量)和 相应的需求(作为自变量),使用线性回归工具估算最佳拟合 直线。

Price Demand
127 3420
134 3400
136 3250
139 3410
140 3190
141 3250
148 2860
149 2830 
151 3160
154 2820
155 2780
157 2900
159 2810
167 2580
168 2520
171 2430

这是我的代码:

from pylab import *
from numpy import *
from scipy.stats import *


x = [3420, 3400, 3250, 3410, 3190, 3250, 2860, 2830, 3160, 2820, 2780, 2900, 2810, 2580, 2520, 2430]
    np.asarray(x,dtype= np.float64)

y = [127, 134, 136 ,139, 140, 141, 148, 149, 151, 154, 155, 157, 159, 167, 168, 171]
np.asarray(y, dtype= np.float64)

slope,intercept,r_value,p_value,slope_std_error = stats.linregress(x,y)

y_modeled = x*slope+intercept

plot(x,y,'ob',markersize=2)
plot(x,y_modeled,'-r',linewidth=1)
show() 

这是我得到的错误:

Traceback (most recent call last):

  File "<ipython-input-48-0a0274c24b19>", line 13, in <module>
    y_modeled = x*slope+intercept

TypeError: can't multiply sequence by non-int of type 'numpy.float64'

2 个答案:

答案 0 :(得分:1)

您没有在此处将Python列表转换为numpy数组:

x = [3420, 3400, 3250, 3410, 3190, 3250, 2860, 2830, 3160, 2820, 2780, 2900, 2810, 2580, 2520, 2430]
np.asarray(x,dtype= np.float64)

np.asarray返回一个numpy数组,但不修改原始数组。您可以改为:

x = [3420, 3400, 3250, 3410, 3190, 3250, 2860, 2830, 3160, 2820, 2780, 2900, 2810, 2580, 2520, 2430]
x = np.asarray(x, dtype=np.float64)

numpy数组乘法的工作方式与Python列表乘法的工作方式有很大不同。看到这里:

>>> 3 * np.array([1, 2, 3])
array([3, 6, 9])

>>> 3 * [1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3]

在您的情况下,您尝试执行后者(列表乘法),但是您将其乘以浮点数,这是行不通的,这就是错误的意思。

答案 1 :(得分:1)

首先,[i * x中的i的斜率+截距]是列表推导,您将在列表“ x”中的每个数字与斜率相乘并在其上加上截距。 然后,将列表“ x”的新值传递给np.asarray(),以将列表转换为numpy数组。

Y_modeled=np.asarray([i*slope+intercept for i in x], dtype=np.float64)