gpt4 book ai didi

python - 如何使用 scipy.optimize 中的 curve_fit 和跨多个数据集的共享拟合参数?

转载 作者:行者123 更新时间:2023-12-05 05:05:58 32 4
gpt4 key购买 nike

假设我有一个带有多个参数的拟合函数 f,例如 ab。现在,我想将多个数据集拟合到此函数中,并对所有数据集使用相同的 a(共享参数),而 b 可以单独用于每个拟合。

例子:

import numpy as np

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

# Datasets
x = np.arange(4)
y = np.array([x + a + np.random.normal(0, 0.5, len(x)) for a in range(3)])

所以我们有 4 个 x 值和 3 个数据集,每个数据集有 4 个 y 值。

最佳答案

执行此操作的一种方法是连接数据集并使用调整后的拟合函数。

在下面的示例中,这发生在带有 np.concatenate 的新拟合函数 g 中。每个数据集的单独拟合也已完成,因此我们可以将它们的图形与具有共享参数的串联拟合进行比较。

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


# Create example datasets

x = np.arange(4)
y = np.array([x + a + np.random.normal(0, 0.5, len(x)) for a in range(3)])
print("x =", x)
print("y =", y)


# Individual fits to each dataset

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

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

plt.legend()
plt.show()


# Fit to concatenated dataset with shared parameter

def g(x, a, b_1, b_2, b_3):
return np.concatenate((f(x, a, b_1), f(x, a, b_2), f(x, a, b_3)))

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

plt.legend()
plt.show()

输出:

x = [0 1 2 3]
y = [[0.40162683 0.65320576 1.92549698 2.9759299 ]
[1.15804251 1.69973973 3.24986941 3.25735249]
[1.97214167 2.60206217 3.93789235 6.04590999]]

个人适合 a 的三个不同值:

Figure 1

适合共享参数a:

Figure 2

关于python - 如何使用 scipy.optimize 中的 curve_fit 和跨多个数据集的共享拟合参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60231516/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com