【问题标题】:Scipy curve_fit multiple series of data, needing a unique set of fitting parameters for several curvesscipy curve_fit 多系列数据,需要多条曲线的一组独特的拟合参数
【发布时间】:2021-12-30 08:39:17
【问题描述】:

我会尽量解释清楚。我想拟合一个非线性函数,以最小化与其他 2 条曲线的距离。

This picture explains this better

我想通过将橙色曲线乘以一个高度非线性的函数来修改橙色曲线(比如说“损坏”它)。如您所见,拟合曲线是绿色的,我现在没有问题。

最小化函数的形状如下:

def func_to_minimize(input_X, c1, c2, c3):
   xdata, orange_points_in_y = input_X
   damage = non_linear_function(xdata, c1, c2, c3)
   return np.multiply(damage, orange_points_in_y)

因此,以这种方式应用curve_fit,我得到了正确的c1、c2和c3参数来获得两条红色曲线之间的绿色曲线:

(c1,c2,c3), pcov = curve_fit(func_to_minimize, (xdata, orange_points_in_y), ydata)
green_y_points = np.multiply(non_linear_function(xdata, c1, c2, c3), orange_points_in_y)

由于我有多个数据集(2 条 x 值相同但 y 值不同的曲线),我将数据堆叠成一维数组:

xdata = np.concatenate((xdata,xdata))
ydata = np.concatenate((ydata_1,ydata_2))
orange_points_in_y = np.concatenate((orange_points_in_y, orange_points_in_y))

出现问题是因为我有不止 1 条这样的曲线(超过 1 个“区域”),但它们都需要同时配备一组独特的 c1、c2、c3 参数。使用新图像您会更好地理解它:

Problematic fit

在这张图片中,您可以看到石灰曲线,它是通过获取 2 组参数(每个区域一组)获得的。但是当我尝试同时拟合所有内容时,我得到了深绿色曲线,这显然是不正确的。为了提供curve_fit,我像以前一样同时连接所有数据,确保所有点彼此对应。

如果有人知道如何获得这组独特的参数,即使使用其他算法,我也将不胜感激。谢谢你的时间:)

【问题讨论】:

    标签: python scipy curve-fitting nonlinear-optimization


    【解决方案1】:

    您需要垂直堆叠它们而不是连接ydata_1ydata_2(您可以使用np.vstack)。循环遍历这个垂直堆叠数组的行,得到ydata_1ydata_2,在循环内执行curve_fit,分别为每个ydata_i获取c1, c2, c3参数的值。

    【讨论】:

    • 但是我不需要分别拟合 ydata_1ydata_2,我需要最小化到 ydata_1ydata_2 曲线的距离,就像我在第二张图片中所做的那样石灰曲线或在第一张图片中。但是c1, c2 and c3 是一组独特的参数,可以最小化所有“区域”中的距离(在第二张图像中,红色曲线是第一个区域,蓝色曲线是第二个区域)。我知道我不会完全合身,但我希望我能做得更好……
    猜你喜欢
    • 2014-12-02
    • 2017-10-08
    • 2016-11-29
    • 1970-01-01
    • 2020-05-05
    • 2017-04-08
    • 2020-06-12
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多