【问题标题】:Fitting different datasets with different models but the same parameters用不同的模型但相同的参数拟合不同的数据集
【发布时间】:2014-02-21 09:44:01
【问题描述】:

我正在寻找一种方法来用不同的拟合模型拟合两个不同的数据集,但取决于 Matlab 中的相同参数。到目前为止,我发现的所有解决方案要么不适用于 matlab,要么不处理这个确切的问题。

这是一个粗略的例子,我的问题是这样的: 我已经获得了两个应该采用这些形式的数据集:

数据集1:f(x) = a*exp(x)+b

数据集 2:g(x) = atan(b*x/a)

真正的公式比较复杂,但原理应该是一样的。

当我尝试用 NonlinearLeastSquares 独立拟合它们时,matlab 显然为两个不同数据集的变量 ab 提供了不同的值。我尝试将一种解决方案作为起点提供给另一个拟合程序,但这很少能提高准确性。有没有办法告诉 Matlab 同时拟合两个数据集,或者至少找到最适合 bost 模型的变量?

【问题讨论】:

  • 您希望两个方程只有一个 组 (a,b)。我对吗?所以你必须意识到,这可能会给你的数据集带来更多错误的模型。
  • 是的,两个方程的参数集 (a,b) 应该相同,你是对的。我意识到这可能会导致更大的误差,但由于它们是相同的物理特性,它们必须是相同的(两个数据集都是通过对不同数量的一次测量获得的)。如果我得到两个不同的值,我将不知道哪个是“正确的”。另外,我希望这会排除错误,即一个参数被其中一个拟合弄乱了,但在另一个拟合中却很好(例如,设置为边界值)。

标签: matlab curve-fitting


【解决方案1】:

通常您可以使用 fmincon 来执行此操作。这个想法是定义一个同时考虑 f(x) 和 g(x) 的函数。

让我们这样做。

function error2 = myFunction(betas,x)

lambda=0.5;

error2=0;

a=betas(1,1);
b=betas(2,1);

x1=x(:,1); %Assuming that both datasets have the same size. If they are not you can adjust it
y1=x(:,2);
x2=x(:,3);
y2=x(:,4);

n=size(x,1); 

for i=1:n
    f1=a*exp(x1(i,1))+b;
    f2=atan(b*x2(i,1)/a);
    error2=error2+lambda*(y1(i,1)-f1)^2 + (1-lambda)*(y2(i,1)-f2)^2;
end

请注意,在“betas”中,我保留了参数,而“x”中,我保留了数据。为了对函数 f 和 g 加权,我不得不引入一个新变量“lambda”。这很好,因为改变 lambda 您可以看到其中一个函数如何影响另一个函数的估计。实际上,您可以从 lambda=0 开始,并针对 0.1、0.2、...、1 等值运行多次此例程。

现在你必须使用 fmincon 调用这个函数。

clear all
close all

    % Here you have to create your data x: Remember the structure I used for x=[x1,y1,x2,y2]

   x1=
   y1=
   x2=
   y2=

   x=[x1,y1,x2,y2];


    % you need to initiate the values of your parameters beta

a0=
b0=

beta0(1,1)=a0;
beta0(2,1)=b0;

beta = fmincon(@(beta)myFunction(beta,x), beta0);

这一定行得通!

【讨论】:

  • 感谢您的想法。但是,fmincon() 至少需要四个参数,不仅是函数和起始值,还需要矩阵(in)方程的参数。我想我可以用它来为我的系数ab 设置边界?我会努力让它发挥作用。尽管如此,我们非常感谢您提供任何进一步的帮助。
  • 它就像一个魅力,非常感谢。矩阵不等式确实可以用于边界(尽管它可以指定更多类似ab 之间的关系)。只是一些更一般的化妆品问题,我可以以某种方式抑制fmincon() 生成的文本输出吗?我尝试将'options''Display','off' 一起使用,但该函数似乎将选项误认为是不同的(可选)参数。
  • @Linus,不客气。我猜你已经尝试过了: options = optimset('Display', 'off') ; [....] = fmincon(@fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options) ;
  • @Linus- 你有没有看到这个:stackoverflow.com/questions/3029636/…。它可能会起作用。我现在没有matlab来测试。据我了解,它基本上是覆盖功能显示的行为。
  • 我不知道evalc(),(我对matlab还很陌生,到目前为止一直在使用python),它正是我想要的,谢谢。
【解决方案2】:

关闭墙壁,但尝试安装如何: f(x)+g(x) = a*exp(x)+b + atan(b*x/a)

你怎么看?这完全是愚蠢的吗?

我知道如果 f(x) 和 g(x) 的大小不匹配,它不会起作用(而且可能很少会起作用),因为两个不同部分的错误(您正在最小化)正在发生不平等,你最终会适应一个或另一个功能。

【讨论】:

  • 我认为其中一个假设是他对每个函数都有不同的数据集。所以这个方案是不可行的。
  • 我有不同的情况,有些情况下 x 数据确实相同,我可以尝试在那里实现你的版本,但正如丹尼尔指出的那样,如果不是这种情况,它将无法工作。但是,如果 x 数据相同,它可能会比他的建议更快
猜你喜欢
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 2016-07-30
  • 2017-09-10
  • 1970-01-01
相关资源
最近更新 更多