【问题标题】:Weighted Mean加权平均数
【发布时间】:2010-09-21 20:05:38
【问题描述】:

我有一个现有的网络应用程序,它允许用户根据难度对项目进行“评分”。 (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 或两者兼而有之,我尝试从算术平均值中获取:

(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

【问题讨论】:

  • 一个问题需要一个问号,你的在哪里?

标签: php mysql statistics


【解决方案1】:

这是一个关于如何在 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 秒)

【讨论】:

  • 难道不是 sum(vote) / count(*) 吗? 5+5+5+5+4 = 24. 24 / 5 票 = 4.8
  • 确实如此。我只是把公式翻译成 SQL :-)
  • 但他计算的不是简单的平均值。请记住,在他的示例中只有三票。
  • 没错,我很困惑,就像通常发生的那样。固定
  • 非常感谢。最终查询: select sum(vt)/sum(cnt) FROM (select count(vote) as cnt,vote*count(vote) as vt from votes group by vote) a; (附加了一个动态的“where section_id=$id”)。
【解决方案2】:

是什么清楚地表明加权会更合适?您在算术平均值中看到什么对您没有帮助?我很好奇,因为您正在寻找的答案似乎不一定能最好地满足您的需求。 (此外,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 中,您必须转换总和之一,以便它了解您不需要积分平均值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2011-08-04
    相关资源
    最近更新 更多