From b9f594c6d310024a0e0432787d27699655e1e163 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Thu, 22 Mar 2012 01:21:15 +0100 Subject: [PATCH] Fix a leftover 1700 value in the README. --- bayeswf.cpp | 2 +- mcwordfeud.cpp | 2 +- www/index.pl | 4 ++-- www/norm3.png | Bin 3006 -> 3001 bytes www/rating.pl | 2 +- www/ratings-explained.html | 20 ++++++++++---------- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/bayeswf.cpp b/bayeswf.cpp index f94b1d3..cab5afc 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 diff --git a/mcwordfeud.cpp b/mcwordfeud.cpp index 28a2a44..63b98e1 100644 --- a/mcwordfeud.cpp +++ b/mcwordfeud.cpp @@ -107,7 +107,7 @@ int main(int argc, char **argv) exit(1); } if (ret < 2) { - rating = 1500.0f; + rating = 500.0f; } players.push_back(buf); diff --git a/www/index.pl b/www/index.pl index ec7318a..5291632 100755 --- a/www/index.pl +++ b/www/index.pl @@ -61,7 +61,7 @@ EOF 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; } @@ -92,7 +92,7 @@ EOF 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; diff --git a/www/norm3.png b/www/norm3.png index 105537b104c661a012e3572502b56ef6fcff8a83..e5dfc3f89c40714cc88bb61173e1c7c741ea930c 100644 GIT binary patch literal 3001 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 H?K%Emg{5Ok literal 3006 zcmai$30RVO9>-szpit47P&75m*)6YZj`AQ+ys}1gtWDcg>>6v!BYDd!P$N2Y%xTj! z(*Vn{Q*!jt0nbUzY+8K7tTj@zNudRK~ zWQ1FR0|3A%c(Z>v0H8qlO<9V8TP~g$DTY5#wD2G@P$jf_1OLG6*&5^zXpk4DsqzBc zvMg!yP8tB<+mSb_&=GG5H)6rykO1rp^rxS?uMU2e_7HBe00SaHzr^_X{Rtr8m%M*B zxPRZOl!M@bRYAcaVG-GQA^;dz1pE7LPkk=y7l;4qW*+#B{|7a7C+&Q2(X#5zR%LUC z?%d={@kWMgs4i;4^WK_Di-c|&KHYWHzRN7)1(;d zFzNBu!g8OZIQkGdrNYh*JYh)Uz@4+maNlTLKkc!R_IK;oEQ+gG_IQH~@9*sKc4f

k z-~t+Ij$;6dRRtYdc|0QL1bJ;c2ThEYF->~n5TNE@?3#Z~voJUNtU+$p8dky+;yRFM z_CJ?LHxtX4>|^=2`AOfOqspaqaiPJ=@5~}=Aw`Sbb4;y;vOvT`F!t)a=LTO7+y!-Y^BdAQ^NOxz0WHNsi5 zU`-6%9WKostbM^&c%}1e>QT6|90YJ@%lf*Et<%~s02N++|=KRUH%VZe=LnwaY*CWJEV-03Co?G7L^bL zJ5=a(HOLoquAhE5y4n82$XZyE^0#P=`pCZgzrArbOJ>YXTIK%O55<+`iaKoX4YM%mNeA#VV_aFT z@oddDhx=9pQXa-ra(u?>of;^LsRAuw#YRebjGiAiJmG!!6Bo;(Y;sm(O9`TaeNLh9B8Q&``&mu=iHySrP2KaK9@6lCR zH!#MU6T=YW6ysy*SMy;OjhFb}w zLW3q*HvP^FiY0u_oOc^gWv?$QK~*&f?;rmzVUW;7HTqla?z~Q5kum8mp0yH$Ox^83 z0=%BIwyD$@mDK)JMbV}VOOtx2zZYwmesG_Srg_7C?a)VIM{KayF5bP1$3eqd`i5Ey zsd1#pMo7K1-;IfHcZC1GyGI)zu-OqxW?N;;M{ny9w;tXdnhDF0ARzP7#-k$_3cd#6s;2~qYqJCGGK`LZFL@WZ3A3)5Tk>c(}Dzg{uDkm35;glU6# z`|v$mILs{H2N?9T0yvOH?U$V*)2lanXm8|dRb^79*sc+tc! zWlct5((NnYgvdWnpPPIh$Ik`=1!>V~H<@eYi-@5V(D z|CkSV@``hJ@{s|nr;gwvyxGF)C0dSBT|2iR5bi=|p%A8>Ogq z{(Z=!h=i{O?taT{7@d|B7$C}QJ;Lo_Q+=_zy{k+?4wRCQu~i6k+#p+?chtV@_=S8p zzMw5VN;~DwpTY@YQe4x>&)U<7yzl@bP`v{d6xnLIHEK1_n_ad5)^esK=Wey_h zGadbDLw|7nzxm)mL2u#3NN)ZRYz85@g}TmRn)er}v(t&x>hALYR^hT8b>gcBpIe`a zN`2zV;J3sCZRz@IXDpYTl4A3@G~X{{LnD&MEbze&Tx!hrYtEd7&$})4s6%D~3-iyV6)47> zN))Eq_$qKEffVnKNLqO_A5VFRSd`cPk*-q#t(RBrps32lI-xx>QzJt2&Sb6pGs4k` zboc%{7q=mq)q;Y~l5N`H)Bgh5^(`E;h^t$aTRH~k^xlAIM=k05#|#p5Og>+Zgb8wg zKs>)AM0)C$_%`HuwE6)nKpzb7E#x^7a3bmM4{`7K6R#YQ5K%sh;RhKq@k*5~fDBfc z0A&}6_-!dp@pp8?70V2=o%2^T6J~z?C}y}@T~Y+>qlY#WdJXE`vqKVX07ung2e2~Q zkmR&&q--<_PApEx%@L2+Cy!0L-Vhm)Os>Nh0jq95?26mc*2)sYjGpd5I=Ax0HIMOS zFP-fcxuqXY&n&6GG%!>k>d~CN+A^IuGVki;a_(~GHqBsx+iCpEf?xRC94lN?Mn1VQ zrE;GQGPynfMUr77-G(`-XnU$ED;YvB;Xszgf@-W=w>tFhnTCN)YSCm?Mx%F4v-%4A!Z}}c{bZ^bK0szi#`?rw*0rI7^|$DTfsJZW z?*q>P_N74vue+-^-}hGih&wSD-|ccr7|-n3JoCcRB0R!lI| z?=^$J(%zNrgNz^x}4#~Cdt}C7Cw9cKQ_+7Jq zkAHn|{a!gOnbqC(l&29}$K9FzlH;|OPPy;-^ztUk;ClOBd#|cp1bYDS~X`^NPLUm8XAYv7wS N5F9}9uOi2u_zeXWZHfQ@ diff --git a/www/rating.pl b/www/rating.pl index 89c75b9..d1ba945 100755 --- a/www/rating.pl +++ b/www/rating.pl @@ -66,7 +66,7 @@ printf <<"EOF", $params{-3}, $match_stddev;

  • 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}.
  • -
  • Rimelighetfunksjon, prior: Normalfordeling med µ=1500, σ=%.1f (est.)
  • +
  • Rimelighetfunksjon, prior: Normalfordeling med µ=500, σ=%.1f (est.)
  • Rimelighetfunksjon, per kamp: Normalfordeling med µ=(score1 - score2), σ=%.1f (est.)
  • Vekting: Inneværende sesong samt de tre siste vektes fullt ut (likt med prior). Deretter eksponentielt synkende vekting, med diff --git a/www/ratings-explained.html b/www/ratings-explained.html index ace8996..f48e76e 100755 --- a/www/ratings-explained.html +++ b/www/ratings-explained.html @@ -25,7 +25,7 @@ helt vanlig tall, og det er denne vi prøver Ã¥ mÃ¥le ut fra resultatene vi ser. (Vi prøver altsÃ¥ eksplisitt ikke Ã¥ 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.

    Imidlertid er Wordfeud er et spill der tilfeldigheter spiller en viktig rolle, @@ -44,7 +44,7 @@

    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).

    @@ -107,20 +107,20 @@ 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)?

    + at en gjennomsnittlig spiller er 500 poeng, er det da rimelig + at David skal ha rating 700 (som er helt mot toppen av lista)?

    De fleste vil si nei; det er ikke rimelig. Vi uttrykker dette med en utgangsantagelse (eller engelsk «prior») om ratingen hos folk generelt, og igjen kommer normalfordelingen inn:

    -

    Normalfordelingskurve med forventningsverdi 1500

    +

    Normalfordelingskurve med forventningsverdi 500

    Kurven her sier rett og slett at det er fÃ¥ av de aller beste og dÃ¥rligste spillerne; - 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.

    Minorization-maximization

    @@ -138,9 +138,9 @@

    I stedet bruker vi en metode som på fint kalles cyclic minorization-maximization (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 -- 2.39.2