【问题标题】:Calculate estimated mathematical expectation of ranking data?计算排名数据的估计数学期望?
【发布时间】:2011-11-04 09:41:38
【问题描述】:

我必须按应用下载次数对“最受欢迎的应用 RSS”进行排序。问题来了:

假设有 1,000 个应用程序。

RSS 数据列出了每个应用类别的前 100 个应用。

RSS 数据还提供前 100 名应用列表,不分类别。

RSS按每个应用的下载次数排序,但具体下载次数未知。

每个应用程序都有两个已知属性:类别及其在 RSS 排名中的位置。

现在我想按估计的下载次数对所有 1,000 个应用程序进行排序。

排序不需要很准确,统计上来说最可能就可以了。

如何实现这种排序算法? TIA。

【问题讨论】:

  • 一个应用可以属于多个类别吗?
  • @amit,让我们简单点,一个应用只有一个类别。

标签: algorithm math sorting


【解决方案1】:

如下构建有向图:

  1. 每个应用程序都是一个节点。
  2. 如果应用 X 在任何列表中的排名高于应用 Y,则添加一条从 X 指向 Y 的边。注意:实际上,如果 X 在任何列表中的排名比 Y 高一个,您实际上只需要添加一条边。
  3. 类别列表中排名第一的某些项目可能不会出现在总排名列表中。在这种情况下,我会将指向总列表中排名最低的项目的边添加到这些项目中的每一个,以使图形连接起来。

然后,在构造图上执行topological sort。生成的排序将保证与每个单独的前 100 名列表兼容。

即使应用出现在多个类别列表中,这种方法也可以工作 - 假设类别列表相互一致(例如:根据总下载量而不是根据类别下载量进行排名)。例如,如果您曾经遇到过 X 在一个列表中的排名高于 Y 但 Y 在另一个列表中的排名高于 X 的情况,那么这将不会真正起作用(我不确定会怎样)。

如果没有更多信息(例如:某种概率模型),我无法真正解释“从统计上讲最有可能”的真正含义。

【讨论】:

  • 谢谢伙计,这看起来很陡峭!你能给我一些伪代码以便更好地理解吗?
  • 维基百科页面上有伪代码。至于实现,有一个名为“tsort”的Unix命令可以做到这一点。
【解决方案2】:

一种简单的方法是使用整体前 100 名来确定从哪个类别中获取下一个应用。

在伪代码中:

While (not finished) 
  i++
  category = Overall_list(i).getCategory()
  Overall_list.add(get next app from list for category)
end while

所有没有进入前 100 名的类别将最后添加。

【讨论】:

    【解决方案3】:

    你可以这样处理:(我假设每个应用只属于一个类别)

    假设您对每个类别 C1 ..C10 有以下排名

    C1             C2    ...             C10
    
    app1-1       app2-1
    
    app1-2       &pp2-2
    
    ..           ...
    
    app1-100     app2-100              app10-100
    

    总体 100 大热门应用分类(例如):

    C  app1-1  app1-2  app2 -1  ... app2-10  
    

    现在使用这两个表,首先您需要按照与列表 C 中出现的 app1-1 到 app10-1 相同的顺序对 C1 到 C10 进行排序,这样您就“知道”(更像是猜测)什么是 Category在排名方面更为重要。

    然后使用此信息对其余部分进行排序。


    现在我将使用一个更简单的示例来展示如何对其余元素进行排序。

    让我们选取 3 个类别和 12 个应用。

    C1      C2      C3
    
    app1    app21   app31   
    
    app2    app22   app32
    
    app3    app23   app33
    
    app4    app24   app34
    

    C = app1 app2 app21 app31

    1.先标记表中C中的所有元素:

    app1    app21 ->app31   
     |   /
    app2    app22   app32
    
    app3    app23   app33
    
    app4    app24   app34
    

    2.秒,对剩余元素进行排序

    由于您没有更多信息,一个很好的近似值是从左到右查看每一行(从较大的排名顶部列表到较小的排名顶部列表),这给出:

    app3 app22 app32 app4 app23 app33 app24 app34
    

    那么总体分类是:

    app1 app2 app21 app31 app3 app22 app32 app4 app23 app33 app24 app34
    

    我希望这个例子能让我的想法更清晰,并能有所帮助。

    我认为这种方法使用了 C1 ...C10 和 C 中的所有信息。

    【讨论】:

    • 谢谢,但是如何确定C1、C2、C3等的迭代顺序呢?在您的示例中,只是按任意顺序?
    • @λq_,顺序将取决于主类中app1 app21和app31的出现顺序:见我帖子中的这句话:“现在使用这2个表,首先你需要顺序C1 C10 以 app1-1 到 app10-1 的顺序出现在 C 中,所以你“知道”(更像是猜测)哪个 Category 在排名方面更重要。”
    • @λq_,这是我在示例的第一部分所做的。 (我只是按正确的顺序选择了 C1、C2、C3,但如果 C 是 app21 app11 app31 app22 我会订购它们 C2 C1 C3 )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2013-10-01
    • 1970-01-01
    相关资源
    最近更新 更多