使用此处描述的Wilson分数公式http://www.evanmiller.org/how-not-to-sort-by-average-rating.html,我正在对我评分的项目进行排序。但是,如果一个项目有1个反对票(和0个正投票),它将返回相同的分数(即0分)作为具有1000个反对票(和0个正数)的项。
我想要允许威尔逊得分,以克服这个缺点,或者可能是其他人可能建议的解决方案。
无论哪种方式,我不确定如何更改此等式/函数:
def ci_lower_bound(pos, n, confidence):
if n==0: return 0
z = 1.96
phat = 1.0*pos/n
score = (phat + z*z/(2*n) - z*math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
return score
其中pos
是积极评分的数量,n
是评分的总数,confidence
是指统计置信度。
答案 0 :(得分:1)
好吧,你总是可以按元组(wilsonscore, -negative_votes)
排序,因为python对元组进行排序。
Python永远不会考虑negative_votes,除非wilsonscore是相同的。
参见:
>>> sorted([(0,-4000),(1,-4000),(0,-1),(1,-1)])
[(0, -4000), (0, -1), (1, -4000), (1, -1)]
pro:问题的简单解决方案,无需更改函数,并且很少需要更改代码(因为元组在排序时表现为“自然”)。
缺点:需要跟踪负面投票。答案 1 :(得分:1)
逻辑上,您的评分系统必须处理以下情况:
+----------+----------+------------+---------------+ | Positive | Negative | Any Votes? | Wilson Score? | +----------+----------+------------+---------------+ | N | N | N | Y, = 0 | | Y | Y | Y | Y | | Y | N | Y | Y | | N | Y | Y | 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