Luokitusten säätäminen korottamalla kerhonsa pelaajia ei ole aivan
yksinkertaista. Kun pelaajamäärä on vähänkään suurempi, ongelmia
tuottaa se, että sillä, jolla korotusvastuu on, ei ole riittävää
omakohtaista tietoa kaikkien korotustarpeessa olevien pelaajien
nykyisestä pelitaidosta. 

[Markku Jantunen] ja minä kävimme sekä täällä wikissä että offlinenä
hieman keskustelua asian tiimoilta. Markku esitti, että pelaajien
välisten keskinäisten tasoituskivien määrän taulukoimalla voidaan
ainakin suuntaa-antavasti arvioida korotustarpeessa olevia pelaajia ja
korotusten suuruutta. Itse olin aikaisemmin käyttänyt samankaltaista
menetelmää [Oulun Goonpellaajien|Oulun Goonpellaajat] alkuaikoina,
kohtalaisin tuloksin. Esitän seuraavassa hieman viritetyn version
algoritmista luokitusten arvioimiseen siitä, minkä kukin pelaaja
luulee olevan oikea tasoitus suhteessa muihin.

Alla olevat esimerkit on kirjoitettu myös matlab (octave) -koodina,
joka toivottavasti auttaa insinöörejäkin ymmärtämään, mitä tarkoitan. 

Jokaiselta pelaajalta kysytään, mikä hänen mielestään on sopiva
tasoitus kunkin muun pelaajan kanssa, ja tulokset laitetaan
neliömatriisiin siten, että jokaisella rivillä on pelaajan näkemys
tasoituskivista sen sarakkeen kohdalla, jonka kanssa samannumeroinen
rivi vastaa k.o. pelaajan mielipiteitä. Mikäli arvausta ei ole
saatavissa, laitetaan arvoksi pelaajien luokitusero. Valkoisen antama
tasoitus on negatiivinen luku, mustan vastaanottama positiivinen.

Alla matriisiin __H__ on kirjoitettu neljän täysin fiktiivisen pelaajan
näkemykset siitä, mikä on tasaväkisen pelin aikaansaava tasoituskivien
määrä keskinäisissä peleissään. Huomataan, että pelaajat 1 ja 2
pelaavat keskenään tasa-avauksella ja pelaajat 3 ja 4 ovat
ensiksimainittuja joitakin kiviä heikompia.

{{{
>> H = [ 0 0 -8 -5; 0 0 -8 -4; 8 7 0 2; 5 5 -2 0]

H =

     0     0    -8    -5
     0     0    -8    -4
     8     7     0     2
     5     5    -2     0

}}}

Tarkoituksena on seuraavaksi laskea __kunkin__ __pelaajan__
__antama__ __tai__ __saama__ __keskimääräinen__
__tasoitus__. Tämän laskemiseksi matriisista __H__ vähennetään sen
transpoosi, jonka jälkeen rivit lasketaan yhteen ja tulos jaetaan
pelaajien määrällä kertaa kaksi. (Koska vähennettäessä transpoosi
luvut kaksinkertaistuvat.)


