Come modificare l'algoritmo ELO quando il numero di giochi è basso per ridurre i valori anomali

7

Ho sviluppato l'implementazione standard ELO che può essere trovata qui , ma il problema che sto incontrando è che i miei giocatori avranno solo tra 10 e 40 giochi in una" stagione ". Dal momento che la mia prima stagione è già terminata (sto solo iniziando il mio sistema di valutazione PROPRIO per il mio gioco), so quale dovrebbe essere il punteggio dei miei giocatori ELO o, per lo meno, molto vicino a questo. Il mio problema è, dopo aver implementato quell'algoritmo di base, ho alcuni valori anomali che sono lontani.

Dato che ho solo da 10 a 40 giochi, il mio primo pensiero per porre rimedio a questa situazione è stato quello di implementare un ciclo attorno a questo processo, prendendo il punteggio ELO del risultato finale da un ciclo e utilizzandolo come punto di partenza per il ciclo successivo ( per ogni singolo giocatore). Quindi, ripetere questi cicli fino a quando la deviazione media o massima delle valutazioni ELO dai cicli precedenti a quelli attuali non è superiore a X. Ciò ha contribuito a risolvere alcuni dei grandi valori anomali. Ci sono ancora alcuni piccoli outlier che non sono ancora a mio agio con ...

Ad esempio, ho 7 divisioni, per la divisione 1, il ragazzo che dovrebbe essere classificato # 1 in base al suo ELO, finisce per essere classificato 5 °, per la divisione 2, il ragazzo che dovrebbe essere classificato # 1 è il 3 °. I primi 10 circa di ogni divisione sono in realtà piuttosto vicini, tranne che per questi tipi di outlier.

Come posso modificare il mio algoritmo o quale approccio posso adottare per provare a ridurre i valori anomali?

Nota a margine n. 1. Per la divisione 1, il ragazzo che dovrebbe essere il n. 1, che finisce n. 5, è in realtà il primo classificato per l'intera stagione con l'altro sistema di valutazione. Non so come viene calcolato (e non può essere calcolato, potrebbe essere basato su, so che x player è così buono, quindi è classificato # 1).

Nota a margine n. 2. Ho apportato una modifica all'algoritmo. Voglio "appesantire" le vittorie / perdite di quanto fossero dominanti. Se il giocatore A batte il giocatore B 20-0, lo voglio pesato più pesantemente, specialmente se le valutazioni sono molto vicine, ma se le loro valutazioni sono più lontane (dove a è già maggiore di B), allora il cambio ELO non dovrebbe essere tanto in ogni caso dal momento che ci si aspettava di vincere in primo luogo. Quindi, quello che ho fatto è stato invece di usare il fattore k / valore di 400 come usa la formula originale, l'ho cambiato in 100 + ((score difference) * 2) . Quindi il fattore k massimo sarebbe 140 (20-0 è la vincita più grande, moltiplicare per 2, aggiungere a 100).

Quale altra strategia potrei implementare per includere i risultati del peso, oltre a correggere alcuni di questi valori anomali?

Senza avere i dati di fronte a me (tutto è a casa), proverò a riassumere lo scenario ...

Divisione I

#1 Elo Rating of 2250
#2 Elo Rating of 2200
#3 Elo rating of 2190
#4 Elo rating of 2175
#5 Elo rating of 2170

Dove il quinto ragazzo ha battuto il numero 1 per vincere il torneo, e il suo "corpo di lavoro" sembra più completo del ragazzo numero uno (alias ha giocato contro e ha battuto avversari più forti rispetto al primo). Forse è perché il fattore "ponderato" di K sta gettando via questo perché il # 5 aveva molte vittorie che erano solo da 2 a 5 punti, dove le vincite # 1 erano di un margine più alto, diciamo da 5 a 10 punti.

Forse ho solo bisogno di giocare con il mio fattore "ponderato" k per vedere se riesco a ottenere i risultati calcolati più vicino ai risultati effettivi ...

    
posta ganders 03.04.2014 - 15:16
fonte

1 risposta

1

Ecco cosa ho fatto per cercare di risolvere lo scenario dei valori anomali. Ri-simulando la mia intera stagione, sapendo cosa dovrebbe essere classificato ogni giocatore alla fine della stagione regolare, e il torneo di fine stagione. Ovviamente quando ci sono "sconvolgimenti" nel torneo di fine stagione, non verrà fuori esattamente, ma sento che questo mi ha dato i risultati più vicini che funzionano per TUTTI i giocatori.

private double GetKFactor(double winnerRating, double scoreDifference, int winningPlayerMatchCount)
    {
        var kFactor = 32.0;

        if (winningPlayerMatchCount >= 11 && winningPlayerMatchCount < 21)
            kFactor = kFactor * .75;
        else if (winningPlayerMatchCount < 11)
            kFactor = kFactor * .5;

        return kFactor + scoreDifference;
    }
    
risposta data 24.06.2014 - 14:49
fonte

Leggi altre domande sui tag