【Algorithm】藏在Ranking中的ELo

2024-02-11 04:32
文章标签 algorithm ranking elo

本文主要是介绍【Algorithm】藏在Ranking中的ELo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 写在前面的
  • ELO
    • 什么是ELO算法
    • 算法模型
    • 算法原理
    • 验证
  • 总结

写在前面的

   今天偶尔在BlueHole的HOT FIX&UPDATES的说明中看到了下面的一段话:Next Tuesday, August 1st, we will reset our leaderboard once again. Now that we are getting closer to launch, we will be resetting the leaderboards on the first of each month in order to test new ranking algorithms and ELO changes.
   既然提到了”Ranking Algorithms and ELO changes”我就想看看ranking中是否真的存在数学模型,至少得是和我之前推测的差不多,应该是使用了一个正态分布,但是事实好像并不是这么简单。

ELO

   目前我所接触的算法当中,主要都是和排序与选择有关系,真正应用到实际项目中的算法好像少之又少,有时候真的很想在一些项目中看一看除了上述之外的算法究竟是怎么工作的。如果你的想法和我一样,那么比较简单ELO就可以帮助你实现这个小目标。

什么是ELO算法?

   所谓的ELO ranking system其实是一个名字叫做“阿帕德·埃洛”物理学家创建的一个衡量各类对弈活动水平的一套评价算法。比如人们熟知的棋类运动,如国际象棋、围棋,球类运动,如足球、篮球、斯诺克等,甚至是F1中也有ELO的身影。

  • 一句话:ELO将选手的实力通过一套被所有人认可的形式进行量化,从而得出一个“分数”(姑且称之为分数,或者可以说水平值),这样我们就可以根据这个统一标准下的“分值”来对选手的综合实力进行衡量。

  • 举一个例子,听说过或者玩过LOL的人在“排位赛”(Rank)中,根据自己隐藏分的不同,所匹配的对手或者队友都是有所差别的,这里的隐藏分就是ELO评估出来的分值,可能根据拳头公司自己对产品的需求进行了微调,但总体反映的玩家水平的情况是一样的。

算法模型

  • 用一个经验丰富的运动员来做比较,如果参赛场次足够大(样本足够大),那么我们姑且可以认为一个运动员参赛的平均水平到底是什么样子的,其特征符合“正态分布”模型。公式的话大家高中都学过,就不贴在这里了。
    这里写图片描述
    很明显,一般我们认为一个运动员水平的好坏,不是单单看他哪一场发挥的好,也不是看哪一场发挥的不好,反而是他的平均水平才会是他竞技水准的标签。ELO将这个巨大的样本所反映的数据趋势作为假设,即很少有人可以打破长期以来积累的“正太分布”形势,那么就可以使用平均值作为描述水平的参数。

  • 由于衡量一个选手的水平并不能通过单一场次比赛来恒定,那么就需要根据选手的胜负平的状态来进行大样本统计,即:赢,加分;输,扣分;平,不得分。

   有了这个大的模型,就需要给每个选手真正的根据输赢来分配分值,具体的分配方法请参考一片发表在微软的博客:TrueSkill™ Ranking System。文章中提到的TrueSkill分值就是我们提到的加分分值了。(如果需要翻译的小伙伴可以私信我)

算法原理

   我们用胜率,也就是E(X)的期望值来表示选手的水平。

  • R(a)表示A选手的当前胜率或者rank分值,R(b)表示B选手当前的胜率或者rank分值

  • E(a)表示A选手的当前期望胜负值,E(b)表示B选手当前的期望胜负值。

  • 这里就是期望公式啦,得出:A对B的期望胜率,E(a)=1/(1+10^[(Rb-Ra)/400]);B对A的期望胜率,E(b)=1/(1+10^[(Ra-Rb)/400]);且E(a)+E(b)=1

  • 同时,S(a)表示队伍A的比赛结果,胜利S值为1,平局S值为0.5,失败S值为0

  • 所以有了上面的式子,那么一场比赛下来,新的胜率或者Rank分数就诞生了:R’(a)=R(a)+(S(a)-E(a))。由于不同的比赛,所得到的RANK分数或者胜率的增加值是不同的,所以就需要引入一个常数K,即R’(a)=R(a)+K(S(a)-E(a)),这里就用查来的魔兽世界WOW的K值作为计算标准,即K=32(wow里的k值可以通过两个1500队伍的比赛推算出,输赢个16,所以k=32)后面再讲K到底是什么。

验证

   下面我们用SOLO赛来进行一次模拟,选手A隐藏分1100分,选手B1200分,预估A的胜负值:E(a)=1/(1+10^[(1200-1100)/400])=0.36,预估B的胜负:E(a)=1/(1+10^[(1100-1200)/400])=0.64

  • 假设A赢了,实际胜负值为S(a)=1
    A最终得分为 R’a = 1100 + 32*(1-0.36) = 1100+20.5 = 1120.5, 赢20分 B输20分。

  • 假设B赢了,实际胜负值为S(b)=1
    B最终得分为 R’b = 1200 + 32*(1-0.64) = 1200+11.52 = 1211.5, 赢12分 A输12分。

  • 相信到了这里,你就明白了,为什么我玩游戏或者比赛评分的时候,赢了水平高的玩家,那么我加分会多,输给了厉害的玩家加分会少;同理,输给了不厉害的玩家会输的很多,赢了水平低的玩家会赢分很少的原理。给出了数之后我们就可以看出K值就是一个加分极限值,LOL的也就不难推测了,估计K的取值也就是K=25左右

