Bradley-Terry's Model Ceci est un modèle de «force». En termes simples, le concept est que chaque «force» peut être quantifiée à partir des résultats du match. Les documents suivants ont été utiles, veuillez donc consulter ici pour plus de détails. Méthode d'évaluation quantitative de la "force" et de son application
Il y a n éléments (équipes et individuels) et une sorte de match est joué. Le match est un match d'un élément à un élément, et le résultat n'est qu'une victoire ou une défaite contre un élément. La "force" de chaque élément est mesurée à partir des résultats de plusieurs batailles. Ici, en supposant que la probabilité que l'élément i gagne l'élément j est Pij, pour toutes les combinaisons, Pij = πi / πi + πj (1) Introduisez πi. L'expression relationnelle de l'équation (1) est appelée le modèle de Bradley-Terry (BT). Dans le modèle BT, πi peut être considéré comme représentant la force de l'élément i.
Je me réfère au contenu de la conférence au Data Mining Study Group based on Statistical Processing and Machine Learning # 03 auquel j'ai assisté l'autre jour. Voici une implémentation Python du modèle de Bradley-Terry. (Le nombre attribué à ws est une liste du nombre total de victoires des 6 équipes de la Ligue Se en 2014, à l'exclusion des résultats du jeu d'échange. Pour plus de commodité, le tirage au sort est compté comme 0,5.) Le thêta obtenu ici est la valeur numérique de la "force" de chaque équipe.
import numpy as np
theta = np.ones(6)/6.0 # \valeur initiale thêta
t = np.zeros(6)
r = 24.0 #Nombre de matchs
ws = np.array([66.5, 66.5, 66, 56.5, 55, 50.5]) #Nombre total de victoires
for iloop in range(0, 100):
for i in range(0,6):
acc = 0 #Accumulateur pour le total
for j in range(0,6):
if (j == i):
pass
else:
acc += r / (theta[i]+theta[j])
t[i] = ws[i]/acc
s = sum(t)
for i in range(0, 6):
theta[i] = t[i] / s
En référence au modèle de Bradley-Terry ci-dessus, j'ai essayé de représenter graphiquement la transition de la Se League sur 5 ans avec matplotlib.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import os
theta = np.ones(6) / 6.0
t = np.zeros(6)
r = 24.0
teams = [u"Géant", u"Hanshin", u"Hiroshima", u"Chunichi", u"Yokohama", u"Yakult"]
colors = ["#f27b00", "#ffff00", "#ff0000", "#002468", "#044a90", "#111c3c"]
scores = [[67.5, 68, 48, 68.5, 42.5, 65.5], [66, 61, 57, 66, 43.5, 66.5], [76.5, 51.5, 55.5, 69, 43, 64.5], [74, 62.5, 58.5, 57.5, 55, 51.5], [66.5, 66.5, 66, 56.5, 55, 50.5]]
years = ["2010", "2011", "2012", "2013", "2014"]
points = [[], [], [], [], [], []]
def reset():
global theta
theta = np.ones(6) / 6.0
def bradley_terry(ws):
for iloop in range(0, 100):
for i in range(0, 6):
acc = 0
for j in range(0, 6):
if i == j:
pass
else:
acc += r / (theta[i] + theta[j])
t[i] = ws[i] / acc
s = sum(t)
for i in range(0, 6):
theta[i] = t[i] / s
if __name__ == '__main__':
for score in scores:
reset()
bradley_terry(score)
for i in range(0, 6):
points[i].append(theta[i])
for i in range(0, 6):
data = np.loadtxt(points[i])
plt.plot(
data,
linestyle="-",
color=colors[i],
label=teams[i],
linewidth=2
)
plt.ylim(0, 0.5)
X = np.arange(len(years))
plt.xticks(X, years)
plt.tick_params(labelleft="off")
plt.xlabel("Year")
plt.ylabel("BradleyTerry Rate")
plt.title("Central League")
plt.grid(True)
plt.legend(loc="best")
plt.rcParams.update({"font.size": 20})
os.chdir("graph/")
plt.savefig("central.eps")
plt.show()
Il s'est avéré être quelque chose comme ça. ・ Force stable des géants ・ Chunichi, l'épaule droite de Yakult vers le bas ・ Hiroshima et Yokohama se lèvent Je pense que vous pouvez lire ...
Si vous essayez la même chose dans la Pa League, le graphique sera le suivant.
Par rapport au graphique de la Ligue Centrale, il est caractéristique que 6 lignes brisées soient foirées. Vous pouvez souvent exprimer le «pa mixte» qui se produit lorsque la classe AB est complètement remplacée en 2013 et 2014!
Recommended Posts