From fc8d9feb8f0b81581b24d779e3f7c3ee45290eb8 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 17 Mar 2012 00:52:03 +0100 Subject: [PATCH] Add weight to all matches, and optimize mu based on it. --- bayeswf.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/bayeswf.cpp b/bayeswf.cpp index 952322d..f518edd 100644 --- a/bayeswf.cpp +++ b/bayeswf.cpp @@ -31,6 +31,7 @@ float sigma[MAX_PLAYERS]; struct match { int other_player; int margin; + float weight; }; map > matches_for_player; @@ -55,10 +56,10 @@ void dump_scores(const vector &players, const float *mu, const float *si } /* - * diff(logL, mu1) = -(mu1 - mu2 - x) / sigma_c^2 - * maximizer for mu1 is given by: sum_i[ (1/sigma_c_i)^2 (mu1 - mu2_i - x_i) ] = 0 - * sum_i[ (1/sigma_c_i)^2 mu1 ] = sum_i [ (1/sigma_c_i)^2 ( mu2_i + x_i ) ] - * mu1 = sum_i [ (1/sigma_c_i)^2 ( mu2_i + x_i ) ] / sum_i[ (1/sigma_c_i)^2 ] + * diff(logL, mu1) = -w * (mu1 - mu2 - x) / sigma_c^2 + * maximizer for mu1 is given by: sum_i[ (w_i/sigma_c_i)^2 (mu1 - mu2_i - x_i) ] = 0 + * sum_i[ (w_i/sigma_c_i)^2 mu1 ] = sum_i [ (w_i/sigma_c_i)^2 ( mu2_i + x_i ) ] + * mu1 = sum_i [ (w_i/sigma_c_i)^2 ( mu2_i + x_i ) ] / sum_i[ (w_i/sigma_c_i)^2 ] */ void update_mu(float *mu, float *sigma, int player_num, const vector &matches) { @@ -70,7 +71,7 @@ void update_mu(float *mu, float *sigma, int player_num, const vector &mat for (unsigned i = 0; i < matches.size(); ++i) { float sigma1 = sigma[player_num]; float sigma2 = sigma[matches[i].other_player]; - float inv_sigma_c2 = 1.0f / (sigma1 * sigma1 + sigma2 * sigma2); + float inv_sigma_c2 = matches[i].weight / (sigma1 * sigma1 + sigma2 * sigma2); float x = matches[i].margin; // / 70.0f; nom += (mu[matches[i].other_player] + x) * inv_sigma_c2; @@ -197,8 +198,9 @@ int main(int argc, char **argv) for ( ;; ) { char pl1[256], pl2[256]; int score1, score2; + float weight; - if (scanf("%s %s %d %d", pl1, pl2, &score1, &score2) != 4) { + if (scanf("%s %s %d %d %f", pl1, pl2, &score1, &score2, &weight) != 5) { fprintf(stderr, "Read %d matches.\n", num_matches); break; } @@ -217,11 +219,13 @@ int main(int argc, char **argv) match m1; m1.other_player = player_map[pl2]; m1.margin = score1 - score2; + m1.weight = weight; matches_for_player[player_map[pl1]].push_back(m1); match m2; m2.other_player = player_map[pl1]; m2.margin = score2 - score1; + m2.weight = weight; matches_for_player[player_map[pl2]].push_back(m2); } -- 2.39.2