加权平均数

jmc*_*tie 1 php mysql statistics

我有一个现有的网络应用程序,允许用户根据他们的难度"评价"项目.(0到15).目前,我只是简单地取每个用户的意见,并直接呈现MySQL的平均值.但是,我(以及我的用户)越来越清楚,对数字进行加权会更合适.

奇怪的是,几个小时的Google-ing并没有出现太多变化.我确实发现两篇文章显示了基于"贝叶斯过滤器"的网站范围评级系统(我部分理解). 是一个例子:

公式是:

WR =(V /(V + M))*R +(M /(V + M))*C.

哪里:

* WR=Weighted Rating (The new rating)
* R=Average Rating (arithmetic mean) so far
* V=Number of ratings given
* M=Minimum number of ratings needed
* C=Arithmetic mean rating across the whole site
Run Code Online (Sandbox Code Playgroud)

我喜欢这里根据每个项目的总票数增加权重的想法...但是,因为我的网站上的难度级别可以在不同项目之间大幅度变化,取"C"(整个算术平均等级)网站)无效.

所以,重述我的问题:

使用MySQL,PHP或两者,我试图从aritmetic意思:

(5 + 5 + 4)/3 = 4.67 (rounded)
Run Code Online (Sandbox Code Playgroud)

...加权平均值:

rating  / weight
5 / 2 (since it was given 2 times)
5 / 2
4 / 1

(sum[(rate * weight)])/(sum of weights)
(5 * 2) + (5 * 2) + (4 * 1) / (2 + 2 + 1)
(24)/(5)
= 4.8
Run Code Online (Sandbox Code Playgroud)

Vin*_*vic 5

这是一个关于如何直接在MySQL中执行此操作的简单示例.您当然需要在子查询上添加一个条件,以便仅获得相关项目的投票而不是所有投票.


mysql> create table votes( vote int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into votes values (5),(5),(4);
Query OK, 3 row affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from votes;
+------+
| vote |
+------+
|    5 |
|    5 |
|    4 |
+------+
3 rows in set (0.00 sec)

mysql> select vote,count(vote),vote*count(vote) from votes group by vote;
+------+-------------+------------------+
| vote | count(vote) | vote*count(vote) |
+------+-------------+------------------+
|    4 |           1 |                4 |
|    5 |           4 |               20 |
+------+-------------+------------------+
2 rows in set (0.00 sec)

mysql> select sum(vt)/sum(cnt) FROM (select 
count(vote)*count(vote) as cnt,vote*count(vote)*count(vote) 
as vt from votes group by vote) a;
+------------------+
| sum(vt)/sum(cnt) |
+------------------+
|           4.8000 |
+------------------+
1 row in set (0.00 sec)