python—使用曲线拟合在不同大小的数据集上估计通用模型参数

vsdwdz23  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(305)

我正在研究一个曲线拟合问题,我打算在几个大小不等的数据集上全局估计共享模型参数。我从下面链接中的代码开始工作,其中线性回归y=a*x+b的公共a参数在三个不同的y向量上用公共x向量进行估计。如何使用scipy.optimize中的曲线拟合,在多个数据集中使用共享拟合参数?
我设法使代码样本适应更一般的情况,使用三个不同的x向量,每个x向量对应一个y数据向量。但是,当我想进一步扩展它,使其也适用于大小不等的数据集时,我遇到了以下错误:“valueerror:使用序列设置数组元素。”。
请在下面找到代码示例。非常感谢您的帮助!
干杯

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

x = [[0, 1, 2, 3],
[0.2, 1.2, 2.2, 3.2],
[0.3, 1.3, 2.3]]

y = [[-0.80216234,  1.41125365,  1.42565202,  2.42567754],
[ 1.34166743,  1.29731851,  2.98374731,  3.32110875],
[ 1.71398203,  3.29737756,  3.81456949]]

x = np.array(x)
y = np.array(y)

def f(x, a, b):
    return a * x + b

def g(x, a, b_1, b_2, b_3):
     return np.concatenate((f(x[0], a, b_1), f(x[1], a, b_2), f(x[2], a, b_3)))

(a, *b), _ = curve_fit(g, x, y.ravel())

for x_i, y_i, b_i in zip(x, y, b):
    plt.plot(x_i, f(x_i, a, b_i), label=f"{a:.1f}x{b_i:+.1f}")
    plt.plot(x_i, y_i, linestyle="", marker="x",  color=plt.gca().lines[-1].get_color())
plt.legend()
plt.show()

请参阅下面的工作示例代码,其中包含多个大小相等的x向量:

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

x = [[0, 1, 2, 3],
 [0.2, 1.2, 2.2, 3.2],
 [0.3, 1.3, 2.3, 3.3]]

y = [[-0.80216234,  1.41125365,  1.42565202,  2.42567754],
 [ 1.34166743,  1.29731851,  2.98374731,  3.32110875],
 [ 1.71398203,  3.29737756,  3.81456949, 4.25]]

x = np.array(x)
y = np.array(y)

def f(x, a, b):
    return a * x + b

def g(x, a, b_1, b_2, b_3):
    return np.concatenate((f(x[0], a, b_1), f(x[1], a, b_2),     f(x[2], a, b_3)))

(a, *b), _ = curve_fit(g, x, y.ravel())

for x_i, y_i, b_i in zip(x, y, b):
   plt.plot(x_i, f(x_i, a, b_i), label=f"{a:.1f}x{b_i:+.1f}")
   plt.plot(x_i, y_i, linestyle="", marker="x",     color=plt.gca().lines[-1].get_color())

plt.legend()
plt.show()
p4rjhz4m

p4rjhz4m1#

问题是你不能创建一个 numpy.array 从一份不完整的名单上。重铸 np.array 所有维度必须匹配,即不能有空列条目,因为这对numpy没有意义。
在本例中,您尚未为数组中的一列定义条目(即最后一行中有3个条目,而其他行有4个条目)。numpy根本不允许您这样做,因为它是一个数值包,依赖于矩形定义良好的数组来进行计算。

相关问题