在matlab中将pdf拟合到直方图
Fitting a pdf to an histogram in matlab
我在将 pdf 拟合到 Matlab 中的直方图时遇到了问题。我正在使用 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')
Histogram and PDFs
如您所见,高斯混合与直方图的拟合不正确。来自 ksdensiti 函数的 PDF 要好得多。我也试过只适合一个高斯。如果您 运行 与之前相同的代码,使用
数据=[0.35*randn(1,100000)]';
和
obj=gmdistribution.fit(数据,1,'Replicates',5);
你得到以下内容
Histogram and PDFs for one gaussian
同样,来自 gmdistribution 的 pdf 不符合直方图。问题似乎出在数据生成中的比例因子(0.35)上。我做错了什么?
gmdistribution
对象的Sigma
参数对应协方差,而normpdf
函数需要标准差。通过在 for 循环中将 normpdf(x,u,sigma)
替换为 normpdf(x,u,sqrt(sigma))
来解决此问题。
我在将 pdf 拟合到 Matlab 中的直方图时遇到了问题。我正在使用 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')
Histogram and PDFs
如您所见,高斯混合与直方图的拟合不正确。来自 ksdensiti 函数的 PDF 要好得多。我也试过只适合一个高斯。如果您 运行 与之前相同的代码,使用 数据=[0.35*randn(1,100000)]'; 和 obj=gmdistribution.fit(数据,1,'Replicates',5); 你得到以下内容
Histogram and PDFs for one gaussian
同样,来自 gmdistribution 的 pdf 不符合直方图。问题似乎出在数据生成中的比例因子(0.35)上。我做错了什么?
gmdistribution
对象的Sigma
参数对应协方差,而normpdf
函数需要标准差。通过在 for 循环中将 normpdf(x,u,sigma)
替换为 normpdf(x,u,sqrt(sigma))
来解决此问题。