【问题标题】:Normalizing achievements with multiple sources标准化具有多个来源的成就
【发布时间】:2010-11-10 06:22:45
【问题描述】:

我正在寻找一个好的算法推荐。

我有用户和成就。用户创建成就,然后将其提供给其他用户。与每个成就相关联的是用户指定的点值。用户的总分是他们所有成就的总和。

基本上:

Achievement :
    owner = Alias
    points = int

User :
    achievements = list(Achievement)
    def points() :
        sum([achievements.points])

好的,所以这个系统显然非常适合游戏。您可以创建许多帐户并为彼此取得大量成就。我试图通过将点值缩放到与用户指定的不同的值来减少一点。

  1. 假设所有用户都是诚实的,但他们只是很难以不同的方式衡量。我应该如何标准化点值? AKA 一个用户为每个简单的成就给出 5 分,另一个给出 10 分,我怎样才能将它们标准化为一个值。目标是分数与难度成正比的分布。
  2. 如果某位用户不擅长判断分值,如何根据获得成就的用户数判断难度?
  3. 假设用户可以大部分被划分为不相交的组,其中一个用户将成就授予一整套其他用户。这对前两种算法有帮助吗?例如,用户 A 仅向以奇数结尾的用户授予成就,而用户 B 仅向以偶数结尾的用户授予成就。
  4. 如果每个人都是恶意的,我还能让用户无法过度夸大他们的积分值吗?

注意:给予用户的质量与他获得多少成就没有任何关系。许多给予者只是机器人,它们自己没有收到任何东西,但会自动奖励用户执行某些操作。

我目前的计划是这样的。我有一个从我那里获得成就的人分配 10 分。如果我总共给 55 人发放了 10 个成就,我的分配是 550。然后根据获得它的人数分配给每个成就。如果分布是[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 获得每个成就的人,那么点值将是[50, 25, 16.6, 12.5, 10, 8.3, 7.1, 6.25, 5.5, 5]

欢迎和赞赏我的方法和替代建议的任何问题。另外,发布其他您能想到的我错过的案例,我会将它们添加到列表中。谢谢!

【问题讨论】:

    标签: normalization achievements game-theory


    【解决方案1】:

    我认为在您的系统中,如在 stackoverflow、digg、slashdot 等中,您的基本目标是

    1. 识别诚实用户
    2. 宣传他们的行动

    通常,我们通过他们的行为来识别诚实的用户:那些在网站上存在很长时间并且已经过其他用户和您的审查的帐户。堆栈溢出使用信誉分数,slashdot 使用业力点。

    一旦您识别出这些诚实的用户,您就可以让他们的选票与信誉得分成正比:用户越诚实,我们似乎就越信任他的成就。

    因此,您可以为新帐户提供 10 的初始分数。然后,该用户可以提供他想要的任意数量的成就,但它们的实际总价值将是 10(就像您建议的比例分配一样)。也就是说,如果一个新用户给出了 100 个成就(所有的分数都相同),那么每个成就的价值都是 0.1 分,因为他的分数是 10。然后,当该用户从其他用户那里获得成就时,他的分数就会增加。

    基本上,我建议您使用pagerank,但不是对网页进行排名,而是对用户进行排名,而不是超链接,链接是该用户给予他人的成就。

    这是解决此问题的一种方法。还有很多其他的。这取决于您的具体需求。拍卖总是很有趣。您可以让每个人在实际实现之前对成就进行竞标,以确定社区对该成就的价格(分数)。您需要限制人们拥有的“金钱”数量。

    【讨论】:

    • 感谢您的回复。我很想完成页面排名方法,但我的许多用户只是“机器人”,他们自己实际上并没有取得任何成就。人们构建了这些机器人,但并不总是同意“10 分”意味着什么是简单的。我宁愿避免对成就进行明确的竞标,而让隐含的特征创造价值,因为我还不知道我对社区的信任程度。鉴于此,我的算法是“最好”的方法吗?
    • 我对你的描述感到困惑。即,当你说“我有一个从我那里获得成就的人分配 10 分”。 “我”是指您,网站的所有者,还是指在网站上拥有帐户的任何人?
    • 对不起,me 是给予成就的人。网站上的任何人都可以给他们。在帖子中改写。
    【解决方案2】:

    我在自己的网站上一直在努力解决此类问题。如果您有大量现有数据可以用作基线,那么分数标准化似乎非常有效。首先获取用户创建的成就的平均值和标准差:

    SELECT AVG(Points) AS user_average, 
    STDDEV_POP(Points) AS user_stddev
    FROM Achievements WHERE Owner = X
    

    使用这些值来计算上下文无关的“z-score”:

    $zscore = ($rating - $user_average) / $user_stddev;
    

    获取所有成就的均值和标准差:

    SELECT AVG(Points) AS all_average, 
    STDDEV_POP(Points) AS all_stddev 
    FROM Achievements
    

    使用这些值创建一个标准化的“t-score”:

    $tscore = $all_average + ($all_stddev * $zscore);
    

    然后使用 t 分数作为成就价值的内部表示。 YMMV。 :)

    【讨论】:

    • 有趣...您的输入是 $rating 而输出是 $tscore 对吗?我想知道的是,您为什么完全信任用户的评级?看来语料库信息更多,不会说谎。
    • 由于评论长度限制,请参阅我的回复作为单独的答案。我是新来的,也许我用错了网站?
    【解决方案3】:

    正确,$rating 是输入,$tscore 是标准化输出。

    理想情况下,每个人都会以相同的比例为他们的成就分配分数。愚蠢或琐碎的成就得 1 分,普通成就得 10 分,真正史诗般的成就得 50 分,等等。但是在分配分数时,人们有非常不同的行为。有些人会非常慷慨,并让每一项成就都物有所值。其他人将严格和准确,严格遵守与成就难度相关的规模。其他人可能会认为人们担心积分并为他们创造的所有成就分配最低值是愚蠢的。

    规范化尝试处理这些个体异常并将每个人的评级调整到相同的规模。这就像他们在奥运会上处理评委的分数一样。您不会“盲目地信任”用户分配给某项成就的价值,但如果它是系统的一部分,您就需要考虑这一点。否则,您可能只是硬编码成就的点值,限制创建它们的频率,听起来这会遏制最严重的滥用。但是分数很有用,因为在标准化之后,您可以计算出成就的价值如果它是由典型的普通用户创建的。这使得人们很难“玩弄”这个系统,因为他们离成就的平均值和分布越远,他们自己的价值观就越能回归基线。

    我应该提一下,我不是受过专业训练的程序员,而且我从未上过统计课或任何高等数学。由于我自己理解的局限,也许我不是解释这一点的最佳人选。但是我在自己的网站上一直在努力解决类似的问题(用户对用户的评级),在尝试了多种方法之后,这似乎是最有希望的。实现的大部分灵感来自http://www.ericdigests.org/2003-4/score-normilization.html,因此您可能也想阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 2012-09-30
      • 2013-05-30
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多