在电影《The Social Network》里,马克使用了爱德华给象棋选手评级的算法来对哈佛的女生进行打分。

截图出现在电影《社交网络》的13分02秒

这个算法叫做Elo rating system,是由美国物理学家Arpad Elo发明的一个用于对各种竞技行为进行评分的算法。不过在社交网络中爱德华在窗户上写的公式是错的,正确的公式如下


这两个公式分别用于计算选手A和选手B的期望胜率EA和EB,RA和RB分别代表了A和B的当前得分。有了期望胜率就可以计算出选手A和选手B的最新打分。计算打分的公式在电影中没有给出,这里给出使用期望胜率计算打分的公式如下

计算打分公式的各个参数含义:

参数
含义
R’A 选手A的最新打分
RA 选手A在这轮竞技之前的打分
K 一个正整数因子,用于平衡不同选手的能力,K越大得到的打分越高;有时候可以让种子选手的K稍低,普通选手的K稍高
SA 选手的输赢情况,胜=1,和=0.5,负=0
EA 在上一个公式中计算的选手期望胜率

有了这两个公式,我们就可以实现对竞技行为的打分了,让我们使用Python把这两个公式实现出来。

计算期望胜率

1
2
3
4
5
6
7
8
def expected_score(ra, rb):
"""
计算a的期望胜率ea
:param ra: a的当前得分
:param rb: b的当前得分
:return:
"""
return 1 / (1 + pow(10, (rb - ra) / 400))

计算竞技之后的得分

1
2
3
4
5
6
7
8
9
10
def rank_score(rank, k, sa, ea):
"""
计算实际得分
:param rank: 这轮竞技之前的打分
:param k: K因子针对不同的玩家可能不同
:param sa: 这一局的输赢得分,胜=1,和=0.5,负=0
:param ea: 期望得分,即expected_score方法的计算结果
:return:
"""
return rank + k * (sa - ea)

通过以上的代码我们可以看到,Elo评分算法还是比较简单的,只需要分为计算期望胜率和计算得分这两步。虽然算法本身比较简单,但是这不影响Elo成为当今对弈水平评估的公认的权威方法。不仅传统的国际象棋、围棋、足球、篮球等项目会使用它,一些新兴的线上电子竞技游戏也会使用Elo来作为评分算法。

为了模仿电影《社交网络》中的FaceMash网站,我抓取了一些演员的照片并放在下方,你可以通过不断地对演员进行选择来影响演员的最终打分

如果图片无法正常显示请尝试刷新页面

Which one is more attractive, left or right!

以上就是模仿了FaceMash网站所实现的评分系统,初始时所有人的得分都是1400分,用户会随机的获取两张照片并需要在这之间选择他认为更好看的一张。经过一段时间的评分操作,所有照片的分数将会发生变化,更好看的照片会偏向于拥有更高的得分。

由于数据只存在于本地,你可以使用自动模拟选择按钮来模拟这个打分过程。

参考

电影《社交网络》中的“FaceMash”算法
Elo rating system
社交网络 The Social Network (2010)