Save 37% off PRO during our Black Friday Sale! »

kamakura.go_5__kamakura.pdf

 kamakura.go_5__kamakura.pdf

F40e385e485eafaed67850df08b122d0?s=128

ikeda-masashi

June 22, 2019
Tweet

Transcript

  1. 勢いで
 Glicko-2 Ratingの
 go実装書いてみたが
 イマイチ使い道を
 思いつかない件について
 in kamakura.go#5 @鎌倉 2019/06/22(土)

    The Go gopher was designed by Renée French. The gopher stickers made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license. Which one is stronger?
  2. 自己紹介 漫画 実写 所属:面白法人カヤック GC事業部 サーバーサイド 入社2年目超(+半年くらい?) (自称) データエンジニア。 よく使う言語はSQL/Python/Per

    もともとはPython/MATLAB書捨て解析マンl なにかGoで書きたい病罹患中。 https://github.com/mashiike github icon 名前: 池田 将士 (ikeda-masashi) Github name: mahiike OSS的なものは初挑戦!
  3. なにかGoで書きたい病罹患中!!! 春なので(ボソ 大事なことなので (ry そこで、 勢いで 
 『Glicko-2 Ratingのgo実装書いてみた』
 が、しかし... 


    (自分の中で)『イマイチ使い道が思いつかなかったので、宣伝しに来ました』
 
 Usecaseとツッコミウェルカム!!

  4. アジェンダ 1. そもそもRatingって? 2. github.com/mashiike/ratingの宣伝 3. 今後の展望的ななにか

  5. そもそもRatingって? - 概要 By Wikipedia ここでいうRatingは、チェスとか、ボドゲとか、スマホゲーとかスマホゲーとかで使われる 数値化された強さの意味合い。 ELO Rating, Glicko

    Rating, Glicko2 Ratingなどなどアルゴリズムはた くさん存在している。 レーティング(Rating)とは、対象となる物事に対して、ある基準に基づ き、等級分けや数値化を行ったものである。
  6. そもそもRatingって? - 使われ方 https://wiki.guildwars2.com/wiki/PvP_Matchmaking_Algorithm Guild Wars 2 のPvPのマッチングでは MMR(MatchMaking Rating) という形で

    Glicko2 Ratingが使われていた。 シャドウバースというゲームでは『 Ratings for シャドウバース』というアプリが存在してい て、プレイヤー同士で強さを可視化している スプラトゥーン2の『ガチエリアパワー』は多分 Glicko2 Ratingベースだと思う。(多分) http://shiokarasokuhou.blomaga.jp/articles/29220.html
  7. そもそもRatingって? - Gliko2って? • Glicko2 Ratingは最初期に登場した ELO Rating の改良版であるGlicko Ratingの更にその改良版

    • 1500という値が中心で、強ければ数値が大きく低ければ数値が小さいという特徴 • ELOのときから引き継いで Ratingの数値に200差あればだいたい高いほうが 76%で勝つ • 実際に発揮される強さはブレがあるとして、 RD(Rating Devition)という数値がある。 • 更新には実際の勝敗情報が必要 etc... 要するに 『実際の勝敗から、強さを推定するすっ ごい便利なアルゴリズム』
  8. github.com/mashiike/ratingの宣伝 https://github.com/mashiike/rating

  9. github.com/mashiike/ratingの宣伝 https://github.com/mashiike/rating 特徴 • シンプル! • ヘルパーをたくさん実装(したい) • time.Time をインスパイア(したい)

    モチベーション • そもそも何かGoで書いてみたかった。 • 既存のGlicko2 Ratingの実装はシンプルすぎて、 Ratingに対する理解がないと使いづらいのでなんとかしたい。 (例えば、どうやって推定勝率だすの?とか       どうやってTeam型で適用するの?とか)
  10. github.com/mashiike/ratingの宣伝 基本的な使い方 https://play.golang.org/p/oUNY1G6DrPc 対戦相手のRating 試合の結果 システム定数(0.3 ~ 1.2)

  11. github.com/mashiike/ratingの宣伝 勝率予測 https://play.golang.org/p/6YJkutH8Rcz 1400の人が1700の人と戦った場合の推定勝率 21.66%

  12. github.com/mashiike/ratingの宣伝 チームRating (feature/v0.5.0 導入予定 ※まだ未実装) 最新版:https://github.com/mashiike/rating/blob/feature/v0.5.0/ratingsvc/example_test.go

  13. github.com/mashiike/ratingの宣伝 package main import ( "fmt" "math" "github.com/mashiike/comb" "github.com/mashiike/rating" )

    func main() { ratings := []rating.Rating{ rating.New(1500.0, 50, 0.06), rating.New(1730.0, 200, 0.06), rating.New(1600.0, 10, 0.06), rating.New(1470.0, 250, 0.06), rating.New(1550.0, 45, 0.06), rating.New(1620.0, 80, 0.06), } inds := comb.Slice(ratings, 2, func(teamInd [][]int) float64 { team0 := make([]rating.Rating, 0, 3) for _, ind := range teamInd[0] { team0 = append(team0, ratings[ind]) } team1 := make([]rating.Rating, 0, 3) for _, ind := range teamInd[1] { team1 = append(team1, ratings[ind]) } //それぞれのチームのRatingを求めて、その勝率が50%に近ければ小さくなる2次関数 return math.Pow(rating.Average(team0).WinProb(rating.Average(team1))-0.5, 2) }) fmt.Println("-- team1 --") for _, ind := range inds[0] { fmt.Println(ratings[ind]) } fmt.Println("") fmt.Println("-- team2 --") for _, ind := range inds[1] { fmt.Println(ratings[ind]) } } feature/v0.6.0 いい感じにチーム分けしてくれる機能 $ go run . -- team1 -- 1500.0 (1400.0-1600.0 v=0.06) 1600.0 (1580.0-1620.0 v=0.06) 1620.0 (1460.0-1780.0 v=0.06) -- team2 -- 1730.0 (1330.0-2130.0 v=0.06) 1470.0 (970.0-1970.0 v=0.06) 1550.0 (1460.0-1640.0 v=0.06)
  14. 今後の展望的ななにか version up 予定(妄想) v0.5.0 : チームRating対応 (PlayerとTeamの実装) Glicko2-rating特有のパラメータUtils (初期Volatilityやシステム定数Tauの決定とか)

    v0.6.0 : Matchmakeing ? v0.7.0 : ???(他に必要な機能あるだろうか?機能要望募集中) ︙ v1.0.0 : (夏には・・・)
  15. ご清聴ありがとうございました。 相談先続々募集中。