Slide 1

Slide 1 text

勢いで
 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?

Slide 2

Slide 2 text

自己紹介 漫画 実写 所属:面白法人カヤック GC事業部 サーバーサイド 入社2年目超(+半年くらい?) (自称) データエンジニア。 よく使う言語はSQL/Python/Per もともとはPython/MATLAB書捨て解析マンl なにかGoで書きたい病罹患中。 https://github.com/mashiike github icon 名前: 池田 将士 (ikeda-masashi) Github name: mahiike OSS的なものは初挑戦!

Slide 3

Slide 3 text

なにかGoで書きたい病罹患中!!! 春なので(ボソ 大事なことなので (ry そこで、 勢いで 
 『Glicko-2 Ratingのgo実装書いてみた』
 が、しかし... 
 (自分の中で)『イマイチ使い道が思いつかなかったので、宣伝しに来ました』
 
 Usecaseとツッコミウェルカム!!


Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

そもそもRatingって? - 概要 By Wikipedia ここでいうRatingは、チェスとか、ボドゲとか、スマホゲーとかスマホゲーとかで使われる 数値化された強さの意味合い。 ELO Rating, Glicko Rating, Glicko2 Ratingなどなどアルゴリズムはた くさん存在している。 レーティング(Rating)とは、対象となる物事に対して、ある基準に基づ き、等級分けや数値化を行ったものである。

Slide 6

Slide 6 text

そもそも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

Slide 7

Slide 7 text

そもそもRatingって? - Gliko2って? ● Glicko2 Ratingは最初期に登場した ELO Rating の改良版であるGlicko Ratingの更にその改良版 ● 1500という値が中心で、強ければ数値が大きく低ければ数値が小さいという特徴 ● ELOのときから引き継いで Ratingの数値に200差あればだいたい高いほうが 76%で勝つ ● 実際に発揮される強さはブレがあるとして、 RD(Rating Devition)という数値がある。 ● 更新には実際の勝敗情報が必要 etc... 要するに 『実際の勝敗から、強さを推定するすっ ごい便利なアルゴリズム』

Slide 8

Slide 8 text

github.com/mashiike/ratingの宣伝 https://github.com/mashiike/rating

Slide 9

Slide 9 text

github.com/mashiike/ratingの宣伝 https://github.com/mashiike/rating 特徴 ● シンプル! ● ヘルパーをたくさん実装(したい) ● time.Time をインスパイア(したい) モチベーション ● そもそも何かGoで書いてみたかった。 ● 既存のGlicko2 Ratingの実装はシンプルすぎて、 Ratingに対する理解がないと使いづらいのでなんとかしたい。 (例えば、どうやって推定勝率だすの?とか       どうやってTeam型で適用するの?とか)

Slide 10

Slide 10 text

github.com/mashiike/ratingの宣伝 基本的な使い方 https://play.golang.org/p/oUNY1G6DrPc 対戦相手のRating 試合の結果 システム定数(0.3 ~ 1.2)

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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)

Slide 14

Slide 14 text

今後の展望的ななにか version up 予定(妄想) v0.5.0 : チームRating対応 (PlayerとTeamの実装) Glicko2-rating特有のパラメータUtils (初期Volatilityやシステム定数Tauの決定とか) v0.6.0 : Matchmakeing ? v0.7.0 : ???(他に必要な機能あるだろうか?機能要望募集中) ︙ v1.0.0 : (夏には・・・)

Slide 15

Slide 15 text

ご清聴ありがとうございました。 相談先続々募集中。