如何拟合数据集,使它们共享一些(但不是全部)参数值

How to fit datasets so that they share some (but not all) parameter values

假设我想用指数函数拟合两个数组 x_data_oney_data_one。为此,我可能会使用以下代码(其中 x_data_oney_data_one 被赋予虚拟定义):

import numpy as np
from scipy.optimize import curve_fit

def power_law(x, a, b, c):
    return a * (x + c) ** b

x_data_one = np.random.rand(10)
y_data_one = np.random.rand(10)

(a_one, b_one, c_one), _ = curve_fit(power_law, x_data_one, y_data_one)

现在假设我想拟合第二个数据集:

x_data_two = np.random.rand(10)
y_data_two = np.random.rand(10)

(a_two, b_two, c_two), _ = curve_fit(power_law, x_data_two, y_data_two)

我如何执行这两个拟合,使它们被限制为 a_one == a_twob_one == b_two,但不一定是 c_one == c_two?我不想将 a_oneb_one 限制为特定值;我想找到最适合这两个数据集的值。

您可以简单地为第二个数据集覆盖您的函数:

def power_law2(x, c):
    return a_one * (x + c) ** b_one

x_data_two = np.random.rand(10)
y_data_two = np.random.rand(10)

c_two = curve_fit(power_law2, x_data_two, y_data_two)[0][0]

或者您可以使用它(它为所有数据找到最优的 a、b,为 data_one 找到最优的 c1,为 data_two 找到最优的 c2):

def power_law(x, a, b, c1, c2):
    l = len(x_data_one)
    return a * np.hstack([x[:l] + c1, x[l:] + c2]) ** b

x_data_one_two = np.hstack([x_data_one,x_data_two])
y_data_one_two = np.hstack([y_data_one,y_data_two])

(a_one, b_one, c_one, c_two), _ = curve_fit(power_law, x_data_one_two, y_data_one_two)

在我看来,第二个代码更好,更像 pythonic :)