Вы можете использовать теорию выбросов для обнаружения аномалий.Очень наивный способ искать выбросы - использовать расстояние махаланобиса .Это мера, которая учитывает разброс ваших данных и вычисляет относительное расстояние от центра.Это можно интерпретировать как количество стандартных отклонений статьи от центра.Это, однако, также включает в себя действительно очень популярные статьи, но дает вам первое указание на то, что что-то странное.
Второй, более общий подход - построение модели.Вы можете регрессировать переменные, которыми могут манипулировать пользователи, против переменных, связанных с редакторами.Можно было бы ожидать, что пользователи и редакторы согласятся до некоторой степени.Если они этого не делают, то это опять-таки признак того, что что-то странное.
В обоих случаях вам нужно будет определить некоторый порог и попытаться найти вес, основанный на этом.Возможный подход заключается в использовании расстояния махаланобиса с квадратным корнем в качестве обратного веса.Если вы находитесь далеко от центра, ваш счет будет понижен.То же самое можно сделать, используя остатки из модели.Здесь вы можете даже принять знак во внимание.Если оценка редактора ниже ожидаемой на основании оценки пользователя, остаток будет отрицательным.если оценка редактора выше, чем можно было бы ожидать, основываясь на оценке пользователя, остаток будет положительным, и очень маловероятно, что статья станет игровой.Это позволяет вам определить некоторые правила для пересчета заданных баллов.
Пример в R:
Код:
#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)