从矢量创建累积分布

时间:2013-09-05 09:21:40

标签: matlab statistics distribution

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

示例向量是

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

这是我正在寻找的一个例子:

Example cumulative distribution

3 个答案:

答案 0 :(得分: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]) 

应该做你需要的。

答案 1 :(得分: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来显示经验分布的真实形状。

答案 2 :(得分: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)