带有业力的加权投票系统

时间:2010-10-22 09:15:01

标签: php algorithm voting

这个问题比目前的编程更具逻辑性。一旦我理解了我需要使用的算法,我将研究如何实现它。

我有一个数据库中的项目列表,需要由用户投票或关闭以确定它们是否正确。目的是为每个项目提供%,以显示项目信息的可靠性。

需要考虑一些标准..

  • 投票不是绝对的 - 每个用户的投票权重取决于他们的业力。
  • 用户业力应该根据他们的投票来计算 - 例如,如果用户提交了一个项目而其他用户投票确认它是正确的,则该用户的业力会增加。如果用户投票选择与其他具有高业力的用户投票的方向相同的项目,也可以给予业力。如果他们与其他具有高业力的用户投反对票,他们的投票将被视为不正确,虽然它会降低该项目的得分,但也会降低他们的业力水平,使他们在未来的投票中影响力较小。
  • 用户可以投反对票和正投票。
  • 项目的计算分数应考虑项目的年龄(随着时间的推移,分数会因项目变得不太可靠而降低)。

有没有人对这样做的最佳算法有任何建议,或者有关如何用编程语言(如PHP)实现这一点的任何提示?

2 个答案:

答案 0 :(得分:6)

首先阅读:http://www.evanmiller.org/how-not-to-sort-by-average-rating.html

这是对伯努利参数的 Wilson得分置信区间的数学概念的介绍。

这篇文章是一篇很好的入门读物,介绍如何使用用户的投票来计算实际有用的分数数学上合理的分数。这样做,你已经领先于Amazon.com

然后,我想你可能需要调整一下这个公式。在该公式中,它使用 p 作为正投票的分数。您可能需要更新 p 的公式,以反映投票的用户的业力。

最后,考虑到年龄,您可以将公式的结果乘以年龄乘数。例如,如果您希望结果与其年龄的每一天相关性降低1%,则将其乘以 0.99 ^ age_in_days

简而言之,这就是我要遵循的道路。希望这会有所帮助。

答案 1 :(得分:1)

我假设你的计算你只考虑项目的业力,你只考虑早期选民在投票时的业力,而不是他们目前的业力(自那以后可能已经改变),因为这将导致递归可能涉及所有项目和所有用户的功能 另一个假设是,业力确实是绝对的,但是在进行新的投票时会重新计算,因为投票的频率低于观点。
我会存储所有用户的所有投票,投票时的业力以及每个项目的投票方向。
最后的假设:你在投票后但在一定的时间跨度之后不会向提交者添加业力。如果你马上添加它,那么submiters karma会经常上升/下降并导致系统中出现大量抖动。 如果你得到一个新的投票,我首先计算该项目的新业力,然后根据项目的绝对业力变化将业力添加到用户:

项目的业力是所有投票用户的业力之和:例如,你有三张选票:一个上升50个业力,一个上升150个业力,一个下来30个业力。这将导致总业力为170.因此该项目的业力为+170 一旦新用户投票,您将考虑新投票重新计算项目的业力:(前一个示例)新用户以10业力进行投票。该项目的新业力是+180。 项目的新旧业力的差异是用户获得的业力:(前一个示例)用户的投票将项目的业力改变了+10,因此用户获得+10业力(用于未来投票)。这个想法的缺点是,高业力用户非常快地获得新的业力,所以你可能应该在这里添加一些限制faktors(如对数)来正确地扩展它。 由于您也想考虑项目的年龄,您可以将获得的业力点乘以一个因子,具体取决于年龄(例如,如果项目年龄超过5天,则用户根本不会获得任何业力:5天 - 投票的时间跨度乘以改变的业力值。

这当然是您想要实施的系统的非常模糊的草稿,我不知道它是否符合您的想法。它可能会被修改以添加其他因素:
你可以确定%相关性:(绝对的职业业力/绝对负面业力):低于1的值有更多负面的血管,然后是积极的业力,反之亦然。但是对于一个可靠的%值,你需要一些价值来比较我的意见(无论是常数还是其他方式)。