【问题标题】:MATLAB Histogram ProblemsMATLAB 直方图问题
【发布时间】:2016-07-26 15:15:22
【问题描述】:

我需要计算函数 1/2-x 的概率密度,其中 x 是 0 到 1 之间随机生成的数字。

我的代码如下所示:

n=10^6;
b=10^2;

x=(1./(2-(rand(1,n))));

a=histfit(x,b,'kernel'); % Requires Statistics and Machine Learning Toolbox
xlim([0.5 1.0])

我得到了一个不错的图表,如下所示:

显然,这样做有几个问题:

  1. MATLAB 绘制的拟合与我的直方图不同,因为它也计入函数[0.5 1] 范围之外的空白区域。这导致朝向边缘的扭曲拟合。 (你看不到所说空白的原因是因为我在那里输入了一个 xlim)

  2. 我不知道如何将 Y 轴上的每个值除以 10^6,这将给出我的概率密度。

提前致谢。

【问题讨论】:

  • 但是kernel 方法对您的数据进行了 100 个窗口平均,这就是为什么它是为连续数据设计的...我认为您无法避免这种行为,除非您扩展您的数据和丢弃直方图的第一个和最后一个 bin...
  • 这就是我的想法,但是我该如何扩展数据呢?我没有必须使用内核,所以如果有更好的选择,我想知道。其他人给出的曲线根本不适合。

标签: matlab plot graph histogram


【解决方案1】:

为了解决你的两个问题,我建议使用hist(注意如果你有2010b以上的版本,你应该使用histogram代替)而不是histfit首先得到你的直方图的值,然后做回归并绘制它们:

n=10^6;
b=10^2;
x=(1./(2-(rand(1,n))));

[counts,centers]=hist(x,b);
density = counts./trapz(centers, counts);
%// Thanks to @Arpi for this correction 
polyFitting = polyfit(centers,density,3)
polyPlot = polyval(polyFitting,centers)
figure
bar(centers,density)
hold on
plot(centers,polyPlot,'r','LineWidth',3)

您也可以通过调整 b 来提高分辨率,目前设置为 100。还可以尝试不同的回归,看看你更喜欢哪一个。

【讨论】:

  • 正确的密度是counts/trapz(centers, counts)。我会谨慎使用多项式来表示 cdf 函数,总是应该首选一些理论证明。
  • 没错,至于使用多项式来表示这个 cdf 函数,我为了简单起见使用了这个,我猜 OP 可以使用他/她喜欢的任何类型的拟合。
【解决方案2】:

1.使用ksdensity并指定分发的支持可以获得更好的结果。

2.通过使用hist,您可以访问计数和中心,因此获取密度的标准化很简单。

演示建议的代码:

rng(125)
n=10^6;
b=10^2;

x=(1./(2-(rand(1,n))));

subplot(1,2,1)
a = histfit(x,b,'kernel');
title('Original')
xlim([0.5 1.0])

[f,c] = hist(x,b);
% normalization to get density
f = f/trapz(c,f);

% kernel density
pts = linspace(0.5, 1, 100);
[fk,xk] = ksdensity(x, pts, 'Support', [0.5, 1]);

subplot(1,2,2)
bar(c,f)
hold on
plot(xk,fk, 'red', 'LineWidth', 2)
title('Improved')
xlim([0.5 1.0])

比较结果:

编辑:如果你不喜欢结尾:

pts = linspace(0.5, 1, 500);
[fk,xk] = ksdensity(x, pts, 'Support', [0.5, 1]);
bar(c,f)
hold on
plot(xk(2:end-1),fk(2:end-1), 'red', 'LineWidth', 2)
title('Improved_2')
xlim([0.5 1.0])

【讨论】:

  • 谢谢,但我在放大图表时遇到了同样的问题。然而,它肯定有所改善。
  • 我不会把它称为同一个问题,因为改进的内核密度函数支持 [0.5, 1.0] 与扩展的原始解决方案相比。如果您不喜欢急剧下降的结尾,您可以简单地省略fkxk 的第一个和最后一个元素。支持端可以通过外推达到。准确率可以提高点pts.
猜你喜欢
  • 2023-03-10
  • 2013-01-17
  • 2021-02-07
  • 1970-01-01
  • 2015-06-16
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多