16

我不想对等级从 1 到 10 的项目进行评分,而是希望进行 1 对 1 的“战斗”。两个项目并排显示,您可以选择您更喜欢的一个。基于这些“战斗”结果,算法应该计算每个项目的评分。

您可以在Flickchart.com上看到这种方法,在该网站上使用这种方法对电影进行评级。

它看起来像这样:

截屏

如您所见,如果物品赢得“战斗”,它们会被向上推。排名总是根据“战斗”结果而变化。但这不能仅基于获胜报价(此处为 54%),因为与“泰坦尼克号”相比,与“25 小时”左右的比赛更难获胜。

有几件事对我来说很不清楚: - 收视率是如何计算的?你如何决定哪部电影在排名中排名第一?您必须考虑一个项目获胜的频率以及被击败的项目有多好。- 如何选择哪些物品有“战斗力”?

当然,您无法告诉我 Flickchart 究竟是如何做到这一切的。但也许你可以告诉我如何做到这一点。提前致谢!

4

9 回答 9

9

这可能不是 flickchart 正在做的事情,但您可以使用国际象棋(和其他运动)中使用的ELO算法的变体,因为这些本质上是他们赢/输的战斗/游戏。

基本上,所有电影都以 0 胜/负开始,每次获胜都会获得一定数量的积分。你的平均得分通常在 20 左右(但任何数字都可以),并且在与评分相同的电影中获胜将得到 20 分。在糟糕的电影中获胜可能会得到大约 10 分,而在更好的电影中获胜可能会得到给你30分。反之,输给一部好电影,你只损失 10 分,但如果你输给一部烂电影,则损失 30 分。

该算法的细节在维基百科链接中。

于 2009-12-06T16:53:19.203 回答
5

评分是如何计算的?你如何决定哪部电影在排名中排名第一?您必须考虑一个项目获胜的频率以及被击败的项目有多好。

您需要的是加权评级,也称为贝叶斯估计。

我认为IMDB 的前 250 部电影是制作排名网站的更好起点。有些电影票数超过 300,000,而其他电影票数少于 50,000。IMDB 使用贝叶斯估计对电影进行排名,而不会不公平地对流行电影进行加权。该算法在页面底部给出:

weighted rating (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C 在哪里:

  • R =电影的平均值(平均值)=(评分)
  • v =电影的票数=(票数)
  • m = 进入前 250 名所需的最低票数(目前为 3000)
  • C = 整个报告的平均投票数(目前为 6.9)

对于前 250 名,仅考虑普通选民的投票。

我不知道 IMDB 是如何选择 3000 作为他们的最低投票数的。他们本可以选择 1000 或 10000,而名单或多或少是相同的。也许他们正在使用“票房 6 周后的平均票数”,或者他们正在使用试错法。

无论如何,这并不重要。上面的公式几乎是标准化网站排名投票的标准,我几乎可以肯定 Flickrchart 在后台使用了类似的东西。

该公式效果很好,因为它将评分“拉”向平均值,因此高于平均值的评分略微降低,低于平均值的评分略微增加。然而,拉动的强度与一部电影的票数成反比。因此,票数少的电影比票数多的电影更倾向于平均水平。这里有两个数据点来证明这个属性:

Rank  Movie            Votes            Avg Rating        Weighted Rating
----  -----            -----            ----------        ---------------
219   La Strada        15,000+          8.2               8.0
221   Pirates of the   210,000+         8.0               8.0
      Caribbean 2

这两部电影的收视率都被拉低了,但对 La Strada 的影响更大,因为它的票数较少,因此不像 PotC 的收视率那样具有代表性。


对于您的具体情况,您在“战斗”中有两个项目。您可能应该按如下方式设计您的表格:

Items
-----
ItemID (pk)
FightsWon (int)
FightsEngaged (int)

平均评分为 FightsWon / FightsEngaged。加权评级使用上述公式计算。

当用户在战斗中选择获胜者时,将获胜项目的 FightsWon 字段增加 1,将两个项目的 FightsEngaged 字段增加 1。

希望这可以帮助!- 朱丽叶

于 2009-12-11T03:24:25.997 回答
2

至于 flickchart,我一直在玩弄它,我认为评级系统非常简单。在伪代码中,我的猜测是它看起来像这样:

if rank(loser) == null and rank(winner) == null
    insert loser at position estimated from global rank
    insert winner at position estimated from global rank
else if rank(winner) == null or rank(winner) < rank(loser)
    then advance winner to loser's position and demote loser and all following by 1

为什么我会这样想?首先,我完全相信他们的贝叶斯先验不是基于对我之前选择的仔细挖掘。他们似乎无法猜测,因为我喜欢绝地归来,所以我喜欢帝国反击。事实上,他们想不通,因为我看过《小鬼当家》2,所以我可能看过《小鬼当家》1。经过数百次评分,选择还没有出现。

其次,如果您查看上面的代码,您可能会发现一个小错误,您肯定会在网站上注意到。您可能会注意到,有时您会做出选择,而获胜者会滑一位。这似乎只发生在之前没有添加失败者的情况下。我的猜测是,正在发生的事情是输家的加分高于赢家。

除此之外,您会注意到排名根本不会改变,除非排名较低的电影直接击败排名较高的电影。我认为没有保留任何真实分数:该网站似乎完全没有记忆,除了每部电影的序数排名和您最近的评分。

于 2009-12-11T21:04:33.323 回答
2

一段时间以来,我自己一直在玩弄通过成对比较的方式对项目进行排名的问题,并想花时间描述一下我到目前为止提出的想法。

现在我只是简单地排序<fights won> / <total fights>,最高的在前。如果您是唯一的一个投票者,或者有很多人投票,这很好用。否则它很快就会变得不准确。

这里的一个问题是如何选择哪两个项目应该战斗。似乎确实有效的一件事(主观上)是让迄今为止战斗最少的物品与随机物品战斗。这导致项目的战斗次数相对一致(-> 准确性),代价是可能会让选民感到无聊。他们经常将最新的项目与其他项目进行比较,这有点无聊。为了缓解这种情况,您可以选择战斗次数最少的n 个项目,然后随机选择其中一个作为第一个竞争者。

你提到你想让对强对手的胜利比对弱对手更重要。正如上面其他帖子中提到的,用于国际象棋等(Elo,Glicko)的评级系统可能会起作用。就我个人而言,我喜欢使用 Microsoft 的 TrueSkill,因为它似乎是最准确的,并且还提供了一种很好的方法来选择两个项目来相互对抗——由 TrueSkill 计算得出的具有最高平局概率的项目。但是唉,我的数学理解还不够好,无法真正理解和实现系统的细节,反正可能要收授权费……

如果您需要更多信息/灵感,集体选择:竞争排名系统可以很好地概述一些不同的评级系统。

除了评分系统,您还可以尝试各种简单的梯子系统。一个例子:

  1. 随机化项目列表,因此它们的排名为 1 到 n
  2. 随机选择两个项目,让他们战斗
  3. 如果获胜者的排名高于失败者:什么都不做
  4. 如果输家排名高于赢家:
    • 如果输家直接高于赢家:交换他们
    • 否则:将获胜者向上移动x % 朝向战斗的失败者。
  5. 转到 2

这在开始时相对不稳定,但随着时间的推移应该会有所改善。但它永远不会停止波动。

希望我能帮上点忙。

于 2009-12-14T18:15:47.400 回答
1

或者您可能想使用 PageRank 的变体,请参阅prof。威尔夫的酷描述

于 2009-12-09T11:32:38.173 回答
1

经过深思熟虑,这个电影排名的最佳解决方案如下。

所需数据:

  • 每对电影的票数。
    • 还有这个数据的排序版本,像基数排序一样分组
  • 每部电影在每对电影中被投票多少次

可选数据:

  • 每部电影参与了多少次为每个用户投票

如何为用户选择一票:

  • 从最低使用基数组中的排序列表中选出一个投票选择(随机)
  • 可选:使用用户的个人投票统计数据过滤出他们被要求投票次数过多的电影,如果没有合适的,可能会转移到更高的基数桶。

如何计算一部电影的排名分数:

  • 分数从 0 开始
  • 系统内互通影片
    • 将这部电影添加voteswon / votestaken到乐谱中
      • 如果这两部电影之间没有投票,则添加 0.5 (这当然是假设您希望新电影在排名中以平均水平开始)

注意:可选的东西只是为了阻止用户感到无聊,但也可能对其他统计数据有用,特别是如果你包括他们为那部电影投票而不是另一部电影的次数。

确保新添加的电影尽快获得统计数据,并在所有现有电影中非常均匀地分配选票,这对于保持其他电影的统计数据正确至关重要。将一堆新电影错开进入系统可能是值得的,以避免排名出现暂时的故障(尽管不是立即的,也不是严重的)。

===这是原始答案===

这个问题其实很简单。我在这里假设您希望按优先顺序为电影投票,即排名第一的电影是最有可能在投票中被选中的电影。如果你做到了,在每次投票中,你完全随机选择两部电影,你可以用简单的数学计算出来。

首先,每次选择两部电影进行投票的可能性相同,因此每次投票的结果可以加在一起以获得分数(所有内容都乘以 1/nC2)。显然,有人投票支持一部特定电影反对另一部特定电影的概率是公正的votesforthisfilm / numberofvotes

因此,要计算一部电影的分数,你只需votesforthisfilm / numberofvotes将它可以匹配的每部电影相加。

如果您添加一部新电影,而该电影在所有其他电影中的票数都没有相当多,那么您可能希望将其排除在排名之外,直到获得大量票数为止。

===以下内容大多是错误的,主要是为了历史背景===

此评分方法源自您的投票系统的马尔可夫链,假设所有可能的投票问题的可能性相同。 [这第一句话是错误的,因为使所有投票问题在马尔可夫链中的可能性相同才能获得有意义的结果] 当然,情况并非如此,实际上您也可以解决此问题,因为您知道每次投票的可能性有多大问题是,这只是对该问题的投票数! [获得特定投票问题的概率实际上是无关紧要的,所以这无济于事] 通过这种方式,使用相同的图,但边通过投票加权......

考虑到每部电影被列入投票,获得每部电影的概率等于每部电影获得投票的概率除以它被列入投票的概率。这是sumoverallvotes((votesforthisfilm / numberofvotes) * numberofvotes) / totalnumberofvotes除以sumoverallvotes(numberofvotes) / totalnumberofvotes。取消了很多,这就是votesforthisfilmoverallvotes / numberofvotesinvolvingthisfilm. 这真的很简单!

于 2009-12-15T17:41:41.337 回答
0

http://en.wikipedia.org/wiki/Maximize_Affirmed_Majorities

(或者BestThing投票算法,原名VeryBlindDate投票算法

于 2009-12-10T18:38:21.790 回答
0

我相信这种 1 对 1 的场景可能是一种称为离散选择的联合分析。我在市场研究的网络调查中经常看到这些。通常要求客户在他们最喜欢的两组以上不同的功能中进行选择。不幸的是,它相当复杂(对于像我这样的非统计人员)所以你可能很难理解它。

于 2009-12-12T06:36:19.093 回答
-1

我衷心推荐这本书《集体智能编程》,以了解这些方面的各种有趣的算法和数据分析。

于 2009-12-15T15:13:00.010 回答