{{{

>> D = H - H'

D =

     0     0   -16   -10
     0     0   -15    -9
    16    15     0     4
    10     9    -4     0

>> h_rel = D * ones(length(D),1) / (2*length(D))

( ones(length(D),1) = [1 1 ... 1 1]' )

h_rel =

   -3.2500
   -3.0000
    4.3750
    1.8750

}}}

Nyt vektorissa __h_rel__ on jokaisen pelaajan antama keskimääräinen
tasoitus. Miten tämä liittyy pelaajien luokituksiin? Kun lasketaan
__pelaajien__ __keskimääräinen__ __luokitus__, on keskimääräinen
tasoituskivien määrä suoraan suhteessa tähän. Kirjoitetaan pelaajien
nimelliset luokitukset vektoriin __r__ ja lisätään sen keskiarvo
vektoriin __h_rel__.

{{{

>> r = [2 3 11 8]'

r =

     2
     3
    11
     8

>> r_est = h_rel + mean(r)

r_est =

    2.7500
    3.0000
   10.3750
    7.8750

}}}

Nyt vektorissa __r_est__ on estimaatti kunkin pelaajan
luokituksesta. Vektori __r_est__ on minimietäisyydellä nimellisistä
luokituksista. Mikäli nimelliset ja arvioidut luokitukset poikkeavat
toisistaan, on syytä harkita korotuksia. Korotusmääriä voi kokeilla
muuttamalla nimellisten luokitusten arvoja vektorissa __r__ ja
esim. laskemalla keskimääräisen neliövirheen.

{{{
>> r_mse = sum((r_est - r).^2 ) / length(r_est)

r_mse =

    0.2422

}}}

Edellisestä menetelmästä täytyy huomata, että se perustuu kahteen
oletukseen: 

# Pelaajien luokitusero ja käytetty tasoituskivien määrä ovat
  toisiansa vastaavia, mikäli luokitukset ovat oikein.
# Pelaajat osaavat arvioida oikean tasoituskivien määrän
  suurinpiirtein oikein


--[Paavo Pietarila] 12-01-03




Tietenkin tämä herättää kysymyksen siitä miten arvioida tasoituskivien määrä uudelle pelaajalle. Tasoituskivien tarkoituksena on luoda tilanne, jossa voittotodennäkyisyys __p=0.5__ kun pelataan oikeilla tasoituksilla. KGS:n, ELO-järjestelmän ja GOR-järjestelmän pohjana on oletus, jonka mukaan pelaajan X voittotodennäkyisyys voidaan arvioida seuraavalla kaavalla:

''p=1/(1+A^((rank(Y)-rank(X)+tasoitus)*K))''

jossa A ja K ovat eri vakioita. ELO-järjestelmässä A=10 ja K=1/400, kun taas kgs-järjestelmässä A=''e'' ja K~1, luokituksesta riippuen. ELO- ja GOR-järjestelmissä luokitukset vaihtelevat välillä 100-3000, kun taas KGS-järjestelmä pyrkii käyttämään luokituksia, jotka vastaavat kyu ja dan-arvoja.

Pelaajan luokitus arvioidaan täten tilastollisesti pitämällä lukua pelatuista peleistä sekä valitsemalla se luokitus, jonka avulla yhteenkerrottu todennäköisyys tuloksille on mahdollisimman pieni. 

Käyttäkäämme esimerkkiä.

Yllämainittuun go-kerhoon, jossa pelaajilla on luokitukset 3k, 3k, 8k ja 10k liittyy uusi pelaaja jonka nimellinen vahvuus on tuntematon.

Hän ottaa 3k-pelaajalta 9 kiveä ja häviää kaksi peliä. 10k-pelaajaa vastaan hän pelaa ilman komia ja voittaa yhden pelin, häviten toisen. 8k-pelaajaa vastaan hän pelaa yhden pelin kahden kiven tasoituksella ja voittaa pelin.

Mikä on todennäköisin luokitus?

Annetaan muuttujan x kuvata pelaajan luokitusta. 

Todennäköisyys kahdelle tappiolle 3k-pelaajaa vastaan on (1-(1/(1+''e''^(12-x))))^2.
Todennäköisyys yhdelle voitolle 8k-pelaajaa vastaan on (1/(1+''e''^(10-x))).
Todennäköisyys yhdelle voitolle 10k-pelaajaa vastaan on (1/(1+''e''^(11-x)).
Todennäköisyys yhdelle tappiolle 10k-pelaajaa vastaan on 1-(1/(1+''e''^(11-x)).

Kertomalla nämä toisillaan saadan funktio, jonka maksimiarvo sijaitsee todennäköisimmän luokituksen kohdalla.
Tässä tapauksessa maximiarvo saadaan luokitukselle 11k. 

Tätä menetelmää voidaan käyttää myös silloin, kun kaksi pelaajaa pelaavat useampia pelejä toisiaan vastaan eri tasoituksille.

--[Markus Koivisto] 13-04-2005