printf MCCALC "%d\n", scalar keys %players;
for my $id (keys %players) {
- my $rating = $used_ratings->{$id} // 1500.0;
+ my $rating = $used_ratings->{$id} // 500.0;
printf MCCALC "%s %f\n", $id, $rating;
}
chomp;
my @x = split /\s+/;
my $id = $x[0];
- my $player = sprintf "%s (%.0f ± %.0f)", $players{$id}, ($ratings{$id} // 1500.0), ($ratings_stddev{$id} // $parms{-3});
+ my $player = sprintf "%s (%.0f ± %.0f)", $players{$id}, ($ratings{$id} // 500.0), ($ratings_stddev{$id} // $parms{-3});
$prob{$player} = [ @x[1..$#x] ];
}
close MCCALC;
<ul>
<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>
- <li>Rimelighetfunksjon, prior: Normalfordeling med µ=1500, σ=%.1f (est.)</li>
+ <li>Rimelighetfunksjon, prior: Normalfordeling med µ=500, σ=%.1f (est.)</li>
<li>Rimelighetfunksjon, per kamp: Normalfordeling med µ=(score1 - score2), σ=%.1f (est.)</li>
<li>Vekting: Inneværende sesong samt de tre siste vektes fullt ut
(likt med prior). Deretter eksponentielt synkende vekting, med
helt vanlig tall, og det er denne vi prøver å måle ut fra resultatene vi ser.
(Vi prøver altså eksplisitt <em>ikke</em> å dele ut «poeng» for å gjøre det bra,
kun å estimere den ekte spillestyrken din; selv et tap kan øke ratingen din.)
- Vi sier at hvis Anne har spillestyrke (rating) 1550 og Bjørn har 1500,
+ Vi sier at hvis Anne har spillestyrke (rating) 550 og Bjørn har 500,
vil Anne i gjennomsnitt slå Bjørn med 50 poeng hvis de spiller.</p>
<p>Imidlertid er Wordfeud er et spill der tilfeldigheter spiller en viktig rolle,
<p>Ratingen din betyr altså bare noe i forhold til andre spillere, så det
absolutte tallet er ikke så viktig i seg selv. Gjennomsnittlig spillestyrke
- settes i utgangspunktet til 1500 poeng; dette er et helt vilkårlig tall,
+ settes i utgangspunktet til 500 poeng; dette er et helt vilkårlig tall,
men er valgt delvis ut fra tradisjon i andre ratingsystemer. Det kunne like
gjerne vært 0 eller 100000 (selv om det kanskje virker litt dust at
en dårlig spiller har rating 99800 og en veldig god 100200).</p>
finne ekte spillestyrke til relativt nye spillere. Hvis for
eksempel David har banket Emma, Fredrik og Gunnar med 200 poeng
nedi sin avdeling i 8. divisjon, og man antar i utgangspunktet
- at en gjennomsnittlig spiller er 1500 poeng, er det da rimelig
- at David skal ha rating 1700 (som er helt mot toppen av lista)?</p>
+ at en gjennomsnittlig spiller er 500 poeng, er det da rimelig
+ at David skal ha rating 700 (som er helt mot toppen av lista)?</p>
<p>De fleste vil si nei; det er ikke rimelig. Vi uttrykker dette
med en <em>utgangsantagelse</em> (eller engelsk «prior») om
ratingen hos folk generelt, og igjen kommer normalfordelingen inn:</p>
- <p style="text-align: center;"><img src="norm3" style="width: 372px; height: 334px;" alt="Normalfordelingskurve med forventningsverdi 1500" /></p>
+ <p style="text-align: center;"><img src="norm3" style="width: 372px; height: 334px;" alt="Normalfordelingskurve med forventningsverdi 500" /></p>
<p>Kurven her sier rett og slett at <em>det er få av de aller beste og dårligste spillerne</em>;
- de fleste ligger rundt 1500 noe sted. Det er rett og slett ikke veldig
- rimelig at en spiller ligger rundt 1700 i seg selv, og inntil det finnes
+ de fleste ligger rundt 500 noe sted. Det er rett og slett ikke veldig
+ rimelig at en spiller ligger rundt 700 i seg selv, og inntil det finnes
data som sier noe annet (i praksis et relativt stort antall kamper med
- godt resultat) vil dette trekke spilleren nærmere 1500. I stor grad
+ godt resultat) vil dette trekke spilleren nærmere 500. I stor grad
løser dette problemet – det er dog ingen fullstendig fiks.</p>
<h2>Minorization-maximization</h2>
<p>I stedet bruker vi en metode som på fint kalles
<em>cyclic minorization-maximization</em> (syklisk MM, nært beslektet med EM-algoritmene
som er i vid bruk). Den er dog ikke så fryktelig komplisert for vårt tilfelle:
- Først antar vi alle har rating på 1500. Så tar vi Annes rating og
+ Først antar vi alle har rating på 500. Så tar vi Annes rating og
setter henne riktig (dvs., med maksimal rimelighet) i forhold til
- alle andre (for eksempel 50 poeng over Bjørns rating på 1500 hvis
+ alle andre (for eksempel 50 poeng over Bjørns rating på 500 hvis
det er all informasjonen vi har). Så setter vi Bjørn riktig i forhold
til alle andre, og så videre for alle spillere. Nå er antageligvis
Anne plassert litt feil (siden Bjørn har flyttet på seg), så vi oppdaterer