論理的には、スコアリング システムは次の状況に対処する必要があります。
+------------+---------+------------+--------------- -+
| | ポジティブ | ネガティブ | 投票はありますか? | | ウィルソンスコア? | |
+------------+---------+------------+--------------- -+
| | ん | ん | ん | Y, = 0 |
| | よ | よ | よ | よ |
| | よ | ん | よ | よ |
| | ん | よ | よ | ん |
+------------+---------+------------+--------------- -+
お気づきのように、不足している項目は、賛成票が 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