这个问题比目前的编程更具逻辑性。一旦我理解了我需要使用的算法,我将研究如何实现它。
我有一个数据库中的项目列表,需要由用户投票或关闭以确定它们是否正确。目的是为每个项目提供%,以显示项目信息的可靠性。
需要考虑一些标准..
有没有人对这样做的最佳算法有任何建议,或者有关如何用编程语言(如PHP)实现这一点的任何提示?
答案 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的值有更多负面的血管,然后是积极的业力,反之亦然。但是对于一个可靠的%值,你需要一些价值来比较我的意见(无论是常数还是其他方式)。