我想将双峰正态分布拟合为看起来双峰分布的数据,例如下面的示例(plot(x)
):
从MATLAB文档中我想到使用带有函数句柄的mle函数来处理两个高斯的混合:
@(x,p,mu1,mu2,sigma1,sigma2)p*normpdf(x,mu1,sigma1)+(1-p)*normpdf(x,mu2,sigma2)
但是,mle
函数适合x
的直方图,而我想要近似x
本身。我怎么能做到这一点?
答案 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 非参数 ;然后正常