Python 线性回归误差

Python Linear Regression Error

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

>>> 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 数组为空。我不明白为什么。

问题是您正在用空 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

但是,由于列表是空的,所以没有任何效果,除了它 returns 一个空的 numpy array 类型 numpy.float64:

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

标量加法产生影响的示例:

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