Cómo modificar el algoritmo ELO cuando el número de juegos es bajo para reducir los valores atípicos

7

He desarrollado la implementación estándar de ELO que se puede encontrar here , pero el problema que tengo es que mis jugadores solo tendrán entre 10 y 40 juegos en una" temporada ". Desde que mi primera temporada ya se ha completado (ahora mismo estoy empezando mi sistema de calificación PROPIO para mi juego), sé cuál debería ser la clasificación de ELO de mis jugadores, o al menos muy cercana a eso. Mi problema es que, después de implementar ese algoritmo base, tengo algunos valores atípicos que están muy lejos.

Ya que solo tengo de 10 a 40 juegos, mi primer pensamiento para remediar esta situación fue implementar un bucle alrededor de este proceso, tomando el resultado final de la clasificación ELO de un ciclo, y usarlo como punto de partida para el siguiente ciclo ( para cada jugador individual). Luego, repita estos ciclos hasta que la desviación promedio o máxima de las calificaciones de ELO de los ciclos anteriores a los actuales no sea mayor que X. Esto ayudó a resolver algunos de los grandes valores atípicos. Todavía hay algunos valores atípicos más pequeños con los que todavía no me siento cómodo ...

A modo de ejemplo, tengo 7 divisiones, para la división 1, el tipo que debe ocupar el puesto número 1 según su ELO, termina ocupando el quinto lugar, para la división 2, el tipo que debe ocupar el puesto número 1 es el tercero. Los 10 primeros más o menos para cada división son en realidad bastante cercanos, a excepción de estos tipos de valores atípicos.

¿Cómo puedo modificar mi algoritmo o qué enfoque puedo tomar para intentar reducir los valores atípicos?

Nota al margen # 1. Para la división 1, el tipo que debería ser el # 1, que termina en el # 5, en realidad ocupa el puesto # 1 para toda la temporada por el otro sistema de clasificación. Simplemente no sé cómo se calcula ese (y puede que no se calcule, podría basarse, sé que x jugador es tan bueno, por lo que ocupa el puesto número 1).

Nota al margen # 2. He hecho una modificación al algoritmo. Quiero "ponderar" las victorias / pérdidas por lo dominantes que fueron. Si el jugador A supera al jugador B 20-0, quiero que se le aplique una mayor ponderación, especialmente si las calificaciones están muy cerca, pero si sus calificaciones están más separadas (donde a ya es mayor que B), el cambio de ELO no debería ser de todos modos ya que se esperaba que ganaran en primer lugar. Entonces, lo que hice fue que, en lugar de usar el factor / valor k de 400 como la fórmula original, lo cambié a 100 + ((score difference) * 2) . Entonces, el factor k máximo sería 140 (20-0 es la ganancia más grande, se multiplica por 2, se agrega a 100).

¿Qué otra estrategia podría implementar para incluir resultados de peso, así como corregir algunos de esos valores atípicos?

Sin tener los datos frente a mí (todo está en casa), intentaré resumir el escenario ...

División 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

Donde el chico # 5 simplemente venció al # 1 para ganar el torneo, y su "cuerpo de trabajo" parece más completo que el chico # 1 (también conocido como contra el que jugó, y venció a los oponentes más fuertes que el chico # 1). Tal vez sea porque el factor k "ponderado" está desechando esto porque # 5 tuvo muchas victorias que fueron solo de 2 a 5 puntos, donde las victorias # 1 fueron por un margen más alto, digamos de 5 a 10 puntos.

Tal vez solo necesito jugar con mi factor k "ponderado" para ver si puedo acercar mis resultados calculados a los resultados reales ...

    
pregunta ganders 03.04.2014 - 15:16

1 respuesta

1

Esto es lo que he hecho para intentar resolver el escenario de los valores atípicos. Re-simulando toda mi temporada, sabiendo que cada jugador DEBE estar clasificado al final de la temporada regular, y el torneo que termina la temporada. Obviamente, cuando hay "sorpresas" en el torneo de final de temporada, no será exacto, pero creo que esto me dio los resultados más cercanos que funcionan para TODOS los jugadores.

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;
    }
    
respondido por el ganders 24.06.2014 - 14:49

Lea otras preguntas en las etiquetas