为了账号安全,请及时绑定邮箱和手机立即绑定

如何在MATLAB中标准化直方图?

如何在MATLAB中标准化直方图?

阿波罗的战车 2019-10-15 15:21:03
如何对直方图进行归一化,以使概率密度函数下的面积等于1?
查看完整描述

3 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

我对此的回答与您对先前问题的回答相同。对于概率密度函数,整个空间的积分为1。除以总和不会得到正确的密度。为了获得正确的密度,必须除以面积。为了说明我的观点,请尝试以下示例。


[f, x] = hist(randn(10000, 1), 50); % Create histogram from a normal distribution.

g = 1 / sqrt(2 * pi) * exp(-0.5 * x .^ 2); % pdf of the normal distribution


% METHOD 1: DIVIDE BY SUM

figure(1)

bar(x, f / sum(f)); hold on

plot(x, g, 'r'); hold off


% METHOD 2: DIVIDE BY AREA

figure(2)

bar(x, f / trapz(x, f)); hold on

plot(x, g, 'r'); hold off

您可以自己查看哪种方法与正确答案(红色曲线)相符。


标准化直方图的另一种方法(比方法2更直接)是除以sum(f * dx)表示概率密度函数的积分,即


% METHOD 3: DIVIDE BY AREA USING sum()

figure(3)

dx = diff(x(1:2))

bar(x, f / sum(f * dx)); hold on

plot(x, g, 'r'); hold off


查看完整回答
反对 回复 2019-10-15
?
ITMISS

TA贡献1871条经验 获得超8个赞

自2014b起,Matlab将这些规范化例程本机嵌入在histogram函数中(有关此函数提供的6个例程,请参阅帮助文件)。这是一个使用PDF归一化的示例(所有bin的总和为1)。


data = 2*randn(5000,1) + 5;             % generate normal random (m=5, std=2)

h = histogram(data,'Normalization','pdf')   % PDF normalization

对应的PDF是


Nbins = h.NumBins;

edges = h.BinEdges; 

x = zeros(1,Nbins);

for counter=1:Nbins

    midPointShift = abs(edges(counter)-edges(counter+1))/2;

    x(counter) = edges(counter)+midPointShift;

end


mu = mean(data);

sigma = std(data);


f = exp(-(x-mu).^2./(2*sigma^2))./(sigma*sqrt(2*pi));

两者一起给


hold on;

plot(x,f,'LineWidth',1.5)

在此处输入图片说明


改进很可能归因于实际问题和接受的答案的成功!


编辑-使用hist和histc被不建议现在,和histogram应改为使用。请注意,使用此新功能创建垃圾箱的6种方法均不会产生垃圾箱  hist并histc产生。有一个Matlab脚本可以更新以前的代码以适应  histogram调用方式(bin边而不是bin中心-link)。这样,可以比较pdf @abcd(trapz和sum)和Matlab(pdf)的规范化方法。


3 pdf归一化方法给出的结果几乎相同(在的范围内eps)。


测试:


A = randn(10000,1);

centers = -6:0.5:6;

d = diff(centers)/2;

edges = [centers(1)-d(1), centers(1:end-1)+d, centers(end)+d(end)];

edges(2:end) = edges(2:end)+eps(edges(2:end));


figure;

subplot(2,2,1);

hist(A,centers);

title('HIST not normalized');


subplot(2,2,2);

h = histogram(A,edges);

title('HISTOGRAM not normalized');


subplot(2,2,3)

[counts, centers] = hist(A,centers); %get the count with hist

bar(centers,counts/trapz(centers,counts))

title('HIST with PDF normalization');



subplot(2,2,4)

h = histogram(A,edges,'Normalization','pdf')

title('HISTOGRAM with PDF normalization');


dx = diff(centers(1:2))

normalization_difference_trapz = abs(counts/trapz(centers,counts) - h.Values);

normalization_difference_sum = abs(counts/sum(counts*dx) - h.Values);


max(normalization_difference_trapz)

max(normalization_difference_sum)

在此处输入图片说明


新的PDF规范化与以前的规范化之间的最大差是5.5511e-17。


查看完整回答
反对 回复 2019-10-15
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

hist不仅可以绘制直方图,还可以返回每个bin中元素的数量,因此您可以获取该计数,将每个bin除以总数并使用来绘制结果,以对其进行归一化bar。例:


Y = rand(10,1);

C = hist(Y);

C = C ./ sum(C);

bar(C)

或者如果您想要单线:


bar(hist(Y) ./ sum(hist(Y)))


编辑:此解决方案回答了问题:如何使所有垃圾箱的总和等于1。仅当bin大小相对于数据方差较小时,这种近似才有效。这里使用的总和对应一个简单的正交公式,可以使用更复杂的公式,如RMtrapz所建议的


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 1193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信