【问题标题】:Suggest Ranking algorithm for Multi User Sortable Lists建议多用户可排序列表的排名算法
【发布时间】:2012-01-13 16:13:26
【问题描述】:

我正在构建一个网站,让用户能够通过拖放来订购项目列表,从而根据他们的“个人观点”对它们进行排名。他们可以选择移除某个项目以将其隐藏在“个人视图”中。

我的问题是如何公平地实施排名算法来确定不惩罚新项目的共享视图的项目排序。

如果它也可以用于对新项目在用户个人列表中的显示位置进行排名,这也会有所帮助。

因此,如果出现了一个被其他用户高排名的新项目,我们可以将其显示在我们预测用户会根据他们的其他排名对其进行排名的位置。

我最初的想法是给用户排名的每个项目加分=在用户排名列表中的位置。 (例如,如果有 10 个项目,则给排名 1 10 分、2 9 分等,对于用户隐藏的项目给予负分)。共享视图将根据总分进行排序。但这对于基本上没有排名的新项目并不适用,并且不会轻易提升阶梯。

那么对于可以预测新项目的公平算法有什么想法吗?

【问题讨论】:

  • Ravloony 的评论让我对这个问题有了更好的思考,这是我认为可行的算法。当用户对列表进行排序时,给每个项目一个分数 = 项目数 + 1 - 在列表中的排名 / 项目数。 (3 个中的 1 个 = 1、3 个中的 2 个 = .667、5 个中的 2 个 = .8)。项目分数是所有用户分数的平均值。因此,随着更多项目的添加,排名更高的新项目将浮到顶部。这通常应该有效,但会使新条目很容易以很少的评级获得高排名。关于如何将排名数量添加到权重的任何想法?

标签: algorithm math ranking


【解决方案1】:

所以我认为我有一个可行的解决方案。通过将我在问题评论中提到的方法与Wilson's score confidence interval for a Bernoulli parameter 的下限结合起来,分数似乎符合我的预期。

因此,从我的评论中重新讨论该方法:用户项目分数 = 项目数 + 1 - 在列表中的排名/项目数。 (3 个中的 1 个 = 1,3 个中的 2 个 = .667,5 个中的 2 个 = .8)。

为了给出一个项目的总分,我插入了威尔逊公式: (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/ n)

其中 phat = 平均分,n 是排名数,z=1.96(对于 95% 置信度排名)。

我在 Excel 中模拟了一些数据,并尝试了不同的场景并喜欢结果。将转向实施。感谢您的帮助

【讨论】:

  • 你能详细说明你的Z是什么意思吗?!
【解决方案2】:

如何实现类似于 9gag 排名系统的东西。您可以有一个显示最高排名项目的共享页面和一个投票页面,用户可以在其中查看新项目并相应地对它们进行排名。

【讨论】:

  • 不要认为这种方法适合。该站点将有多个主题,每个主题都可以有一个可以添加到的项目列表。此页面将使用 jquery 可排序项来允许用户以任何他们喜欢的方式为他们的“个人”视图排序列表,但他们可以切换到共享视图或新视图。即使对于个人视图,我也想预测新项目的放置位置,因为这将是之前对项目进行排序的用户的默认视图。
【解决方案3】:

我认为这里的重点是查看其他用户对其他项目的排名。

“这个项目通常排名第三”是没有用的,我认为,而“考虑中的项目(我们称之为 A)大多数时候排名优于项目 B”是,因为它允许您为正在考虑的项目列表创建(可能是模糊的)排序。

本质上,对于用户列表中的新项目,您将实现一种插入排序,其中两个元素的比较取决于它们在其他人列表中的平均顺序。事实上,任何排序算法都可以工作,只要它依赖于两个给定元素之间的顺序。

【讨论】:

  • 那么这是否意味着我可以计算该项目的分数,通过获取项目排名的平均排名(6 分中的 3 分与 10 分中的 2 分),并使用它来确定如何它与其他可能有更多排名的项目叠加?
  • 嗯,我的意思是,当您比较每对项目时,您会计算出其他用户是否通常将其中一项排名高于另一项。但事实上,这可能会变得过于昂贵。但是,考虑到系统是动态的,计算每个元素的分数也很困难,因此您必须在很多时候重新计算很多分数。
【解决方案4】:

这是 node.js 中伯努利参数的 Wilson 得分置信区间

wilson.normaldist = function(qn) {
    var b = [1.570796288, 0.03706987906, -0.0008364353589, -0.0002250947176, 0.000006841218299, 0.000005824238515, -0.00000104527497, 0.00000008360937017, -0.000000003231081277, 0.00000000003657763036, 0.0000000000006936233982];
    if (qn < 0.0 || 1.0 < qn) return 0;
    if (qn == 0.5) return 0;
    var w1 = qn;
    if (qn > 0.5) w1 = 1.0 - w1;
    var w3 = -Math.log(4.0 * w1 * (1.0 - w1));
    w1 = b[0];

    function loop(i) {
        w1 += b[i] * Math.pow(w3, i);
        if (i < b.length - 1) loop(++i);
    };
    loop(1);
    if (qn > 0.5) return Math.sqrt(w1 * w3);
    else return -Math.sqrt(w1 * w3);
}

wilson.rank = function(up_votes, down_votes) {
    var confidence = 0.95;
    var pos = up_votes;
    var n = up_votes + down_votes;
    if (n == 0) return 0;
    var z = this.normaldist(1 - (1 - confidence) / 2);
    var phat = 1.0 * pos / n;
    return ((phat + z * z / (2 * n) - z * Math.sqrt((phat * (1 - phat) + z * z / (4 * n)) / n)) / (1 + z * z / n)) * 10000;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2020-11-15
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多