【问题标题】:Creating a cumulative distribution from a vector从向量创建累积分布
【发布时间】:2013-09-09 01:26:55
【问题描述】:

我需要根据向量中包含的一些数字创建累积分布。向量计算点积运算在我给出的算法中发生的次数。

一个示例向量是

myVector = [100 102 101 99 98 100 101 110 102 101 100 99]

我想根据 0 到 120 的范围绘制点积少于 99 个的概率。内置函数

Cumdist(MyVector)

不合适,因为我需要在比 cumdist 当前提供的范围更广的范围内进行绘图。

我尝试过使用

plot([0 N],cumsum(myVector))

但我的向量中有多个相同值的条目,我不知道如何不重复计数。

这是一些我想要的python代码:

count = [x[0] for x in tests]
found = [x[1] for x in tests]
found.sort()
num = Counter(found)
freqs = [x for x in num.values()]
cumsum = [sum(item for item in freqs[0:rank+1]) for rank in xrange(len(freqs))]
normcumsum  = [float(x)/numtests for x in cumsum]

tests 是一个数字列表,表示完成点积的次数。

这是我正在寻找的示例:

Example cumulative distribution

【问题讨论】:

  • 您能补充更多信息吗?一个例子会让我们更深入地了解。
  • @RodyOldenhuis 我认为重复值应该比单个值更高。

标签: matlab statistics distribution


【解决方案1】:

我会这样做:

myVector = [100 102 101 99 98 100 101 110 102 101 100 99];
N = numel(myVector);
x = sort(myVector);
y = 1:N;
[xplot , idx] = unique(x,'last')
yplot = y(idx)/N
stairs(xplot,yplot)

%Optionally
xfull = [0 xplot 120]
yfull = [0 yplot 1]
stairs(xfull,yfull)

【讨论】:

  • 您的“可选”大小写与 ecdf 在这种情况下返回的内容相同,只是 xfull(1) 应该是 98 (min(myVector)),而不是 0。
  • @horchler 我不明白,在您观察到某些东西之前,经验分布将为 0。
  • 我认为经验 CDF 的意义在于它只接受数据中存在的值。它假设最小数据值对应于分布的下限,并且与最大数据值类似。在这种情况下,没有数据表明 0 甚至包含在分发的支持中。
  • @horchler 它仅在数据值点处具有步骤,因此通常不会在最小值和最大值之外绘制。但是,它是明确定义的。在查看definition on wikipedia 时,您会发现任何 ECDF 的域都是整个实数集。
  • 我对域的看法是正确的,但是,在高斯假设下,如果 ECDF 在 yfull=0 进行评估,-Inf 将比 0 更好的选择 xfull
【解决方案2】:

五个小时后,一个答案已被接受,但如果您仍然对另一个答案感兴趣...

您要做的是获取数据的empirical CDF。您可能拥有的 Matlab 统计工具箱具有以统计谨慎的方式准确执行此操作的功能:ecdf。所以你真正需要做的就是

myVector = [100 102 101 99 98 100 101 110 102 101 100 99];
[Y,X] = ecdf(myVector);
figure;
plot(X,Y);

您可以使用stairs 代替plot 来显示经验分布的真实形状。

【讨论】:

  • 觉得有什么不对劲,但没想到楼梯。非常好。
【解决方案3】:

要创建累积分布,您不能直接在向量上使用cumsum。请改为执行以下操作:

sortedVector = sort(myVector(:));
indexOfValueChange = [find(diff(sortedVector));true];
relativeCounts = (1:length(sortedVector))/length(sortedVector);

plot(sortedVector(indexOfValueChange),relativeCounts(indexOfValueChange))

编辑

如果您的目标只是修改绘图的 x 范围,

xlim([0 120]) 

应该做你需要的。

【讨论】:

  • 我如何将 x 轴从 0 更改为 150?
  • 如果您使用diff,您似乎错过了最高值。您可以将 diff(sortedVector) 替换为 diff([sortedVector; Inf])
  • @DennisJaheruddin 可能是对的。结果至少与 Matlab 的 ecdf 函数返回的结果不同。
猜你喜欢
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多