4

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

一个示例向量是

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

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

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 是一个数字列表,表示完成点积的次数。

这是我正在寻找的示例:

示例累积分布

4

3 回答 3

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]) 

应该做你需要的。

于 2013-09-05T09:38:21.393 回答
2

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

您要做的是获取数据的经验 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显示经验分布的真实形状。

于 2013-09-05T15:12:56.933 回答
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)
于 2013-09-05T09:58:45.977 回答