Algorithm 确定上周、月份和年度最流行文章的算法?

Algorithm 确定上周、月份和年度最流行文章的算法?,algorithm,math,sorting,statistics,Algorithm,Math,Sorting,Statistics,我正在做一个项目,我需要根据用户提交的文章的受欢迎程度(上周、上月和去年)对它们进行排序 我考虑这个问题已经有一段时间了,但我不是一个优秀的统计师,所以我想我可以在这里得到一些信息 以下是可用的变量: 这篇文章最初发表的时间[日期] 时间[日期]编辑推荐的文章(如果有) 文章从用户处获得的票数(总票数,上周、上月、去年) 文章被浏览的次数(总数,上周,上月,去年) 用户下载文章的次数(总数,上周,上月,去年) 对文章的评论(总计,上周,上月,去年) 用户将文章保存到阅读列表的次数(总计,上周、

我正在做一个项目,我需要根据用户提交的文章的受欢迎程度(上周、上月和去年)对它们进行排序

我考虑这个问题已经有一段时间了,但我不是一个优秀的统计师,所以我想我可以在这里得到一些信息

以下是可用的变量:

  • 这篇文章最初发表的时间[日期]
  • 时间[日期]编辑推荐的文章(如果有)
  • 文章从用户处获得的票数(总票数,上周、上月、去年)
  • 文章被浏览的次数(总数,上周,上月,去年)
  • 用户下载文章的次数(总数,上周,上月,去年)
  • 对文章的评论(总计,上周,上月,去年)
  • 用户将文章保存到阅读列表的次数(总计,上周、上月、去年)
  • 这篇文章被列入“我们所能提供的最佳服务”(社论)名单的次数(总数,上周、上月、去年)
  • 时间[日期]这篇文章被称为“本周最佳文章”(如果是的话)
现在我正在对每个变量进行加权,然后除以它被读取的次数。这几乎是我读了这本书后所能想到的。我最大的问题是,有些用户文章总是在流行列表的顶部。可能是因为作者“作弊”

我想强调这篇文章相对较新的重要性,但我不想仅仅因为有点旧就“惩罚”那些真正受欢迎的文章

有谁比我更善于统计的人愿意帮助我吗


谢谢

有很多方法可以做到这一点,而什么对你有效将取决于你的实际数据集以及你对特定文章的期望结果。不过,作为一个粗略的修改,我建议将阅读时间移到加权数字,然后除以文章的年龄,因为文章越老,每个类别中的数字越可能越高

比如说

// x[i] = any given variable above
// w[i] = weighting for that variable
// age = days since published OR 
//      days since editor recommendation OR 
//      average of both OR 
//      ...
score = (x[1]w[1] + ... + x[n]w[n])/age
你想更多地宣传新文章,但又不想惩罚真正受欢迎的老文章,这个问题需要考虑如何判断一篇文章是否真正受欢迎。然后,只需使用“真实性”算法对投票或视图进行加权,而不是静态加权。您还可以将任何其他权重更改为函数而不是常量,然后为您希望的任何变量设置非线性权重

// Fw = some non-linear function
// (possibly multi-variable) that calculates
// a sub-score for the given variable(s)  
score = (Fw1(x[1]) + ... + FwN(x[n]))/FwAge(age)

我认为加权平均法是一种很好的方法。但我认为有两件事你需要解决

  • 如何衡量标准
  • 如何防止系统“游戏化”
  • 如何衡量标准 这个问题属于法律范畴。你的方法是正确的。在任何计算决策过程中,对标准进行排序通常是过程中最困难的部分。我建议你采取两两比较的方式:你认为每个标准与其他标准相比有多重要?为自己构建一个如下表:

        c1     c2    c3   ...
    
    c1  1      4      2
    
    c2  1/4    1     1/2
    
    c3  1/2    2      1
    
    ...
    
    这表明C1的重要性是C2的4倍,C2的重要性是C3的一半。使用有限的权重池,比如说1.0,因为这很容易。将其分布在我们拥有的标准上
    4*C1+2*C3+C2=1
    或大致
    C1=4/7
    C3=2/7
    C2=1/7
    。如果出现差异(例如,如果您认为
    C1=2*C2=3*C3
    ,但
    C3=2*C2
    ),这是一个很好的错误指示:这意味着您与您的相对排名不一致,因此请返回并重新检查它们。我忘记了这个程序的名称,这里的评论会很有帮助。这些都有很好的记录

    在这一点上,你可能觉得这一切都有点武断。它们大部分都是你自己想出来的数字。因此,我建议从30篇文章中抽取样本,按照“你的直觉”所说的顺序对它们进行排序(通常你的直觉比数字更直观)。对数字进行欺骗,直到它们产生与顺序相近的结果

    防止赌博
    这是第二个重要方面。无论你使用什么系统,如果你不能阻止“作弊”,它最终会失败。您需要能够限制投票(IP是否应该能够两次推荐故事?)。你需要能够防止垃圾评论。标准越重要,你就越需要防止它被玩弄。

    你可以使用离群值理论来检测异常。查找异常值的一种非常简单的方法是使用。这是一种考虑数据传播的度量,并计算与中心的相对距离。它可以解释为文章偏离中心的标准差有多少。然而,这也将包括真正非常流行的文章,但它给你一个第一个迹象,有些东西是奇怪的

    第二种更通用的方法是构建模型。您可以将用户可以操纵的变量与编辑器相关的变量进行回归。用户和编辑会在某种程度上达成一致。如果他们不这样做,那么这再次表明有些事情很奇怪

    在这两种情况下,您都需要定义一些treshold,并尝试在此基础上找到一些权重。一种可能的方法是使用平方根马氏距离作为逆权重。如果你远离中心,你的分数会被拉低。使用模型中的残差也可以做到这一点。在这里,你甚至可以考虑这个标志。如果编辑分数低于预期的分数
    #Test data frame generated at random
    test <- data.frame(
      quoted = rpois(100,12),
      seen = rbinom(100,60,0.3),
      download = rbinom(100,30,0.3)
    )
    #Create some link between user-vars and editorial
    test <- within(test,{
      editorial = round((quoted+seen+download)/10+rpois(100,1))
    })
    #add two test cases
    test[101,]<-c(20,18,13,0) #bad article, hyped by few spammers
    test[102,]<-c(20,18,13,8) # genuinely good article
    
    # mahalanobis distances
    mah <- mahalanobis(test,colMeans(test),cov(test))
    # simple linear modelling
    mod <- lm(editorial~quoted*seen*download,data=test)
    
    # the plots
    op <- par(mfrow=c(1,2))
    hist(mah,breaks=20,col="grey",main="Mahalanobis distance")
    points(mah[101],0,col="red",pch=19)
    points(mah[102],0,,col="darkgreen",pch=19)
    legend("topright",legend=c("high rated by editors","gamed"),
      pch=19,col=c("darkgreen","red"))
    
    hist(resid(mod),breaks=20,col="grey",main="Residuals model",xlim=c(-6,4))
    points(resid(mod)[101],0,col="red",pch=19)
    points(resid(mod)[102],0,,col="darkgreen",pch=19)
    
    par(op)