【问题标题】:function parameters in matlab wander off after curve fittingmatlab中的函数参数在曲线拟合后漂移
【发布时间】:2013-08-20 01:51:47
【问题描述】:

首先是一点背景。我是一名心理学专业的学生,​​所以我的编码背景与你们不相上下:-)

我的问题如下,最重要的观察是使用 2 个不同程序的曲线拟合会为我的参数提供完全不同的结果,尽管我的图表保持不变。我们用来拟合纵向数据的主要程序是 kaleidagraph,这应该被视为有点“黄金标准”,我正在尝试修改的程序是 matlab。

我试图变得聪明并编写了一些代码(至少对我来说很多),该代码的目标如下: 1. 获取单个纵向数据文件 2. 使用 lsqcurvefit 在非参数模型上对该数据进行曲线拟合 3.获取数字和f'和f''为零的点

这一切都很好(哇哦:-))但是当我开始比较两个程序生成的函数参数时,存在巨大差异。 kaleidagraph 程序保持接近其原始起始值。 Matlab 徘徊,有时会变大 1000 倍。但图表在两种情况下或多或少保持相同,并且都很好地拟合数据。但是,如果我知道如何使 matlab 曲线拟合更“保守”并且更靠近它的原始起始值,那就太好了。

validFitPersons = true(nbValidPersons,1);
    for i=1:nbValidPersons
        personalData = data{validPersons(i),3};
        personalData = personalData(personalData(:,1)>=minAge,:);
        % Fit a specific model for all valid persons
        try
            opts = optimoptions(@lsqcurvefit, 'Algorithm', 'levenberg-marquardt'); 
            [personalParams,personalRes,personalResidual] = lsqcurvefit(heightModel,initialValues,personalData(:,1),personalData(:,2),[],[],opts);
        catch
            x=1;
        end

以上是我为将数据文件适合特定模型而编写的代码的一部分。 以下是我使用的非参数模型及其函数参数的示例。

elseif strcmpi(model,'jpa2')
    % y = a.*(1-1/(1+(b_1(t+e))^c_1+(b_2(t+e))^c_2+(b_3(t+e))^c_3))
    heightModel = @(params,ages) abs(params(1).*(1-1./(1+(params(2).* (ages+params(8) )).^params(5) +(params(3).* (ages+params(8) )).^params(6) +(params(4) .*(ages+params(8) )).^params(7) )));
    modelStrings = {'a','b1','b2','b3','c1','c2','c3','e'};

    % Define initial values
    if strcmpi('male',gender)
        initialValues = [176.76 0.339 0.1199 0.0764 0.42287 2.818 18.52 0.4363];
    else
        initialValues = [161.92 0.4173 0.1354 0.090 0.540 2.87 14.281 0.3701];
    end    

我尝试尽可能好地模仿 kaleidagraph 中的曲线拟合过程。在那里我发现他们使用了我选择的 levenberg-marquardt 算法。但是结果仍然不同,我没有更多关于如何改变这一点的线索。


一些额外的调整:

这段代码的想法如下:

我正在尝试比较不同的拟合模型(它们是为此目的而设计的)。所以我要做的是我有 5 个具有不同参数和不同起始值的模型(我的代码的第二部分),接下来我有通用曲线拟合文件。由于有不同的模型,如果我可以限制我的起始值可以偏离多远,那将会很有趣。

有人知道如何做到这一点吗?


有人愿意帮助心理学学生吗?

干杯

【问题讨论】:

  • 由于您已经发布了模型和起始参数,如果您提供以下内容实际上就足够了:(1) y(个人数据)不确定性的一些度量和 (2) t 的范围.
  • 您是否查看过输出拟合参数的协方差矩阵,也许这些参数是强相关的?
  • 范围超过 20 年 y 的不确定性由平方和确定(如果这就是您的意思)。这些数据是纵向的,给出了个人生日时的身高。
  • 您的意思是年龄 = 20 - xxx 岁?我绘制了您提供的方程式,超过 16 年,与
  • *t 是年龄,大部分在 20 岁左右停止(增长基本完成,测量停止)。因为这是 16 岁以后的数据,所以大部分时间不会有太大变化

标签: matlab curve-fitting levenberg-marquardt


【解决方案1】:

这是处理非线性模型时的常见问题。

如果我是你,我会尝试检查是否可以从模型中删除一些参数以简化它。

如果你真的想让你的解决方案离初始点不太远,你可以为每个变量使用上限和下限:

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)

x 中定义一组设计变量的下限和上限,以便解决方案始终在 lb ≤ x ≤ ub 的范围内。

干杯

【讨论】:

  • 参数删除不是一个选项(我希望它可以)
  • 关于使用 lb, ub 边界我已经考虑过了,但在这里我必须为我的所有参数提供 lb 和 ub,而不仅仅是一个。
  • 为每个参数提供一个上限和下限应该不是问题。您可以为允许变化的参数提供广泛的范围。如果您想快速编写它,您还可以提供与起点成比例的边界(例如 ub=startingPoint * 1.2 和 lb = startingPoint * 0.8。)
  • 有没有一种方法可以设置函数写入的边界(参数和初始值部分)?这是因为有不同的公式用于拟合具有不同起始值和不同参数的相同数据,并且它们都使用相同的 lsqcurvefit
【解决方案2】:

你说:

我正在尝试比较不同的拟合模型(它们是为 这个目的)。所以我要做的是我有 5 个不同的模型 参数和不同的起始值(我的代码的第二部分) 接下来我有一般曲线拟合文件。

您可能会比较拟合不同模型的统计数据,看看拟合误差的减少是否不太可能是偶然的。您可能希望依靠该比较来选择不仅适合您的数据而且最简单的模型(这通常被称为简约原则)。

正如@David 所提到的,问题实际上在于您展示的模型会导致相关参数并因此过度拟合。同样,当您比较不同的模型并发现有些模型(从统计上讲)尽管涉及的参数较少时,这应该可以解决。

编辑

为了说明模型选择的问题,这里是 (1) 使用模拟数据的试拟合结果 (2) 图形形式的参数相关矩阵:

请注意,接近1 的相关性绝对值表示强相关参数,这是非常不可取的。另请注意,数据的趋势在数据集的很长部分实际上是线性的,这意味着 2 个参数可能就足够了,因此使用 8 个参数来描述它似乎有点矫枉过正。

【讨论】:

  • 感谢您的精彩解释。该模型中的函数参数通常具有“生物学意义”,因此可以预期它们之间存在相关性。
  • 好的,但我所说的不受欢迎是指数学上的,因为高度相关意味着您无法得出明确的参数值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多