2

使用此处描述的威尔逊分数方程http://www.evanmiller.org/how-not-to-sort-by-average-rating.html,我正在对我的评分项目进行排序。但是,如果一个项目有 1 个反对票(和 0 个赞成票),它返回与一个有 1000 个反对票(和 0 个赞成票)的项目相同的分数(即 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是指统计置信度。

4

2 回答 2

1

好吧,您总是可以按 tuple 排序(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:问题的简单解决方案,无需更改函数,几乎不需要更改代码(因为元组在排序时表现“自然”)。

缺点:需要跟踪反对票。

于 2012-04-21T12:26:05.427 回答
1

从逻辑上讲,您的评分系统必须处理以下情况:

+----------+----------+------------+-------------- -+
| 积极 | 负数 | 有投票吗?| 威尔逊分数?|
+----------+----------+------------+-------------- -+
| 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
于 2012-04-21T14:09:34.900 回答