jmc*_*tie 1 php mysql statistics
我有一个现有的网络应用程序,允许用户根据他们的难度"评价"项目.(0到15).目前,我只是简单地取每个用户的意见,并直接呈现MySQL的平均值.但是,我(以及我的用户)越来越清楚,对数字进行加权会更合适.
奇怪的是,几个小时的Google-ing并没有出现太多变化.我确实发现两篇文章显示了基于"贝叶斯过滤器"的网站范围评级系统(我部分理解). 这是一个例子:
公式是:
WR =(V /(V + M))*R +(M /(V + M))*C.
哪里:
Run Code Online (Sandbox Code Playgroud)* 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
我喜欢这里根据每个项目的总票数增加权重的想法...但是,因为我的网站上的难度级别可以在不同项目之间大幅度变化,取"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)
这是一个关于如何直接在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)