修改累计平均值的评分

时间:2015-02-13 16:54:16

标签: sql algorithm math logic rating

从此question了解累计平均值。

答案看起来很普通。但是,如果用户可以编辑评级,我试图找到是否可以使用相同的方法。我试图知道接受的答案的用户是怎么想的,但他没有回复。所以我正在创建一个新问题。

  

每次获得新评分时,请更新累计平均值    评分数:

new_count = old_count + 1 
new_average = ((old_average * old_count) + new_rating) / new_count

如果用户可以编辑评级:

new_count = old_count // With a rating edit, the count will be the same
new_average = ?

2 个答案:

答案 0 :(得分:1)

您必须减去旧值并添加新内容:

new_average = old_average + (new_rating - old_rating) / count

这意味着您必须在某处存储所有旧评级。但是,如果您的用户要编辑它们,那么可能您在某个地方有旧值。

答案 1 :(得分:1)

执行此操作的正确方法是保持运行总和S并计算C。添加新评级R后,更新规则如下。

(S, C) <- (S + R, C + 1)               | When a new rating R is added.
(S, C) <- (S - R, C - 1)               | When a rating R is removed.

要随时获得平均值,只需评估S / C即可。如果修改了属于S的评分,请按以下步骤更新,其中R0为旧评级,R1为新评级。

(S, C) <- (S - R0 + R1, C)             | When rating R0 is changed to R1.

没有理由将您的数据存储为平均A和计数C。它只会使更新变得更加复杂。

(A, C) <- ((CA + R) / (C + 1), C + 1)  | When a new rating R is added.
(A, C) <- (A + (R1 - R0) / C, C)       | When rating R0 is changed to R1.