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)