如何在 MatLab 中绘制概率密度函数?
Posted
技术标签:
【中文标题】如何在 MatLab 中绘制概率密度函数?【英文标题】:How to draw probability density function in MatLab? 【发布时间】:2011-08-11 01:44:42 【问题描述】:x = [1 2 3 3 4]
cdfplot(x)
谷歌搜索后,我发现上面的代码会在 Matlab 中为我绘制一个累积分布函数。 有没有简单的方法来绘制概率密度函数?
澄清。我需要一个具有均匀分布的 x 轴的图表。而且我希望它看起来不像条形图。 (我会有数百万个整数) 抱歉,再次更新。我的数据是整数,但实际上它们代表时间(我希望在完全相同的值上有几个相当高的峰值,而其他值看起来好像不是离散的)。我实际上开始怀疑这是否实际上不是固有的离散整数。 CDF 肯定会工作,但是当使用 PDF 时,它似乎比我预期的要复杂。
【问题讨论】:
“均匀分布的x轴”是什么意思? @gnovice 正如您在新答案中所做的那样。 看看 ksdensity 函数。它是核密度估计的一种实现。 mathworks.com.au/help/toolbox/stats/ksdensity.html 【参考方案1】:您可以使用函数hist
为整数生成离散概率分布:
data = [1 2 3 3 4]; %# Sample data
xRange = 0:10; %# Range of integers to compute a probability for
N = hist(data,xRange); %# Bin the data
plot(xRange,N./numel(data)); %# Plot the probabilities for each integer
xlabel('Integer value');
ylabel('Probability');
这是结果图:
更新:
在较新版本的 MATLAB 中,不再推荐使用 hist
函数。相反,您可以像这样使用histcounts
函数来生成与上图相同的图形:
data = [1 2 3 3 4];
N = histcounts(data, 'BinLimits', [0 10], 'BinMethod', 'integers', 'Normalization', 'pdf');
plot(N);
xlabel('Integer value');
ylabel('Probability');
【讨论】:
@gnovice:只是一个小问题,一般来说,您应该除以直方图的 面积,而不是 数据点的数量得到一个pdf。所以最后一行应该是bar(X,N/trapz(X,N))
。由于在此示例中,bin 点是整数和单位间隔,numel
和 trapz
都给出相同的答案,4
,但如果不是这种情况,它们将是不同的。
@yoda:你是对的,但 Gene 提到必须为 integer 值(即离散概率分布)执行此操作,所以我想我会保持简单。
谢谢你的回答,我还有一个问题,新手。 @yoda 的评论引起了我的关注。如果 x=[100 200 400 400 550],这仍然可以正常工作吗
我会尝试我的实际数据。谢谢大家!
@Gene:如果你有data = [100 200 400 400 550];
并指定了一个整数范围,比如xRange = 0:600;
,你会得到一个除了0.2 峰值之外的大部分为0 的图,当x 等于100、200 和当 x 等于 400 时,峰值为 550,峰值为 0.4。作为显示数据的另一种方式,您可能想要尝试使用STEM 图而不是常规线图。它可能看起来更好。【参考方案2】:
如果你想要一个连续分布函数,试试这个。
x = [1 2 3 3 4]
subplot(2,1,1)
ksdensity(x)
axis([-4 8 0 0.4])
subplot(2,1,2)
cdfplot(x)
grid off
axis([-4 8 0 1])
title('')
哪个输出这个。
累积分布函数在底部,核密度估计在顶部。
【讨论】:
【参考方案3】:在 matlab 帮助中键入“ksdensity”,您将找到可以为您提供 PDF 连续形式的函数。我想这正是您正在寻找的。
【讨论】:
【参考方案4】:除了ksdensity(x)
得到的平滑PDF,还可以使用ksdensity(x,'function','cdf')
绘制平滑CDF图。
【讨论】:
以上是关于如何在 MatLab 中绘制概率密度函数?的主要内容,如果未能解决你的问题,请参考以下文章