在matlab中将pdf拟合到直方图

在matlab中将pdf拟合到直方图,matlab,histogram,probability-density,Matlab,Histogram,Probability Density,在Matlab中将pdf拟合到直方图时遇到问题。我使用gmdistribution.fit,因为我的数据是多模态的。这就是我所做的: data=[0.35*randn(1,100000), 0.5*randn(1,100000)+5, 1*randn(1,100000)+3]'; %multimodal data x=min(data):(max(data)-min(data))/10000:max(data); %Normalized Histogram [counts,edges]=his

在Matlab中将pdf拟合到直方图时遇到问题。我使用gmdistribution.fit,因为我的数据是多模态的。这就是我所做的:

data=[0.35*randn(1,100000), 0.5*randn(1,100000)+5, 1*randn(1,100000)+3]'; %multimodal data
x=min(data):(max(data)-min(data))/10000:max(data);

%Normalized Histogram
[counts,edges]=histcounts(data,500, 'Normalization', 'pdf');
bw=edges(2)-edges(1);
centers=edges(1:end-1)+bw;
H = bar(centers,counts,'hist');
hold on

%Fitting with gmdistribution
rng default
obj=gmdistribution.fit(data,3,'Replicates',5);

%the PDF
PDF=zeros(1,length(x));
for i=1:obj.NumComponents
    k=obj.ComponentProportion(i);
    u=obj.mu(i);
    sigma=obj.Sigma(i);
    PDF=PDF+k*normpdf(x,u,sigma);    
end
PDF=PDF/trapz(x,PDF);  %normalization (just in case)
plot(x,PDF)

%Fitting with ksdensity (for comparison)
[PDF2,xi]=ksdensity(data,x);
plot(x,PDF2)

legend('Normalized Histogram','gmdistribution','ksdensity')

正如您所看到的,高斯混合不适合直方图。来自ksdensiti函数的PDF要好得多。我也试着只拟合一个高斯分布。如果运行与前面相同的代码,请使用 数据=[0.35*兰特(1100000)]; 和 obj=gmdistribution.fit(数据,1,'Replicates',5); 你会得到以下结果


同样,来自gmdistribution的pdf不符合直方图。问题似乎在于数据生成中的比例因子(0.35)。我做错了什么?

对象的
gmdistribution
Sigma
参数对应协方差,但是
normpdf
函数需要标准偏差。通过在for循环中将
normpdf(x,u,sigma)
替换为
normpdf(x,u,sqrt(sigma))
解决了这个问题。

gmdistribution
对象的
sigma
参数对应于协方差,但是
normpdf
函数需要标准偏差。通过将for循环中的
normpdf(x,u,sigma)
替换为
normpdf(x,u,sqrt(sigma))
可以解决此问题