我需要从向量中包含的某些数字创建累积分布。向量计算在我给出的算法中出现点积运算的次数。
示例向量是
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是一个数字列表,表示点积的完成次数。
这是我正在寻找的一个例子:
答案 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)