可靠地确定异常统计值的方法

机器算法验证 异常值
2022-04-18 08:51:29

我正在寻找一种统计方法来确定玩家是否在在线游戏中作弊。该游戏是一款类似 Quake3 的游戏(自我射击游戏)。

给定每个玩家的正点数和负点数(得分),并给定 n 个玩家(n<=64)。

得分是这样汇总的(从反作弊的角度来看是正/负):
正 = 玩家自己死亡的
次数 负 = 对方球队被杀死的玩家的数量


其他可用值:
t = 完成该分数的时间
c = 当前玩家人数
m = 玩家杀死同一队中某人的次数(teamkiller,如果在 15 分钟内高于 1 或 2,则为负数)

每个玩家都可以相互独立作弊。

我使用了每个玩家的标准偏差(值 v =(负+1)/(正+1),将超过 3 倍的标准偏差指定为绝对确定(100%)的作弊 - 尽管我的经验是超过在大多数情况下,单独使用 stddev 就足够了),这对单个玩家非常有效,但一旦多个玩家同时作弊,它就会惨遭失败。此外,将 3 倍 stddev 定义为 100% 的做法允许 > 100% 的概率。不幸的是,在未经过滤的游戏中作弊的玩家比例大约为 70% 到 80% 甚至更高,如果考虑到更微妙的作弊的话。

要考虑的另一件事是,如果有一群人作弊,而一个人没有作弊,则分布不再是正态分布,而是驼峰式分布。这个问题有什么有用的算法或公式吗?

2个回答

您对 stddev 的使用表明您分别查看每个变量。如果你把它们放在一起看,你可能会有更多的机会。一维的异常值可能是巧合,多维的异常值肯定是异常。我对游戏了解不多,但我认为您可以使用查找额外的变量,例如游戏中的行进距离等。

您可以使用异常值理论来检测异常。寻找异常值的一种非常幼稚的方法是使用马氏距离这是一种考虑数据分布的度量,并计算与中心的相对距离。它对一个统计数据中的异常值不太敏感,但可以看作是一种寻找统计数据组合为奇数的玩家的方法。

一种类似的方法是构建模型并查看误差项。这基本上是相同的:它寻找不符合一般模式的游戏玩家。这种技术也用于金融服务中查找欺诈案件。该模型可以从基本的线性模型变为更复杂的模型。如果您将您的算法应用于没有玩家 i 的模型的误差项,您实际上会计算出类似于库克与某个玩家的距离的东西。结合DFFITS度量和杠杆,它通常用于检测回归中的异常值和/或影响点。

你也可以使用监督分类:你用真正的游戏玩家和已知的作弊者训练一个算法。那里有许多可用的技术,从神经网络和分类树到支持向量机和随机森林。

遗传算法也被越来越多地使用,因为随着时间的推移它们可以在知识上取得进步。如果您检查假定的作弊者,您可以 - 就像垃圾邮件过滤器一样 - 纠正错误分类的游戏玩家。当玩家是作弊者时,该算法将不断学习更好地预测。

正如 mbq 所提到的,没有示例数据就不可能给你一个算法;我什至不知道可以进行哪些测量。但这应该会给你一些关于可用方法的一些想法,从非常幼稚到非常复杂。如果您想进一步搜索一下,可以从欺诈检测中学到很多东西。

开始可能是惠勒和艾特肯的这篇文章Kou 等人在这篇文章中发现了另一个有趣的可能技术概述(另一种出版物链接

我将重新发布我在 math.stackexchange 上给出的答案:

您的问题需要更多信息:

他们的分数是如何产生的(这是什么类型的游戏)?您的非作弊数据应该是什么样的?人们如何作弊?当他们没有作弊时,他们的分数会有什么不同(在统计意义上)?你大致知道作弊的比例吗?还是您也想知道这一点?

我还会看看异常值检测算法:维基百科在这个主题上看起来很有用(链接)。如果您的非作弊数据应该大致呈正态分布,则对您的数据使用 QQ 图也可能很有用;明显高于该线的点可能是作弊者。