编辑累积平均评级

Edit rating of cumulative average

由此question关于累计平均值。

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

Every time you get a new rating, update the cumulative average and rating count:

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 = ?

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

new_average = old_average + (new_rating - old_rating) / count

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

正确的方法是保持 运行 总和 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.