使用多个来源规范化成就

时间:2009-07-13 10:45:21

标签: normalization achievements game-theory

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

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

基本上:

Achievement :
    owner = Alias
    points = int

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

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

  1. 假设所有用户都是诚实的,但他们只是难以区分。我该如何规范点值? AKA一个用户为每个简单的成就提供5个点,而另一个用户给出10个点,我如何将它们标准化为一个值。目标是分配点,其中点与难度成正比。
  2. 如果一个用户不擅长判断点值,我怎样才能根据获得成就的用户数量找出难度?
  3. 假设用户可能主要被划分为不相交的组,其中一个用户将一组其他的成就。这有助于前两种算法吗?例如,用户A仅向以奇数结尾的用户提供成就,而用户B仅向以偶数结尾的用户提供成就。
  4. 如果每个人都是恶意的,我有多接近让用户无法夸大他们的积分值?
  5. 注意:赠送用户的质量与他收到的成就无关。许多提供者只是机器人,他们自己没有收到任何东西,但会自动奖励用户做某些行为。

    我目前的计划是这样的。我有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]

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

3 个答案:

答案 0 :(得分:0)

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

  1. 识别诚实用户
  2. 推广他们的行动
  3. 通常,我们通过他们的行为来识别诚实用户:那些在网站上存在很长时间并且已经过其他用户审核的帐户,以及您。堆栈溢出使用信誉得分,slashdot使用业力点。

    一旦您确定了这些诚实用户,那么您可以按照声誉得分的比例计算他们的投票数:用户看起来越诚实,我们就越相信他的成就。

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

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

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

答案 1 :(得分:0)

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

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-score作为成就价值的内部表示。因人而异。 :)

答案 2 :(得分:0)

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

理想情况下,每个人都会以相同的比例为他们的成就分配点数。愚蠢或琐碎成就的一点,适度成就十点,真正史诗成就50点,等等。但是在分配分数时,人们的行为却截然不同。有些人会非常慷慨,并使每项成就都达到最大。其他人将严格准确,严格遵守与成就难度相关的规模。其他人可能认为人们担心积分是愚蠢的,并为他们创造的所有成就分配最低价值。

标准化试图处理这些个体异常并使每个人的评级达到相同的等级。这就像他们对奥运会评委的得分一样。您不会“盲目地信任”用户为成就分配的价值,但如果它是系统的一部分,那么您需要考虑这些价值。否则你可能只是硬编码成就的点值,限制它们的创建频率,听起来这样可以遏制最严重的滥用。但是得分很有用,因为在规范化之后,你可以弄清楚成就的价值,如果它是由一个刻板的普通用户创造的。这使得人们难以“游戏”系统,因为他们从平均值和成就分布中得到的越多,他们自己的价值就越准确地回归到基线。

我应该提一下,我不是一名受过专业训练的程序员,而且我从未参加过统计课或任何更高的数学课程。由于我自己的理解限制,也许我不是解释这一点的最佳人选。但是我一直在自己的网站上遇到类似的问题(用户对用户评级),并且在尝试了很多方法后,这个问题似乎是最有希望的。实施的大部分灵感来自http://www.ericdigests.org/2003-4/score-normilization.html,所以你也可以阅读它。