So ändern Sie den ELO-Algorithmus, wenn die Anzahl der Spiele gering ist, um Ausreißer zu reduzieren

8

Ich habe die Standard- ELO- Implementierung entwickelt, die hier zu finden ist , aber das Problem, auf das ich stoße, ist, dass meine Spieler in einer "Saison" nur zwischen 10 und 40 Spiele haben werden. Da meine erste Saison bereits abgeschlossen ist (ich starte gerade mein EIGENES Bewertungssystem für mein Spiel), weiß ich, wie hoch der Rang der ELO-Bewertungen meiner Spieler sein sollte oder zumindest sehr nahe daran. Mein Problem ist, dass ich nach der Implementierung dieses Basisalgorithmus einige Ausreißer habe, die weit entfernt sind.

Da ich nur 10 bis 40 Spiele habe, war mein erster Gedanke, um diese Situation zu beheben, eine Schleife um diesen Prozess zu implementieren, wobei die ELO-Bewertung des Endergebnisses aus einem Zyklus genommen und als Ausgangspunkt für den nächsten Zyklus (für jede Person) verwendet wurde Spieler). Wiederholen Sie diese Zyklen dann, bis die durchschnittliche oder maximale Abweichung der ELO-Bewertungen von früheren zu aktuellen Zyklen nicht größer als X ist. Dies hat dazu beigetragen, einige der großen Ausreißer zu beheben. Es gibt immer noch einige kleinere Ausreißer, mit denen ich mich immer noch nicht wohl fühle ...

Als Beispiel habe ich 7 Divisionen, für Division 1 wird der Typ, der basierend auf seinem ELO auf Platz 1 stehen sollte, auf Platz 5, für Division 2 auf Platz 3. Die Top 10 für jede Division liegen tatsächlich ziemlich nahe beieinander, mit Ausnahme dieser Art von Ausreißern.

Wie kann ich meinen Algorithmus ändern oder wie kann ich versuchen, die Ausreißer zu reduzieren?

Randnotiz Nr. 1. Für die Division 1 wird der Typ, der die Nummer 1 sein sollte und die Nummer 5 wird, vom anderen Bewertungssystem für die gesamte Saison auf Platz 1 eingestuft. Ich weiß nur nicht, wie das berechnet wird (und es kann nicht berechnet werden, es könnte darauf basieren, ich weiß, dass x Spieler so gut ist, also ist er auf Platz 1).

Randnotiz Nr. 2. Ich habe den Algorithmus geändert. Ich möchte die Gewinne / Verluste danach "gewichten", wie dominant sie waren. Wenn Spieler A Spieler B mit 20: 0 schlägt, möchte ich, dass dies stärker gewichtet wird, insbesondere wenn die Bewertungen sehr nahe beieinander liegen. Wenn die Bewertungen jedoch weiter voneinander entfernt sind (wobei a bereits größer als B ist), sollte die ELO-Änderung nicht erfolgen so viel sowieso, da erwartet wurde, dass sie überhaupt gewinnen. Also habe ich, anstatt den k-Faktor / Wert von 400 wie in der ursprünglichen Formel zu verwenden, diesen geändert 100 + ((score difference) * 2). Der maximale k-Faktor wäre also 140 (20-0 ist der größte Gewinn, multiplizieren Sie mit 2, addieren Sie zu 100).

Welche andere Strategie könnte ich implementieren, um Gewichtsergebnisse einzubeziehen und einige dieser Ausreißer zu korrigieren?


Ohne die Daten vor mir zu haben (alles ist zu Hause), werde ich versuchen, das Szenario zusammenzufassen ...

Erste Liga

#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

Wobei der Typ Nr. 5 gerade die Nummer 1 besiegt hat, um das Turnier zu gewinnen, und sein "Werk" vollständiger zu sein scheint als der Typ Nr. 1 (auch bekannt als er gegen ihn gespielt hat und stärkere Gegner besiegt hat als der Typ Nr. 1). Vielleicht liegt es daran, dass der "gewichtete" k-Faktor dies abwirft, weil # 5 viele Siege hatte, die nur um 2 bis 5 Punkte lagen, während # 1-Siege mit einem höheren Vorsprung lagen, sagen wir 5 bis 10 Punkte.

Vielleicht muss ich nur mit meinem "gewichteten" k-Faktor herumspielen, um zu sehen, ob ich meine berechneten Ergebnisse näher an die tatsächlichen Ergebnisse bringen kann ...

Gander
quelle
Was ist, wenn Sie gerade die Ausreißer identifiziert und rausgeworfen haben?
Robert Harvey
@RobertHarvey Ich möchte, dass der Prozess vollständig automatisiert wird ... wenn ich Ihren Vorschlag richtig verstehe.
Ganders
@ RobertHarvey und ich können einen Spieler nicht einfach "rausschmeißen", er hat einen legitimen Rang und sollte die Nummer 1 sein (der erste Beispiel-Typ)
Ganders
1
Dann ist er kein Ausreißer ... oder? Ich habe deine Frage zu Meta gesehen. FWIW, das Problem bei dieser Frage ist, dass es schwierig ist, sich vorzustellen, wovon Sie sprechen. Vielleicht könnten Sie einige tabellarische Daten veröffentlichen, die wir uns ansehen können?
Robert Harvey
MS hat ein wenig auf ihrem Xbox-Ranking-System veröffentlicht: research.microsoft.com/en-us/projects/trueskill . Wahrscheinlich kann ein Teil davon auf Ihr Spiel angewendet werden.
Patrick

Antworten:

1

Folgendes habe ich getan, um das Szenario der Ausreißer zu lösen. Ich simuliere meine gesamte Saison neu und weiß, welche Spieler am Ende der regulären Saison und des Turniers zum Saisonende eingestuft werden sollten. Wenn es im Saisonende-Turnier "Überraschungen" gibt, wird es natürlich nicht genau herauskommen, aber ich denke, dies hat mir die besten Ergebnisse gebracht, die für ALLE Spieler funktionieren.

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;
    }
Gander
quelle
1
+1 für die Beantwortung Ihrer eigenen Frage und die Bewertung als gut. Das bringt es aus der "unbeantworteten" Liste heraus, wodurch ich zu jemand anderem übergehen kann, der Hilfe benötigt.
Guy Schalnat