1

我有一个现有的网络应用程序,允许用户根据难度对项目进行“评分”。(0 到 15)。目前,我只是取每个用户意见的平均值,并直接从 MySQL 中呈现平均值。但是,我(和我的用户)越来越清楚,对数字进行加权会更合适。

奇怪的是,几个小时的谷歌搜索并没有出现太多。我确实找到了两篇文章,它们显示了基于“贝叶斯过滤器”(我部分理解)的站点范围的评级系统。 是一个例子:

公式为:

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 或两者兼而有之,我尝试从算术平均值中获取:

(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
4

2 回答 2

5

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

mysql> 创建表投票(投票 int);
查询正常,0 行受影响(0.01 秒)

mysql> 插入投票值 (5),(5),(4);
查询正常,3 行受影响(0.00 秒)
记录:3 重复:0 警告:0

mysql> 从投票中选择 *;
+------+
| 投票 |
+------+
| 5 |
| 5 |
| 4 |
+------+
3 行一组(0.00 秒)

mysql> select vote,count(vote),vote*count(vote) from votes group by vote;
+------+-------------+------------------+
| 投票 | 计数(投票)| 投票*计数(投票) |
+------+-------------+------------------+
| 4 | 1 | 4 |
| 5 | 4 | 20 |
+------+-------------+------------------+
2 行(0.00 秒)

mysql> 选择 sum(vt)/sum(cnt) FROM (选择
count(vote)*count(vote) as cnt,vote*count(vote)*count(vote)
作为 vt 从投票组投票)a;
+------------------+
| 总和(vt)/总和(cnt) |
+------------------+
| 4.8000 |
+------------------+
一组中的 1 行(0.00 秒)


于 2008-11-11T16:41:11.060 回答
0

是什么清楚地表明加权会更合适?您在算术平均值中看到什么对您没有帮助?我很好奇,因为您正在寻找的答案似乎不一定能最好地满足您的需求。(此外,16 分制的量表通常比大多数人需要的量表大得多;人们很少区分这么多分,并且倾向于将他们的回答集中在一组选定的答案上。)

您链接到的概念将平均值拉向站点的平均值;你的意思只是把自己拉向最常见的反应。通常,如果您使用平均值并希望对回复进行加权,您会根据受访者的一些情况来这样做(更多地关注更多知识渊博的人、更频繁访问该网站的人或其他类似情况的回复)。

您也可以考虑使用除平均分数之外的计算,也许是 top-N-box 百分比(给出前 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。

请注意,您可能必须将总和从整数转换为浮点数;不确定这在 MySQL 中是如何工作的。在 SQL Server 中,您必须转换总和之一,以便它了解您不需要积分平均值。

于 2008-11-11T17:07:57.400 回答