elo 评分

正如我在较早的博客文章中提到的那样, 我一直在学习有关排名系统的知识,而我遇到的第一个系统是Elo评级系统 ,该系统最有名的是用于对棋手进行排名的系统 。

Elo评分系统使用以下公式计算球员/团队参加比赛后的排名:

R'= R + K *(S – E)

  • R'是新的评分
  • R是旧评分
  • K是增加或减少等级的最大值(ELO为16或32)
  • S是一场比赛的分数
  • E是游戏的预期分数

我将该公式转换为以下Clojure函数:

(defn ranking-after-win[{ ranking :ranking opponent-ranking : opponent-ranking importance :importance}](+ ranking (* importance (- 1 (expected ranking opponent-ranking) ))))(defn ranking-after-loss[{ ranking :ranking opponent-ranking : opponent-ranking importance :importance}](+ ranking (* importance (- 0 (expected ranking opponent-ranking) ))))(defn expected [my-ranking opponent-ranking](/ 1.0(+ 1 (math/expt 10 (/ (- opponent-ranking my-ranking) 400)))))

可以这样算出1200击败1500的新排名:

> (ranking-after-win { :ranking 1200 : opponent-ranking 1500 :importance 32 })
1227.1686541692377

它的工作方式是,首先我们的可能性,我们应该呼吁预期赢得比赛:

> (expected 1200 1500)
0.15097955721132328

这告诉我们,我们有15%的机会赢得比赛,因此,如果我们赢了,那么我们的排名应该大大提高,因为我们预计不会赢。 在这种情况下,获胜使我们的积分增加了'32 *(1-0.15)',即〜27分。

我总是通过将增加或减少的重要性/最大值设置为32来简化事情。 世界足球排名采用了不同的方法,他们根据比赛的重要性和胜利幅度来改变它。

我决定在2002/2003冠军联赛赛季尝试该算法。 我能够从The Rec Sport足球统计基金会中获取数据 ,并且之前已经写过有关如何使用Enlive进行刮取的信息 。

在Paul Bostrom的大力帮助下,我最终得到了以下代码来简化比赛,并在每次比赛后更新球队排名:

