From ea0d66364e609947f11e7fbda23bd1d67df94b7d Mon Sep 17 00:00:00 2001 From: Alessandro Barbieri Date: Thu, 18 Aug 2016 23:37:29 +0200 Subject: [PATCH 1/2] fix to avoid indetermination instead of calculating d2 and then inverting it, calculate the inverse of d2 directly and use that --- skills/glicko.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/skills/glicko.py b/skills/glicko.py index b57597a..a6f358c 100644 --- a/skills/glicko.py +++ b/skills/glicko.py @@ -145,11 +145,11 @@ def g(RD): def E(r, rj, RDj): return 1.0 / (1.0 + pow(10.0, -g(RDj) * (r - rj) / 400.0)) - def d2(g_RD, E_sr_r_RD): + def d2_inv(g_RD, E_sr_r_RD): return pow(q ** 2.0 * sum( g_RD[j] ** 2.0 * E_sr_r_RD[j] * (1.0 - E_sr_r_RD[j]) for j in range(len(g_RD)) - ), -1.0) + )) new_ratings = Match() for player, rating in players.items(): @@ -164,7 +164,7 @@ def d2(g_RD, E_sr_r_RD): # cache value, this form used twice in the paper RD2_d2 = (1.0 / player_RD[player] ** 2.0 + - 1.0 / d2(opponent_g_RD, opponent_E_sr_r_RD)) + d2_inv(opponent_g_RD, opponent_E_sr_r_RD)) # new rating value r_new = (rating.mean + q / RD2_d2 * sum( From 96b92eb8af7427ef57d7777ed504bfbe940501c1 Mon Sep 17 00:00:00 2001 From: Alessandro Barbieri Date: Thu, 18 Aug 2016 23:38:51 +0200 Subject: [PATCH 2/2] forgot pow --- skills/glicko.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skills/glicko.py b/skills/glicko.py index a6f358c..bf7a122 100644 --- a/skills/glicko.py +++ b/skills/glicko.py @@ -146,7 +146,7 @@ def E(r, rj, RDj): return 1.0 / (1.0 + pow(10.0, -g(RDj) * (r - rj) / 400.0)) def d2_inv(g_RD, E_sr_r_RD): - return pow(q ** 2.0 * sum( + return (q ** 2.0 * sum( g_RD[j] ** 2.0 * E_sr_r_RD[j] * (1.0 - E_sr_r_RD[j]) for j in range(len(g_RD)) ))