从逻辑上讲,您的评分系统必须处理以下情况:
+----------+----------+------------+-------------- -+
| 积极 | 负数 | 有投票吗?| 威尔逊分数?|
+----------+----------+------------+-------------- -+
| N | N | N | Y, = 0 |
| 是 | 是 | 是 | 是 |
| 是 | N | 是 | 是 |
| N | 是 | 是 | N |
+----------+----------+------------+-------------- -+
正如您所指出的,缺少的项目是当您有 0 个赞成票和超过 0 个反对票时。
由于您当时既有正分又有负分,为什么不按照自己的想法创建一个负的威尔逊分数来处理这个问题,记住负数的平方根是复数。
为了绕过复杂性,假设反对票是积极的。然后,您计算一个负面评分项目的“喜欢”程度,并将其乘以 -1 以将其转化为不喜欢的程度。
import math
def ci_lower_bound(pos, n, neg=0):
if n == 0:
return 0
# Cannot calculate the square-root of a negative number
if pos == 0:
votes, use_neg = neg, True
else:
votes, use_neg = pos, False
# Confidence
z = 1.96
phat = 1.0 * votes / n
# Calculate how confident we are that this is bad or good.
score = (phat + z*z/(2*n) - z * math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
# This relationship is defined above.
# Multiply by -1 to return a negative confidence.
if use_neg:
return -1 * score
return score