X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=bayeswf.cpp;h=cc591832a556f023ea6aa364a44ce5422a0b0740;hb=1fac0677bbcba5dec26e11aa661c97e38f6c3d40;hp=ca205ef47e4eb9cf75f9b27370d280e60d431b46;hpb=0e3311bf0601a8db66058439bd1fff2a9cac2e58;p=wloh diff --git a/bayeswf.cpp b/bayeswf.cpp index ca205ef..cc59183 100644 --- a/bayeswf.cpp +++ b/bayeswf.cpp @@ -13,7 +13,7 @@ using namespace std; using namespace Eigen; -#define PRIOR_MU 1500 +#define PRIOR_MU 500 #define PRIOR_WEIGHT 1.0 #define MAX_PLAYERS 4096 #define DUMP_RAW 0 @@ -199,13 +199,14 @@ float compute_total_logl(float *mu, int num_players) * * Note that this does not depend on mu or the margin at all. */ -double hessian[MAX_PLAYERS * MAX_PLAYERS]; +Matrix hessian; void construct_hessian(const float *mu, int num_players) { - memset(hessian, 0, sizeof(hessian)); + hessian = Matrix(num_players, num_players); + hessian.fill(0.0f); for (int i = 0; i < num_players; ++i) { - hessian[i * num_players + i] += 1.0f / (prior_sigma * prior_sigma); + hessian(i, i) += 1.0f / (prior_sigma * prior_sigma); } for (unsigned i = 0; i < all_matches.size(); ++i) { const match &m = all_matches[i]; @@ -216,30 +217,32 @@ void construct_hessian(const float *mu, int num_players) double sigma_sq = global_sigma * global_sigma; float w = m.weight; - hessian[p1 * num_players + p2] -= w / sigma_sq; - hessian[p2 * num_players + p1] -= w / sigma_sq; + hessian(p1, p2) -= w / sigma_sq; + hessian(p2, p1) -= w / sigma_sq; - hessian[p1 * num_players + p1] += w / sigma_sq; - hessian[p2 * num_players + p2] += w / sigma_sq; + hessian(p1, p1) += w / sigma_sq; + hessian(p2, p2) += w / sigma_sq; } } // Compute uncertainty (stddev) of mu estimates, which is sqrt((H^-1)_ii), // where H is the Hessian (see construct_hessian()). -void compute_mu_uncertainty(const float *mu, int num_players) +void compute_mu_uncertainty(const float *mu, const vector &players) { - Matrix h(num_players, num_players); - for (int i = 0; i < num_players; ++i) { - for (int j = 0; j < num_players; ++j) { - h(i, j) = hessian[i * num_players + j]; - } - } - // FIXME: Use pseudoinverse if applicable. - Matrix ih = h.inverse(); - for (int i = 0; i < num_players; ++i) { + Matrix ih = hessian.inverse(); + for (unsigned i = 0; i < players.size(); ++i) { mu_stddev[i] = sqrt(ih(i, i)); } + + for (unsigned i = 0; i < players.size(); ++i) { + for (unsigned j = 0; j < players.size(); ++j) { + printf("covariance %s %s %f\n", + players[i].c_str(), + players[j].c_str(), + ih(i, j)); + } + } } int main(int argc, char **argv) @@ -337,7 +340,7 @@ int main(int argc, char **argv) sumdiff += (global_sigma - old_global_sigma) * (global_sigma - old_global_sigma); if (sumdiff < EPSILON) { //fprintf(stderr, "Converged after %d iterations. Stopping.\n", j); - printf("%d 0 -1\n", j + 1); + printf("aux_param num_iterations %d\n", j + 1); break; } } @@ -346,13 +349,13 @@ int main(int argc, char **argv) dump_raw(mu, num_players); #else construct_hessian(mu, num_players); - compute_mu_uncertainty(mu, num_players); + compute_mu_uncertainty(mu, players); dump_scores(players, mu, mu_stddev, num_players); //fprintf(stderr, "Optimal sigma: %f (two-player: %f)\n", sigma[0], sigma[0] * sqrt(2.0f)); - printf("%f 0 -2\n", global_sigma / sqrt(2.0f)); - printf("%f 0 -3\n", prior_sigma); + printf("aux_param score_stddev %f\n", global_sigma / sqrt(2.0f)); + printf("aux_param rating_prior_stddev %f\n", prior_sigma); float total_logl = compute_total_logl(mu, num_players); - printf("%f 0 -4\n", total_logl); + printf("aux_param total_log_likelihood %f\n", total_logl); #endif }