2014-02-21 63 views
1

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

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

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

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

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

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

+0

对于两个方程式,您只需要一个(a,b)的one_set。我对吗?所以你必须意识到这可能会给模型带来更多关于你的数据集的错误。 – Mohammad

+0

是的,参数集(a,b)对于两个方程应该是相同的,您是对的。我意识到这可能导致更大的错误,但由于它们具有相同的物理属性,它们必须是相同的(两个数据集都是通过对不同数量的一次测量获取的)。如果我得到两个不同的值,我不知道哪一个是“正确的”。另外我希望这可以排除一个参数被其中一个拟合扰乱但在另一个参数中很好(例如设置为边界值)的错误。 –

回答

2

一般来说,你可以使用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 

请注意,在“贝塔斯”我保持参数和“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); 

这必须工作!

+0

谢谢你的想法。然而,'fmincon()'至少需要四个参数,不仅是函数和起始值,还有矩阵(in)等式的参数。我想我可以用它来为我的系数'a'和'b'设置边界?我会尽力让它工作。尽管如此,任何进一步的帮助是高度赞赏。 –

+0

它就像一个魅力,非常感谢你。矩阵不等式确实可以用于边界(尽管它可以更多地指定“a”和“b”之间的关系)。 只是一些进一步的一般化妆品问题,我可以以某种方式抑制'fmincon()'生成的文本输出?我尝试在''Display','off''上使用'options'',但是这个函数似乎把选项误认为是不同的(可选的)参数。 –

+0

@Linus,你很受欢迎。我猜你已经试过这个:options = optimset('Display','off'); [....] = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options); – DanielTheRocketMan

0

过墙,但如何尽量拟合: f(x)+g(x) = a*exp(x)+b + atan(b*x/a)

你觉得呢?这完全是愚蠢的吗?

如果f(x)的幅度不匹配,我知道它不起作用(可能很少会),因为那么两个不同部分的误差(这是最小化的)是将不平等,你最终会适应一个或另一个功能。

+0

我认为其中一个假设是他有一个不同的数据集为每个功能。所以这个解决方案是不可实施的。 – DanielTheRocketMan

+0

我有不同的情况,有些地方的x数据确实是相同的,我可以尝试在那里实现你的版本,但正如丹尼尔指出的那样,如果情况并非如此,它将不起作用。但是,如果有相同的x数据,它可能比他的建议更快 –

相关问题