我有一个现有的网络应用程序,允许用户根据他们的难度“评价”项目。 (0到15)。目前,我只是简单地取每个用户的意见,并直接呈现MySQL的平均值。但是,我(以及我的用户)越来越清楚,加权数字会更合适。
奇怪的是,几个小时的Google-ing并没有出现太多。我确实发现两篇文章显示了基于“贝叶斯过滤器”的网站范围评级系统(我部分理解)。 Here就是一个例子:
公式为:
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
我喜欢这里根据每件商品的总票数增加加权的想法......但是,因为我的网站上的难度级别可以在不同的项目之间大幅度变化,取“C”(算术平均等级)在整个网站上)无效。
所以,重述我的问题:
使用MySQL,PHP或两者兼而有之,我试图从aritmetic手段获取:
(5 + 5 + 4)/3 = 4.67 (rounded)
...加权平均值:
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
答案 0 :(得分: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)
答案 1 :(得分:0)
什么表明加权更合适?你在算术平均值上看到什么对你没有帮助?我很好奇,因为看起来你正在寻找的答案可能不一定能满足你的需求。 (此外,16分制通常比大多数人需要的规模大得多;人们很少区分这么多分数,并倾向于围绕一组精选答案聚集他们的答案。)
您链接的概念将平均值拉向网站的均值;你的意思只是将自己拉向最常见的反应。通常情况下,如果您使用平均值并希望对响应进行加权,则可以根据受访者的某些内容进行加权(更多地考虑来自知识渊博的人,更频繁访问网站的人或其他类似事件的响应)。
您也可以考虑使用平均分数以外的计算,也可以考虑前N个百分比(给出前N个难度等级的受访者百分比)。
否则,你的平均值的公式是sum(response * count * count)/ sum(count * count)...
select sum(response*ct*ct)/sum(ct*ct) from
( select response, count(response) as ct from your_table group by response) data
如果语法不准确,请道歉,我没有工作中的MySQL。
请注意,您可能必须将ints的总和转换为浮点数;不确定在MySQL中究竟是如何工作的。在SQL Server中,您必须转换其中一个总和,以便它理解您不需要整数均值。