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])
我有两个具有以下值的数组:
>>> 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])