编辑:好的,我回答了我自己的问题,通过多读一些旧的问题。我很抱歉问了这个问题!使用代码
Y = rand(10,1);
C = hist(Y);
C = C ./ sum(C);
bar(C)使用相应的数据而不是随机数据工作得很好。现在只需要优化存储箱的大小。
日安,现在我知道你一定在想这个问题已经被问了上千次了。在某种程度上,你可能是对的,但我在这里找到的帖子中找不到我具体问题的答案,所以我想我不妨直接问一下。我会尽量说清楚,但如果不清楚我想要做什么,请告诉我
好的,我有一个有5000个元素的(行)向量,所有的元素都是整数。现在我想要做的是绘制这5000个元素的直方图,但是以这样一种方式,y轴提供了在特定bin中的机会,而x轴仍然是规则的,因为它给出了特定bin的值。
现在,对我来说有意义的是将一切正常化,但这似乎不起作用,至少我是这样做的。
我的第一次尝试是
sums = sum(A);
hist(sums/trapz(sums),50)我省略了其余部分,因为它从某个文件导入了大量数据,这并不重要。sum= sum(A)可以很好地工作,而且我可以在matlab中看到向量。(我应该叫它什么,控制台?)然而,用trapz除以面积只会改变x轴,而不会改变y轴。所有的东西都变得超级小,大约是10^-3,而它应该是10的量级。
现在环顾四周,有人建议使用
hist(sums,50)
ylabels = get(gca, 'YTickLabel');
ylabels = linspace(0,1,length(ylabels));
set(gca,'YTickLabel',ylabels); 虽然这肯定会使y轴从0变为1,但它根本没有标准化。我希望它能真实地反映出处于某个垃圾箱中的概率。将两者结合起来也不起作用。如果答案很明显,我很抱歉,我只是看不出来。
编辑:虽然我意识到这是一个独立的问题(这个问题已经被问了一百万次),但我只是手工挑选了条块的大小,直到它看起来很好,因为直方图中没有遗漏任何条。我已经看到了几个不同的脚本,它们应该优化bin大小,但它们似乎没有一个在每种情况下都能做出“最佳”的直方图,可悲的是:(如果所有的数字都是整数,有没有简单的方法来选择大小?
发布于 2014-06-12 15:38:27
(结束这个问题)
直方图是一个绝对频率图,因此所有bin频率的和( hist函数的输出向量之和)始终是其输入向量中的元素数。因此,如果您想要一个百分比输出,您需要做的就是将输出中的每个元素除以该总数:
x = randn(10000, 1);
numOfBins = 100;
[histFreq, histXout] = hist(x, numOfBins);
figure;
bar(histXout, histFreq/sum(histFreq)*100);
xlabel('x');
ylabel('Frequency (percent)');

如果你想重建数据的概率密度函数,你需要考虑直方图的bin大小,并用频率除以:
x = randn(10000, 1);
numOfBins = 100;
[histFreq, histXout] = hist(x, numOfBins);
binWidth = histXout(2)-histXout(1);
figure;
bar(histXout, histFreq/binWidth/sum(histFreq));
xlabel('x');
ylabel('PDF: f(x)');
hold on
% fit a normal dist to check the pdf
PD = fitdist(x, 'normal');
plot(histXout, pdf(PD, histXout), 'r');

更新:
自MATLAB R2014b以来,您可以使用“直方图”命令轻松生成具有各种归一化的直方图。例如,上面的表达式变成:
x = randn(10000, 1);
figure;
h = histogram(x, 'normalization', 'pdf');
xlabel('x');
ylabel('PDF: f(x)');
hold on
% fit a normal dist to check the pdf
PD = fitdist(x, 'normal');
plot(h.BinEdges, pdf(PD, h.BinEdges), 'r');

https://stackoverflow.com/questions/21063026
复制相似问题