总结

   上述就是ELO算法的一些基本的理念了,我觉得这个算法非常贴切我们的日常生活,也是绝大多数人都拥有的经历,让人一眼就可以看到这个算法的本质。同时也会给我们一些其他的提示,比如阿里是如何评判一个人是否信誉良好,再比如神盾局中的那个系统—如何评判一个人是否是个“好人”?所以,我觉得算法有意思的地方恰恰就是在这里,那些基础的算法可以帮助我们解决一些固定的问题,但是帮助不了我们解决一些特有的问题,所以算法的创造才是程序是否好用的灵魂。

参考文章:竞技场积分系统ELO详解

这篇关于【Algorithm】藏在Ranking中的ELo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698824

相关文章

【tensorflow 使用错误】tensorflow2.0 过程中出现 Error : Failed to get convolution algorithm

如果在使用 tensorflow 过程中出现 Error : Failed to get convolution algorithm ,这是因为显卡内存被耗尽了。 解决办法: 在代码的开头加入如下两句,动态分配显存 physical_device = tf.config.experimental.list_physical_devices("GPU")tf.config.experiment

纪念一下自己的Coursera Princeton Algorithm的课程第一个assignment

今天终于完成了第一个Union-Find的assignment,之前觉得特别的难,可是最后自己也搞定了。而且是100%满分。 自己后来plot了一下自己的分数,也许这就是学习曲线吧。刚开始不会,到后来中期显著提高,但是要到100%,那就要经历更多的波折,甚至是下降都有可能。最后才能达到100%满分。 我觉得最有用的还是下面这段源代码: /*************************

[Algorithm][综合训练][栈和排序][加减]详细讲解

目录 1.栈和排序1.题目链接2.算法原理详解 && 代码实现 2.加减1.题目链接2.算法原理详解 && 代码实现 1.栈和排序 1.题目链接 栈和排序 2.算法原理详解 && 代码实现 解法:栈 + 贪心 -> 每次尽可能先让当前需要的最大值弹出去vector<int> solve(vector<int>& a) {int n = a.size();vect

[Algorithm][综合训练][四个选项][接雨水]详细讲解

目录 1.四个选项1.题目链接2.算法原理详解 && 代码实现 2.接雨水1.题目链接2.算法原理详解 && 代码实现 1.四个选项 1.题目链接 四个选项 2.算法原理详解 && 代码实现 解法:DFS(暴搜) + 剪枝 + Hash 剪枝: 填某个数的时候,要看看还有没有剩余次数填某个数的时候,符不符合若干题的选项必须相同 #include <iostr

General Algorithm

Y or N Silly Board Game String Sorting Find the smallest char in a string Integer Sorting Pairs Y or N Silly Board Game 2 opponents: A&B. To represent a board by String[] board = ne

零基础学启发式算法(5)-遗传算法 (Genetic Algorithm)

一、遗传算法 (Genetic Algorithm, GA)  源于达尔文的进化论,将问题的一个解当作种群中的一个个体。 gene:基因 chromosome: 染色体 population:种群 crossover:交叉 mutation:变异 selection:选择 通过多轮的“选择,交叉和变异”,选择适应度最好的个体作为问题的最优解。 选择:优胜劣汰,适者生存。

多边形快速凸包算法(Melkman‘s Algorithm)

前言 平面点集的凸包算法一文介绍了如何计算平面点集或者任意多边形的凸包。对于随机的平面点集,Graham scan和Andraw's 单调链算法已经是最快的算法了。但是对于没有自相交的封闭的简单多边形,存在线性复杂度的算法。下面介绍这一优雅高效的算法。 一般的2D凸包算法,首先将点进行排序(时间复杂度),然后利用栈操作在O(n)的时间复杂度内计算凸包。初始的排序决定了最终的时间复杂度。但是本文

one model / ensemble method /meta-algorithm 迁移学习算不算ensemble method

鉴于object detection COCO数据集的论文经常出现 single-model 也就是说,这是一个对网络的分类,呢它是什么意思,有什么特点。相对应的另一类是什么。就是下面介绍的ensemble learning。 不过比如说网络初值是用别人的网络训练好的数值,一定意义来讲是在优化空间找到一个初值,对于自己网络的结果的影响究竟有多大,也就是说,用随机初始网络得到的结果是否有不同,有多

[Algorithm][综合训练][体育课测验(二)][合唱队形][宵暗的妖怪]详细讲解

目录 1.体育课测验(二)1.题目链接2.算法原理详解 && 代码实现 2.合唱队形1.题目链接2.算法原理详解 && 代码实现 3.宵暗的妖怪1.题目链接2.算法原理详解 && 代码实现 1.体育课测验(二) 1.题目链接 体育课测验(二) 2.算法原理详解 && 代码实现 说明:单纯积累一题[拓扑排序]用于加强印象 能识别模型,并且写出代码 vector<i

《Data Structure Algorithm Analysis in C》Chap.10笔记

5大算法:贪婪 Greedy,分治 Divide and conquer,动态规划 Dynamic Programming,随机 Randomized,回溯 Backtracking。 每一个小节都是一个具体的问题,应当仔细看,待看的:10.2.2-4,10.3,10.4.3,10.5.2。