6 use CGI::Carp qw( fatalsToBrowser );
13 require '../config.pm';
15 my $dbh = DBI->connect($config::local_connstr, $config::local_username, $config::local_password)
16 or die "connect: " . $DBI::errstr;
17 $dbh->{AutoCommit} = 0;
18 $dbh->{RaiseError} = 1;
20 binmode STDOUT, ':utf8';
22 # Find auxillary parameters.
24 my $q = $dbh->prepare('SELECT * FROM ratings WHERE id < 0');
26 while (my $ref = $q->fetchrow_hashref) {
27 $params{$ref->{'id'}} = $ref->{'rating'};
29 my $match_stddev = $params{-2} * sqrt(2.0);
31 print CGI->header(-type=>'text/html; charset=utf-8', -expires=>'now');
32 POSIX::setlocale(&POSIX::LC_ALL, 'nb_NO.UTF-8');
34 printf <<"EOF", $params{-3}, $match_stddev;
37 <title>WLoH-rating</title>
38 <style type="text/css">
42 font-family: sans-serif;
45 border-collapse: collapse;
46 border: 1px solid black;
49 border: 1px solid black;
56 background-color: #ddd;
63 <p>Ratingen er basert på spilledata fra WLoH (takk til Lobotommy
64 for tilgang!), og oppdateres
65 hver hele time. Den er fullstendig uoffisiell, og har ingen innflytelse
66 på WLoH, men brukes for å estimere vinnersannsynligheter i
67 <a href="/">sannsynlighetsberegningen</a>.</p>
70 er betydelig usikkerhetsmargin, spesielt for spillere som ikke
71 har spilt spesielt mange kamper.</p>
73 <p>Modellen kan endre seg når som helst når jeg føler for det :-)
74 Ikke ta ratingen alt for alvorlig, selv om den er basert på
75 relativt fornuftige matematiske modeller. Husk at all statistikk
76 sier mer om fortiden enn om framtiden.</p>
78 <h2>Modellparametre</h2>
80 <p>For de som vet litt om slikt. Mer utførlig forklaring for begynnere kommer seinere.</p>
83 <li>MLE-basert modell med én skalar (styrke) per spiller og to globale skalarer (begge standardavvik, se under), løst med syklisk MM (minorization-maximization). Antall iterasjoner før konvergens: $params{-1}.</li>
84 <li>Rimelighetfunksjon, prior: Normalfordeling med µ=1500, σ=%.1f (est.)</li>
85 <li>Rimelighetfunksjon, per kamp: Normalfordeling med µ=(score1 - score2), σ=%.1f (est.)</li>
86 <li>Vekting: Inneværende sesong samt de tre siste vektes fullt ut
87 (likt med prior). Deretter eksponentielt synkende vekting, med
88 halveringstid på tre sesonger.</li>
105 NATURAL JOIN kanonisk_navn
106 NATURAL JOIN siste_divisjon
107 ORDER BY rating DESC');
111 while (my $ref = $q->fetchrow_hashref) {
113 print " <tr class=\"odd\">\n";
115 print " <tr class=\"even\">\n";
117 printf " <th>%d.</th>\n", $i;
118 printf " <td><a href=\"http://wordfeud.aasmul.net/bruker-%d\">%s</a></td>\n", $ref->{'id'}, HTML::Entities::encode_entities(Encode::decode_utf8($ref->{'navn'}));
119 printf " <td class=\"num\">%.1f</td>\n", $ref->{'rating'};
120 printf " <td><a href=\"http://wordfeud.aasmul.net/serie-%d\">%s</a></td>\n", $ref->{'serie_id'}, $ref->{'serie_navn'};
130 $match_stddev = $params{-2} * sqrt(2.0);