2014-02-21 61 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數據,它可能比他的建議更快 –

相關問題