如何在MatLab中绘制概率密度函数?

6
x = [1 2 3 3 4]
cdfplot(x)

在搜索后,我发现上述代码可以在Matlab中为我绘制累积分布函数。
是否有一种简单的方法来绘制概率密度函数?

为了澄清。我需要一个具有均匀分布的x轴的图表。而且我希望它看起来不像条形图。(我会有数百万个整数)
抱歉,再次更新。我的数据是整数,但实际上它们代表时间(我预计在完全相同的值处会有几个非常高的峰值,而其他值应该看起来像不是离散的)。实际上,我开始怀疑这实际上并不是固有的离散整数。CDF肯定可以工作,但当涉及到PDF时,它似乎比我预期的更加复杂。


“evenly distributed x-axis” 是什么意思? - gnovice
@gnovice,就像你在新答案中所做的那样。 - Haozhun
请看一下ksdensity函数。它是核密度估计的一个实现。http://www.mathworks.com.au/help/toolbox/stats/ksdensity.html - user1127125
4个回答

7
你可以使用函数 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');

以下是生成的图表:

enter image description here


更新:

在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');

4
通常情况下,为了得到概率密度函数,你应该除以直方图的面积而不是数据点的数量。因此,最后一行应该写成“bar(X,N/trapz(X,N))”。在这个例子中,由于箱体点是整数且间隔为单位距离,因此“numel”和“trapz”都会给出相同的答案,“4”,但如果情况不同,它们将会有所不同。 - user616736
@Gene:是的,它会。如果我的评论让您感到困惑,我很抱歉,但是为了理解我的意思,您可以查看我对于归一化直方图的早期问题的回答。如果您在其中运行代码,它将说明我试图表达的观点。如果您只有离散整数,则通过除以numel即可得到正确的答案。在任何情况下,trapz都会给出正确的答案。 - user616736
1
@Gene:如果你有 data = [100 200 400 400 550]; 并指定了一个整数范围,如 xRange = 0:600;,你将得到一个大部分为0的图形,除了当x等于100、200和550时出现0.2的峰值以及当x等于400时出现0.4的峰值。作为显示数据的另一种选择,你可以尝试使用STEM绘图而不是常规线性绘图。这样可能看起来更好。 - gnovice
@yoda和gnovice:我的数据是整数,但实际上它们代表时间(我期望在完全相同的值处有几个相当高的峰值,而其他值应该看起来像不是离散的)。我开始怀疑这是否本质上不是离散整数。 CDF肯定可以工作,但是当涉及到PDF时,似乎比我预期的要复杂。你们有什么想法吗? - Haozhun
@gnovice:你回答这个问题已经有一段时间了,但如果我的x轴上没有整数,我该怎么办?非常感谢 :) cdfplotksdensity在我的Matlab版本中不起作用。 - mwoua
显示剩余3条评论

7
如果您想要一个连续的分布函数,请试试这个。
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('')

这将输出以下内容。 在此输入图像描述

累积分布函数位于底部,核密度估计位于顶部。


2

在matlab帮助中键入“ksdensity”,您会找到一个函数,这个函数可以给出连续形式的概率密度函数(PDF)。我猜这正是你要找的。


0
除了使用ksdensity(x)获得平滑的PDF外,你还可以使用ksdensity(x,'function','cdf')绘制平滑的CDF图。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接