我想要得到一个值X大于x_i的概率,x_i表示累积分布函数CDF。P (X> = x_i)。我已经尝试在Matlab中使用此代码。
假设数据位于列向量p1中。
xp1 = linspace(min(p1), max(p1)); %range of bins
histp1 = histc(p1(:), xp1); %histogram od data
probp1 = histp1/sum(histp1); %PDF (probability distribution function)
`figure;plot(probp1, 'o') `
现在我要计算CDF
sorncount = flipud(histp1);
cumsump1 = cumsum(sorncount);
normcumsump1 = cumsump1/max(cumsump1);
cdf = flipud(normcumsump1);
figure;plot(xp1, cdf, 'ok');
我想知道是否有人可以帮助我知道我是好还是我做错了什么?
您的代码工作正常,但比它可能更复杂。由于probp1已被归一化为sum等于1,因此其累积和的最大值保证为1,因此不需要除以这个最大值。这将代码缩短了一点:
xp1 = linspace(min(p1), max(p1)); %range of bins
histp1 = histc(p1(:), xp1); %count for each bin
probp1 = histp1/sum(histp1); %PDF (probability distribution function)
cdf = flipud(cumsum(flipud(histp1))); %CDF (unconventional, of P(X>=a) kind)
正如Raab70所指出的,大多数情况下,CDF被理解为p (X<=a),在这种情况下,您不需要flipud
:只需取cumsum(histp1)
即可。
另外,我可能会使用histp1(end:-1:1)
而不是flipud(histp1)
,以便向量被翻转,无论它是行还是列。