2016-02-11 123 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的最佳初始值。你让我今天一整天都感觉很好!!! –