[英]Fitting a pdf to an histogram in matlab
在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要好得多。 我也嘗試過只適合一個高斯。 如果運行相同的先前代碼,則使用data = [0.35 * randn(1,100000)]'; 和obj = gmdistribution.fit(data,1,'Replicates',5); 你得到以下
同樣,來自gmdistribution的pdf不符合直方圖。 似乎問題在於數據生成中的縮放因子(0.35)。 我究竟做錯了什么?
gmdistribution
對象的Sigma
參數對應於協方差,但是, normpdf
函數需要標准偏差。 通過在for循環中用normpdf(x,u,sqrt(sigma))
替換normpdf(x,u,sigma)
來解決該問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.