4

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

我在数据库中有一个项目列表,需要用户投票赞成或反对,以确定它们是否正确。目的是为每个项目提供一个百分比,以显示项目信息的可靠性。

有几个标准要考虑..

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

是否有人对执行此操作的最佳算法有任何建议,或者有关如何在编程语言(例如 PHP)中实现此功能的任何提示?

4

2 回答 2

7

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

这是对称为伯努利参数的威尔逊分数置信区间的数学概念的介绍。

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

然后,我认为您可能需要稍微调整一下该公式。在该公式中,它使用p表示正票的比例。您可能需要更新p的公式,以反映投票用户的业力。

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

简而言之,这就是我要走的路。希望这可以帮助。

于 2010-10-22T10:02:41.563 回答
1

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

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

这当然是您要实施的系统的非常模糊的草案,我不知道它是否符合您的想法。可能也可以对其进行修改以添加其他因素:
您可以确定与以下因素的百分比相关性:(绝对正业力/绝对负业力):小于 1 的值具有比正业力更多的负业力,反之亦然。但是对于一个可靠的 % 值,我认为您也需要一些值来比较(无论是常数还是以其他方式计算)。

于 2010-10-22T10:01:01.443 回答