Elo評分演算法原理與實現

2021-07-30 19:29:31 字數 2682 閱讀 3672

《社交網路》裡的mark zackburg被女朋友甩後,在舍友的啟發下,充分發揮了技術宅男自娛自樂的惡搞天分,做出了facemash**,對學校女生的相貌進行排名打分,結果**訪問流量過大,直接把學校網路搞癱瘓了。facemask大受歡迎的關鍵就在於zackburg**eduardo寫在窗戶上的排名公式,看電影之時就對這個排名公式非常感興趣,上網了解下,才發現這條公式就是大名鼎鼎的elo等級分制度。elo的應用非常廣泛,大部分棋模擬賽,現在流行的modb遊戲,像11平台的dota天梯系統,都是採用elo等級分。

elo等級分制度是由匈牙利裔美國物理學家elo建立的乙個衡量各類對弈活動選手水平的評分方法,是當今對弈水平評估的公認的權威方法。被廣泛應用於西洋棋、圍棋、足球等運動,以及很多網遊與電子競技產業。遊戲界比較著名的應用有: wow(魔獸世界)、dota、lol。

elo計算方法

ra:a玩家當前的積分

rb:b玩家當前的積分

sa:實際勝負值,勝=1,平=0.5,負=0

ea:預期a選手的勝負值,ea=1/(1+10^[(rb-ra)/400])

eb:預期b選手的勝負值,eb=1/(1+10^[(ra-rb)/400])

因為e值也為預估,則ea+ eb=1

r』a=ra+k(sa-ea)

r』a:a玩家進行了一場比賽之後的積分

其中 k 值是乙個常量係數,按照西洋棋裡的標準, k 值對於大師選手為16,對於一般選手是32。k值的大小直接關係到一局遊戲結束,根據勝負關係計算出的積分變化值。

關於k值

k值是乙個極限值,代表理論上最多可以贏乙個玩家的得分和失分,k/2就是相同rating的玩家其中一方勝利後所得的分數。西洋棋大師賽中,k=16;在大部分的遊戲規則中,k=32。通常水平越高的比賽中其k值越小,這樣做是為了避免少數的幾場比賽就能改變高階頂尖玩家的排名。

關於分母400

公式ea和eb中分母的400是怎麼來的呢?為何是400,不是200、100或者是其他?

根據公式可以得出,當k值相同的情況下,越高的分母,越低的積分變化。總體來說400是乙個平衡的、萬金油的值、讓多數玩家積分保持 標準正態分佈 的值。具體可以參考:

例項說明

若當前a玩家積分為1500,b玩家積分為1600

預估a玩家的勝負值: ea = 1/(1+10^[(1600-1500)/400])≈0.36

預估b玩家的勝負值: eb = 1-ea = 1-0.36 = 0.64

假設a玩家獲勝,實際勝負值為sa = 1

a玩家最終得分為 :r』a = 1500 + 32*(1-0.36) = 1500+20.5 = 1520

a玩家贏20分,b玩家輸20分。

假設b玩家獲勝,實際勝負值為sa = 1

b隊最終得分為 r』b = 1600 + 32*(1-0.64) = 1600 + 11.52 = 1612,b玩家贏12分,a玩家輸12分。

class elorating:

elo_result_win = 1

elo_result_loss = -1

elo_result_tie = 0

elo_rating_default = 1500

ratinga = 0

ratingb = 0

def __init__(self, ratinga = elo_rating_default, ratingb = elo_rating_default):

self.ratinga = ratinga

self.ratingb = ratingb

def setresult(self, result):

scoreawin = self.computescore(self.ratinga, self.ratingb)

scorebwin = self.computescore(self.ratingb, self.ratinga)

score_adjust = 0

if result == self.elo_result_win:

score_adjust = 1

elif result == self.elo_result_loss:

score_adjust = 0

else:

score_adjust = 0.5

self.ratinga = self.ratinga + self.computek(self.ratinga) * (score_adjust - scoreawin)

self.ratingb = self.ratingb + self.computek(self.ratingb) * (score_adjust - scorebwin)

def computek(self, rating):

if rating >= 2400:

return 16

elif rating >= 2100:

return 24

else:

return 36

def computescore(self, rating1, rating2):

return 1 / (1+pow(10, (rating1 - rating2) / 400))

pass

KNN演算法原理與實現

knn k nearest neighbors 演算法不需要訓練過程,直接利用樣本之間的距離進行分類。演算法的基本過程是 給定乙個測試樣例,分別計算它與訓練集中所有樣本之間的距離,選取距離最小的k個訓練樣本對測試樣例的類別進行投票,最後將得票最多 在k個樣本中最多的類別 作為測試樣例的 類別。需要注...

knn演算法原理與實現(1)

一 演算法原理與模型 knn演算法即最近鄰演算法,其原理非常簡單即根據給定的資料集,計算資料集中點的特徵到待分類資料的歐氏距離,然後選擇距離最近的k個作為判斷依據,這k個資料中出現類別最多的作為新輸入資料的label。模型用公式表示如下 二 python 實現 author gujun bill k...

KNN演算法原理與自實現

1.計算已知類別資料集中的點與當前點之間的距離 2.按照距離遞增次序排序 3.選擇與當前距離最小的k個點 4.確定前k個點所在類別的出現概率 5.返回前k個點出現頻率最高的類別作為當前點的 分類 距離計算 param v1 第乙個點的位置 param v2 第二個點的位置 return distan...