]> git.sesse.net Git - wloh/commitdiff
Add weight to all matches, and optimize mu based on it.
authorSteinar H. Gunderson <Steinar H. Gunderson sesse@debian.org>
Fri, 16 Mar 2012 23:52:03 +0000 (00:52 +0100)
committerSteinar H. Gunderson <Steinar H. Gunderson sesse@debian.org>
Fri, 16 Mar 2012 23:52:03 +0000 (00:52 +0100)
bayeswf.cpp

index 952322d39ef96d22ea0ed2a7108b6149471b86de..f518edd7ca2987f9ae3c6551be9a0deaa1613706 100644 (file)
@@ -31,6 +31,7 @@ float sigma[MAX_PLAYERS];
 struct match {
        int other_player;
        int margin;
+       float weight;
 };
 map<int, vector<match> > matches_for_player;
 
@@ -55,10 +56,10 @@ void dump_scores(const vector<string> &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<match> &matches)
 {
@@ -70,7 +71,7 @@ void update_mu(float *mu, float *sigma, int player_num, const vector<match> &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);
        }