【发布时间】:2018-11-26 08:34:59
【问题描述】:
我有一组由多个对象的(二维)观察组成的数据。观察可以用一个通用函数加上每个对象唯一的偏移量来描述。我想使用curve_fit同时恢复每个对象的通用函数和偏移量(带有相关错误)。我事先不知道数据集将由多少个对象组成,只知道每个对象可能有多个观察值。
因此,包含 7 个观察值的广义数据集可能如下所示:
[[x[0], y1[0], y2[0], lab='A'],
[x[1], y1[1], y2[1], lab='B'],
[x[2], y1[2], y2[2], lab='A'],
[x[3], y1[3], y2[3], lab='A'],
[x[4], y1[4], y2[4], lab='B'],
[x[5], y1[5], y2[5], lab='C'],
[x[6], y1[6], y2[6], lab='A']]
我可以通过将通用函数的参数(例如 g = [g0, g1, g2])和对象偏移量 offsets = nx [o1, o2] 传递给 fit_func 然后使用对象标签来决定来完成任务这n个偏移量中的哪一个需要加到通用函数中,除了我不知道如何传递标签。
def fit_func(x, g, offsets, lab):
y1 = g[0] * cos(2*(x - g[1])) + offsets['lab',0] + g[2]
y2 = g[0] * sin(2*(x - g[1])) + offsets['lab',1] + g[2]
return [y1, y2]
问题是 lab 不是一个适合的浮点数,所以我不知道如何通过它。通过阅读其他一些线程,我相信我需要一个包装函数,但我无法弄清楚它应该采用什么形式,以及如何以我可以指定 sigma 和 p0 的方式调用它。
谁能指出我正确的方向?
编辑:我设法生成了一个我认为可行的函数。它使用全局参数调用来选择函数调用中的选项。因此,例如,我交错了 y1 和 y2 数组,并让函数在每秒运行一次时调用第二个方程,并使用全局 getEven() 和 setEven(bool) 调用。然而 curve_fit 真的不喜欢那样。拟合值是荒谬的。
目前我正在分别拟合 y1 的方程和 y2 的方程并取 rms 来确定 g0 和 g1(这也给了我 offsets['A',0] 和 offsets['A',1]分别。我可以对集合中的每个不同对象多次执行此操作,但我不能以这种方式拟合 g2 参数,因为在对 y1 或 y2 函数的任何给定调用中,它都会退化并具有相应的偏移量。
【问题讨论】:
标签: python curve-fitting