Python线性回归误差

时间:2016-06-15 10:35:40

标签: python csv regression data-mining linear

我有两个具有以下值的数组:

>>> x = [24.0, 13.0, 12.0, 22.0, 21.0, 10.0, 9.0, 12.0, 7.0, 14.0, 18.0,
...      1.0, 18.0, 15.0, 13.0, 13.0, 12.0, 19.0, 13.0]

>>> y = [10.0, 9.0, 22.0, 7.0, 4.0, 7.0, 56.0, 5.0, 24.0, 25.0, 11.0, 2.0,
...      9.0, 1.0, 9.0, 12.0, 9.0, 4.0, 2.0]

我使用scipy库来计算r平方:

>>> from scipy.interpolate import polyfit
>>> p1 = polyfit(x, y, 1)

当我运行以下代码时:

>>> yfit = p1[0] * x + p1[1]
>>> yfit
array([], dtype=float64)

yfit数组为空。我不明白为什么。

1 个答案:

答案 0 :(得分:2)

问题是您使用空list执行scalar addition

您有一个空list的原因是因为您尝试使用python列表而不是numpy.array执行标量乘法。标量将转换为整数0,并创建零长度list

我们将在下面进行探讨,但为了解决这个问题,您只需要在numpy数组中而不是在列表中使用数据。最初创建它,或将列表转换为数组:

>>> x = numpy.array([24.0, 13.0, 12.0, 22.0, 21.0, 10.0, 9.0, 12.0, 7.0, 14.0,
...                  18.0, 1.0, 18.0, 15.0, 13.0, 13.0, 12.0, 19.0, 13.0]

对正在发生的事情的解释如下:

让我们解压缩表达式yfit = p1[0] * x + p1[1]

组成部分是:

>>> p1[0]
-0.58791208791208893

p1[0]不是浮点数,但它是numpy数据类型:

>>> type(p1[0])
<class 'numpy.float64'>

x如上所述。

>>> p1[1]
20.230769230769241

p1[0]类似,p1[1]的类型也是numpy.float64

>>> type(p1[0])
<class 'numpy.float64'>

将列表乘以非整数将数字插值为整数,p1[0] -0.58791208791208893变为0

>>> p1[0] * x
[]

作为

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

最后,您要将空列表添加到p[1],这是一个numpy.float64

这不会尝试将值附加到空列表。它执行scalar addition,即它将20.230769230769241添加到列表中的每个条目。

但是,由于列表为空,因此除了返回类型为numpy的空array numpy.float64之外没有任何效果:

>>> [] + p1[1]
array([], dtype=float64)

具有效果的标量添加的示例:

>>> [10, 20, 30] + p1[1]
array([ 30.23076923,  40.23076923,  50.23076923])
相关问题