2016-02-11 121 views
0

我有以下問題:Matlab的:最小二乘擬合至2D數據集

型號:中央具有輪廓,其是高斯和洛倫茲分佈的組合對稱圓。爲了得到模型圖,只需將以下代碼插入到Matlab中:

N = 501;       %Matrix size 
R = zeros(N,N);      %Initializing matrix R 
x0 = ceil(N/2); y0 = x0;   %Barycenter coordinates 

for i=1:N       %Calculation of matrix R 
    for j=1:N 
     R(i,j) = sqrt((x0-j)^2 + (y0-i)^2);   
    end  
end 

%Model z1 and the parameters: 
peak = 0.275*N;      %Peak location 
m = 0.3; 
sigma = 0.1*N; 
gamma = 15; 
A1 = 1000; 
A2 = 50; 
z1 = (1-m)*A1/(sigma*sqrt(pi))*exp(-(abs(R - peak)).^2/sigma^2) + m*A2/pi * (gamma./((abs(R - peak1)).^2 + gamma^2)); 

figure('name','Show Model') 
surf(z1,'EdgeColor','none','LineStyle','none','FaceLighting','phong'); 

所以這是「理想主義」模型。爲了模擬真實的數據,我將隨機噪聲添加到Z1:

z2 = z1 + random('Normal',0,1,N,N); 
figure('name','Show random noise data') 
surf(z2,'EdgeColor','none','LineStyle','none','FaceLighting','phong'); 

最後通過重心相交平面的一個情節:

figure('name','Show intersecting plane with model and random noise data') 
xaxis = -floor(N/2):1:floor(N/2); 
intersectionline1 = z1(ceil(N/2),:); 
intersectionline2 = z2(ceil(N/2),:); 
plot(xaxis,intersectionline1,xaxis,intersectionline2,'.r'); 

Z2例如可以是我測量的實際數據集。圓圈在我的形象中的任何地方。我實際上能找到重心並得到一個平方的部分。除此之外,我可以很好地近似半徑r(變量「峯值」)。

我現在的問題: 是否有可能使一個最小二乘法擬合到我的數據集,以獲得參數m,西格瑪,γ,高峯,A1和A2從我的模型???我不知道如果Matlab能夠這樣做...

在此先感謝!

回答

2

您可以使用fminsearch找到一套給最小的最小二乘係數:

% peak = K(1)^2 
% m  = K(2)^2 
% sigma = K(3)^2 
% gamma = K(4)^2 
% A1 = K(5)^2 
% A2 = K(6)^2 

model = @(z0, K) (1-K(2)^2)*K(5)^2/(K(3)^2*sqrt(pi))*exp(-(abs(z0 - K(1)^2)).^2/K(3)^4) + K(2)^2*K(6)^2/pi * (K(4)^2./((abs(z0 - K(1)^2)).^2 + K(4)^4)); 
errsq = @(K) sum(sum((z2-model(R,K)).^2)); 
K0 = ones(6,1); 
K = fminsearch(errsq,K0); 
figure('name','Reconstructed'); 
surf(model(R,K),'EdgeColor','none','LineStyle','none','FaceLighting','phong'); 

爲了確保係數保持積極的態度,該機型採用參數化平方。當然,最初的猜測K0對於最終結果非常重要。

+0

謝謝!事實上,對於任何測量數據,我必須考慮如何找到fminsearch的最佳初始值。你讓我今天一整天都感覺很好!!! –