如何将整数列表转换为概率分布,使得整数越小概率值越大?

机器算法验证 可能性 分布
2022-03-16 15:25:38

我目前有一个整数列表,我想将其转换为概率分布。我的目标是将较低的整数值分配给较高的概率值。到目前为止,我想出的是(在 Python 代码中):

>>> original_list = list(range(0, 20))
[0, 1, 2, 3, 4, 5, ..., 19, 20]
>>> preliminary_results = [1 / (x + 0.00001) for x in original_list]
[99999.99, 0.99, 0.49, 0.33, 0.24, 0.19, ..., 0.05] 
>>> final_results = [x / sum(preliminary_results) for x in preliminary_results]
[0.99, 9.99e-08, 4.99-08, 5.2629e-07]

修改了实际输出以增强可读性,但我认为该消息已传达。

如您所见,该策略按我想要的方式工作,但我想知道是否有更好的方法来做到这一点而不必经过两个步骤,因为这在数学上表达也有点不直观。谢谢。

1个回答

一个简单的方法是使用第一个n几何级数的术语:如果0<r<1, 然后

1+r+r2++rn1=1rn1r.

所以如果你分配

pk:=1r1rnrk for k=0,,n1,

那么这些概率总和为1. 参数r让您调整概率下降的速度。

概率

代码:

rr <- c(0.5,0.7)
nn <- 21
(probs <- sapply(rr,function(xx)(1-xx)/(1-xx^nn)*xx^(0:(nn-1))))
colSums(probs)  # yields 1 for both colunms

plot(1:nn,probs[,1],ylim=range(c(0,probs)),las=1,pch=19,cex=1.2,xlab="",ylab="Probability")
points(1:nn,probs[,2],pch=19,cex=1.2,col="red")
legend("topright",col=c("black","red"),pch=19,pt.cex=1.2,legend=paste("r =",rr))