首页 文章

matlab中的函数参数在曲线拟合后徘徊

提问于
浏览
0

先是一点背景 . 我是一名心理学学生,所以我的编码背景与你们不相符:-)

我的问题如下,最重要的观察是,使用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个模型具有不同的参数和不同的起始值(我的代码的第二部分),接下来我有一般的曲线拟合文件 . 由于有不同的模型,如果我可以限制我的起始值可以走多远,那将会很有趣 .

任何人都知道如何做到这一点?


有谁愿意帮助心理学学生?

干杯

2 回答

  • 1

    你说:

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

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

    问题实际上是你所展示的模型导致相关参数,因此过度拟合,如@David所述 . 同样,当你比较不同的模型时,应该解决这个问题,并发现有些模型也是如此(从统计学上讲),即使它们涉及的参数较少 .

    edit

    为了通过选择模型来解决问题的关键点,这里有(1)使用模拟数据的试验拟合结果(2)图形形式的参数的相关矩阵:

    enter image description here

    enter image description here

    注意,接近 1 的相关的绝对值表示强相关参数,这是非常不希望的 . 还要注意,数据的趋势在数据集的很长一部分上几乎是线性的,这意味着2个参数可能足以超过该伸展,因此使用8个参数来描述它似乎有点过分 .

  • 0

    在处理非线性模型时,这是一个常见问题 .

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

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

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

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

    干杯

相关问题