如何拟合数据集,使它们共享一些(但不是全部)参数值
How to fit datasets so that they share some (but not all) parameter values
假设我想用指数函数拟合两个数组 x_data_one
和 y_data_one
。为此,我可能会使用以下代码(其中 x_data_one
和 y_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_two
和 b_one == b_two
,但不一定是 c_one == c_two
?我不想将 a_one
或 b_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 :)
假设我想用指数函数拟合两个数组 x_data_one
和 y_data_one
。为此,我可能会使用以下代码(其中 x_data_one
和 y_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_two
和 b_one == b_two
,但不一定是 c_one == c_two
?我不想将 a_one
或 b_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 :)