将双峰正态分布拟合到值的向量,而不是其直方图

时间:2015-05-21 13:02:16

标签: matlab curve-fitting

我想将双峰正态分布拟合为看起来双峰分布的数据,例如下面的示例(plot(x)): bimodal distribution

从MATLAB文档中我想到使用带有函数句柄的mle函数来处理两个高斯的混合:

@(x,p,mu1,mu2,sigma1,sigma2)p*normpdf(x,mu1,sigma1)+(1-p)*normpdf(x,mu2,sigma2)

但是,mle函数适合x的直方图,而我想要近似x本身。我怎么能做到这一点?

3 个答案:

答案 0 :(得分:2)

我们的想法是创建数组y,其直方图看起来像你的函数x(到处都应该是正数):

%// Calculate
N  = numel(x);
xi = fix(x/max(x)*100);  % Limit the memory damage
yp = arrayfun(@(n) n*ones(1,xi(n)), 1:N, 'UniformOutput', false);
y = [yp{:}];

%// Visually inspect
ax = axes('Parent', figure());
plot(ax, xi); hold(ax, 'on');
hist(ax, y, N);

答案 1 :(得分:2)

Matlab具有内置双峰拟合

f =@(A,m,s,x) A(1) * exp(-((x-m(1))/s(1)).^2) + A(2) * exp(-((x-m(2))/s(2)).^2);
g =@(x) f([5, 10], [1, 10], [3, 5], x);
x = (-20:0.01:20)';
y = g(x) + 0.25*(rand(size(x)) - 0.5);
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
[fitresult, gof] = fit( x, y, 'gauss2', opts );
plot( fitresult, x, y );

答案 2 :(得分:0)

%u 可以使用该功能 histfit(yourdata,nbins,'Kernel','normal'); %有时它不收敛;在这种情况下,您可以求助于 distributionFitter 应用程序 distributionFitter(你的数据); %select 非参数 ;然后正常