(defn top-teams [number matches](let [teams-with-rankings(apply array-map (mapcat (fn [x] [x {:points 1200}]) (extract-teams matches)))](take number(sort-by (fn [x] (:points (val x)))>(seq (reduce process-match teams-with-rankings matches))))))(defn process-match [ts match](let [{:keys [home away home_score away_score]} match](cond(> home_score away_score)(-> ts(update-in  [home :points]#(ranking-after-win {:ranking % : opponent-ranking (:points (get ts away)) :importance 32}))(update-in  [away :points]#(ranking-after-loss {:ranking % : opponent-ranking (:points (get ts home)) :importance 32}))) (> away_score home_score)(-> ts(update-in  [home :points]#(ranking-after-loss {:ranking % : opponent-ranking (:points  (get ts away)) :importance 32}))(update-in  [away :points]#(ranking-after-win {:ranking % : opponent-ranking (:points (get ts home)) :importance 32})))(= home_score away_score) ts)))

我们传递给顶级团队matchs参数如下所示 :

> (take 5 all-matches)
({:home "Tampere", :away "Pyunik Erewan", :home_score 0, :away_score 4} {:home "Pyunik Erewan", :away "Tampere", :home_score 2, :away_score 0} {:home "Skonto Riga", :away "Barry Town", :home_score 5, :away_score 0} {:home "Barry Town", :away "Skonto Riga", :home_score 0, :away_score 1} {:home "Portadown", :away "Belshina Bobruisk", :home_score 0, :away_score 0})

并调用提取团队会为我们提供一组涉及的所有团队:

> (extract-teams (take 5 all-matches))
#{"Portadown" "Tampere" "Pyunik Erewan" "Barry Town" "Skonto Riga"}

然后,我们将其映射 ,以获得包含团队/默认得分对的向量:

> (mapcat (fn [x] [x {:points 1200}]) (extract-teams (take 5 all-matches)))
("Portadown" {:points 1200} "Tampere" {:points 1200} "Pyunik Erewan" {:points 1200} "Barry Town" {:points 1200} "Skonto Riga" {:points 1200})

在调用array-map对结果进行哈希处理之前:

> (apply array-map (mapcat (fn [x] [x {:points 1200}]) (extract-teams (take 5 all-matches))))
{"Portadown" {:points 1200}, "Tampere" {:points 1200}, "Pyunik Erewan" {:points 1200}, "Barry Town" {:points 1200}, "Skonto Riga" {:points 1200}}

然后,我们对所有比赛应用归约法,并在每次迭代中调用函数process-match ,以适当地更新团队排名。 最后一步是按排名对球队进行排序,以便我们列出排名靠前的球队:

> (top-teams 10 all-matches)
(["CF Barcelona" {:points 1343.900393287903}] ["Manchester United" {:points 1292.4731214788262}] ["FC Valencia" {:points 1277.1820905112208}] ["Internazionale Milaan" {:points 1269.8028023141364}] ["AC Milan" {:points 1257.4564374787687}]["Juventus Turijn" {:points 1254.2498432522466}] ["Real Madrid" {:points 1248.0758162475993}] ["Deportivo La Coruna" {:points 1235.7792317210403}] ["Borussia Dortmund" {:points 1231.1671952364256}] ["Sparta Praag" {:points 1229.3249513256828}])

有趣的是,优胜者(尤文图斯)仅排在第五位,而前四名则被四分之一决赛中失利的球队占据。 我编写了以下函数来调查正在发生的事情:

(defn show-matches [team matches](->> matches(filter #(or (= team (:home %)) (= team (:away %))))(map #(show-opposition team %))))(defn show-opposition [team match](if (= team (:home match)){:opposition (:away match) :score (str (:home_score match) "-" (:away_score match))}{:opposition (:home match) :score (str (:away_score match) "-" (:home_score match))}))

如果我们用尤文图斯来称呼它,我们可以看到他们在比赛中的表现:

ranking-algorithms.parse> (show-matches "Juventus Turijn" all-matches)
({:opposition "Feyenoord", :score "1-1"} {:opposition "Dynamo Kiev", :score "5-0"} {:opposition "Newcastle United", :score "2-0"} {:opposition "Newcastle United", :score "0-1"} {:opposition "Feyenoord", :score "2-0"} {:opposition "Dynamo Kiev", :score "2-1"} {:opposition "Deportivo La Coruna", :score "2-2"} {:opposition "FC Basel", :score "4-0"} {:opposition "Manchester United", :score "1-2"} {:opposition "Manchester United", :score "0-3"} {:opposition "Deportivo La Coruna", :score "3-2"} {:opposition "FC Basel", :score "1-2"} {:opposition "CF Barcelona", :score "1-1"} {:opposition "CF Barcelona", :score "2-1"} {:opposition "Real Madrid", :score "1-2"} {:opposition "Real Madrid", :score "3-1"})

尽管我错过了决赛-我需要修复解析器以选择该对局,而且无论如何还是平局-他们实际上仅直接赢得了8场比赛。 另一方面,巴塞罗那赢得了13场比赛,尽管其中有2场是预选赛。

下一步是考虑比赛的重要性,而不是全面应用32的重要性,即使在点球或客场进球的情况下,也能为赢得平局增添一些价值。

如果您想使用它,或者对其他可以尝试的建议,请在github上找到代码 。

参考: Elo评分系统:在Mark Needham博客博客中使用来自JCG合作伙伴 Mark Needham的Clojure使用Clojure对欧洲冠军联赛球队进行排名 。

翻译自: https://www.javacodegeeks.com/2013/09/elo-rating-system-ranking-champions-league-teams-using-clojure.html

elo 评分

elo 评分_Elo评分系统:使用Clojure对欧洲冠军联赛球队进行排名相关推荐

  1. Elo评分系统:使用Clojure对欧洲冠军联赛球队进行排名

    正如我在较早的博客文章中提到的那样, 我一直在学习有关排名系统的知识,而我遇到的第一个系统是Elo评级系统 ,该系统最著名地用于对棋手进行排名. Elo评分系统使用以下公式来计算球员/团队参加比赛后的 ...

  2. 计算机毕业设计ssm大学生日常行为评分管理系统9gl38系统+程序+源码+lw+远程部署

    计算机毕业设计ssm大学生日常行为评分管理系统9gl38系统+程序+源码+lw+远程部署 计算机毕业设计ssm大学生日常行为评分管理系统9gl38系统+程序+源码+lw+远程部署 本源码技术栈: 项目 ...

  3. 无主之地3重型武器节奏评分榜(9.25) 枪械名 红字效果 元素属性 清图评分 Boss战评分 泛用性评分 特殊性评分 最终评级 掉落点 掉率 图片 瘟疫传播

    无主之地3重型武器节奏评分榜(9.25) 枪械名 红字效果 元素属性 清图评分 Boss战评分 泛用性评分 特殊性评分 最终评级 掉落点 掉率 图片 瘟疫传播者 发射巨大能量球,能量球会额外生成追踪附 ...

  4. 鸿蒙系统欧洲注册,华为鸿蒙系统曝光后华为欧洲注册商标 为鸿蒙系统国外版打基础...

    描述 日前,国家知识产权局商标局网站显示,华为已经申请注册"华为鸿蒙"商标,并标注该商品可用于操作系统程序. 无独有偶,华为鸿蒙系统曝光后华为欧洲注册商标. "鸿蒙&qu ...

  5. 用PowerPoint制作比赛评分系统,欢迎下载!比赛评分专业展示系统,使用VC++制作控制台,PPT集成技术佼佼者,全国唯一

    软件名称:[评委计分系统-双屏专业版] 涉及词汇:比赛打分系统 比赛评分系统 比赛展示系统 竞赛评比系统 比赛计分系统 比赛记分系统 评委记分系统 [应用场合] 应用于文艺比赛.演讲比赛.模特比赛等需 ...

  6. 信用卡评分模型(数据获取+数据预处理+探索分析+变量选择+模型开发+模型评估+信用评分+建立评分系统)

    最近两次遇到关于信用卡评分的题目,遂了解一波. Reference: 基于python的信用卡评分模型(超详细!!!) https://www.jianshu.com/p/f931a4df202c h ...

  7. ELO用户忠诚度评分大赛---异常值的识别和处理

    https://www.sohu.com/a/416398396_100103806?sec=wd (2)数据大于±3标准差 3σ 原则是在数据服从正态分布的时候用的比较多,在这种情况下,异常值被定义 ...

  8. ELO用户忠诚度评分建模

    特征选择:可以选择一些重要的数据先建模试一下哪个模型比较好  由于此前创建了数千条特征,若带入全部特征进行建模,势必极大程度延长模型建模时间,并且带入太多无关特征对模型结果提升有限,因此此处我们借助皮 ...

  9. python编程入门经典 评分-豆瓣评分爆炸!Python+机器学习经典图书

    全场自营图书每满 100 减 50 元 .满 200 元减 100 元, 另外当当还特意为[机器学习算法与Python实战]读者提供了一批可与满减叠加使用的"满 200 减 40" ...

最新文章

  1. 如何优雅的导出Excel
  2. php.exe php-cgi.exe php-win.exe的区别
  3. BZOJ 3489: A simple rmq problem(K-D Tree)
  4. UML用例图总结来源于网络
  5. Nginx(二) 反向代理负载均衡
  6. ssh整合mysql不能自动生成表_ssh整合思想 Spring与Hibernate的整合 项目在服务器启动则自动创建数据库表...
  7. for 循环 与forEach 里面return 的区别
  8. 常见花材的固定的方法有哪些_什么是zeta电位?常见zeta电位分析方法有哪些?...
  9. numpy - np.asarray
  10. 图文详细解说DevExpress 2015新版亮点【附文档下载】
  11. java中map、list转json
  12. C语言使用信号量(Linux)
  13. Python3.6实现图片转文字
  14. SSL证书.key转.pem的方法
  15. css实现元素翻转(不是旋转)
  16. DIY 3D全景摄像机
  17. 统计字符串中每个字符的出现字数
  18. 二、操作系统基本原理
  19. 星速配资:煤炭概念股大幅拉升 看好投资机会
  20. 实现DOC、DOCX转换为PDF 再将PDF转换为图片

热门文章

  1. Xcode 14.0编译iOS项目出错 ‘sprintf‘ is deprecated
  2. 洛谷 2448 无尽的生命
  3. 创意人像海报故障艺术海报教程故障艺术海报怎么做
  4. 有点厉害!用12万行代码堆出来个蔡徐坤,关键是能跑能跳!
  5. 结构光系统标定(四)基于双目视觉的结构光系统标定
  6. 首届《Mr媛杯》程序媛选帅大赛开幕
  7. QT学习笔记-第三天
  8. 极光魔链(JMLink)使用教程
  9. 视频聊天网站的研究、发展以及趋势
  10. pip更换源,换成国内镜像