雀魂的安定段位相关统计

Posted by wyj on June 13, 2023

这是“概率论”课程的作业(加分用的),结果实际上与统计的关系更为密切,用到了好多我没学过的统计学内容,可能全是错的。我专门用Markdown写的这个作业,为了能直接搬到博客上。

安定段位的定义

如果玩家在某个段位上的对局期望得分为零,这个段位就被称作玩家的“安定段位”。“安定段位”常常被用来衡量立直麻将中一名玩家的实力。

不同的规则下得分机制是不同的,而雀魂里较高水平、较常见、也是科学麻将玩家们最关心的“玉之间四人南”的得分机制如下:如果一局结束时处于第四名以外的顺位,则不同段位的得分是相同的;而如果是第四名(被称作“吃四”),则每高一个段位得分会减去15分。记玉之间的最低段位“雀豪1星”(简称豪一)为0段。如果一局吃四的概率是$p$,没吃四的时得分为随机变量$Y$,吃四时的得分(换算为豪一的对应得分)为随机变量$Z$,段位是$x$,则得分为如下的随机变量:

\[(1-p)Y+p(Z-15x)\]

因此得分的期望为$(1-p)E[Y]+p(E[Z]-15x)$.令此期望等于零,解得

\[\begin{aligned} x&=\dfrac{(1-p)E[Y]+pE[Z]}{15p}\\ &=\dfrac{1}{15}\left(\dfrac{1-p}{p}E[Y]+E[Z]\right) \end{aligned}\]

这就是安定段位的计算公式。本质上,这是研究一个马尔可夫链的极限分布的某种性质,但我对此并不了解,我甚至都不能说明这样算出的结果在某种意义上就是“进行了无穷多次对局之后段位的期望”。

对安定段位的估计

事实上,我们并不知道$p$的值,也不知道$Y$和$Z$的分布,因此只能用有限次对战中的表现估计安定段位。可以假设同一个玩家在不同对战中的表现是独立同分布的。一个简单的想法是,用$n$次对战里吃四的频率估计四位率$p$,而用非四位时的平均得分与四位时的平均得分来估计$E[Y]$和$E[Z]$,这也是雀魂牌谱屋里估计安定段位的方法(具体计算代码见此处)。然而,这样的估计是有偏估计(假设已知真实分布时,这种估计结果的期望值与真实值不同)。并且如果$n$次采样中的四位频率是$0$,计算时就会出现除零错误。

然而,可以证明安定段位的无偏估计是不存在的。反证,假设$\dfrac{1-p}{p}E[Y]+E[Z]$可以无偏估计。由于$E[Z]$可以被无偏估计(采样的平均值就是期望的一种无偏估计),$\dfrac{1-p}{p}E[Y]$就也可以,于是$\dfrac{E[Y]}{p}$也可以。下面固定$Y$的分布,变化$p$,估计值的期望为$\sum_{k=1}^{n}\binom{n}{k}p^{k}(1-p)^{n-k}F_k$,其中$F_k$是在采样$n$局中出现$k$局四位时估计值的期望(估计时并不知道$p$,因此与$p$无关),因此是$p$的多项式。然而固定$Y$的分布之后$\dfrac{E[Y]}{p}$是$p$的分式,因此两边不能恒等,即无偏估计不能存在。于是这种估计方法虽然有偏,但这不过是一个无法避免的问题。

同时,可以证明这种估计方法得到的安定段位在对局次数趋于无穷时会以概率1收敛到安定段位的真实值。首先,根据Borel强大数定律,$n$次对战中的吃四次数$\mu_n$满足$P\{\dfrac{\mu_n}{n}\to p\}=1$,且$\dfrac{\mu_n}{n}$就是我们对$p$的估计值。并且$Y$和$Z$的期望都一定存在(因为单局得分是有界的,无论吃四与否),因此根据Kolmogorov强大数定律,估计值$\dfrac{1}{n}(\xi_1+\dots+\xi_n)\stackrel{a.s.}{\to}E[\xi]$,即平均值会以概率1收敛到期望。最后,安定段位的估计值是这些随机变量的连续函数,因此根据Continuous mapping theorem,安定段位的估计值以概率1收敛到真实值。

另外,还可证明这样的估计是最大似然估计(当然是我看别人这么说的,我没想过怎么证)。

置信区间

实际上我们并不关心到底是“依概率收敛”还是“以概率1收敛”还是什么别的,因为没有人可以进行趋于无穷次的对局。我们关心的是有限次对局后估计值的“置信区间”:进行了$n$场对局之后,估算的安定段位$e$与真实的安定段位$t$之差小于$d$的概率$=0.95$,则$(e-d,e+d)$就是置信区间(也不是一个严格的定义,但是能用)。

假设已经知道了真实的$p$值与$Y,Z$的分布,就能够算出来置信区间。设估计值为$p\approx \nu,E[Y]\approx mY,E[Z]\approx mZ$,则 \(P\{\vert\dfrac{1-\nu}{\nu}mY+mZ-t\vert<d\}=\sum_{k=1}^{n}\binom{n}{k}p^{k}(1-p)^{n-k}P\{\vert\dfrac{n-k}{k}mY+mZ-t\vert<d\}\) 其中枚举了采样中出现$k$局的四位,$mZ$就是这$k$个吃四局的得分的平均值,而$mY$就是$n-k$局没吃四的得分的平均值。估算的安定段位$e=\dfrac{n-k}{k}mY+mZ$。各局的$Y,Z$满足独立同分布、方差有限(还是由于得分是有界的),因此可以用中心极限定理来估计$mY$和$mZ$:$E[mY]=E[Y],D(mY)=\dfrac{1}{n-k}D(Y);\ E[mZ]=E[Z],D(mZ)=\dfrac{1}{k}D(Z)$,且它们都近似满足正态分布。于是$D(\dfrac{n-k}{k}mY)=\dfrac{n-k}{k^2}D(Y)$,且$mY,mZ$是独立的(因为局与局之间是独立的,而$mY,mZ$由不同局计算得到),因此$E[e]=E[\dfrac{n-k}{k}mY+mZ]=\dfrac{n-k}{k}E[Y]+E[Z],\ D(e)=\dfrac{n-k}{k^2}D(Y)+\dfrac{1}{k}D(Z)$,且$e$也近似满足正态分布(正态分布的线性组合还是正态分布),其分布参数都已经被算出,这样就可以算出$P\{\vert\dfrac{n-k}{k}mY+mZ-t\vert<d\}$的近似值,对$k$求和就得到了$P\{\vert\dfrac{1-\nu}{\nu}mY+mZ-t\vert<d\}$的近似值。最后再二分一下$d$,就能得到置信区间。

但实际上并不能计算出来一个置信区间(至少我不会),因为不知道真实的分布是什么。只能用采样后得到的分布来估计真实分布,再以此计算置信区间。从上面一段的分析中可以发现,只要估计$Y,Z$的期望和方差即可。而这是很容易做到的,只需要用平均值来估计期望,用$\dfrac{1}{n-1}\sum_{k=1}^{n}(Z_k-\bar{Z})^2$来估计方差即可达到无偏估计。

代码实现

首先是需要批量读取雀魂的对局结果数据,为此,我先用MajsoulPaipuAnalyzer把我个人的雀魂对局牌谱全部下载到了本地,用JSON格式保存。无论是读取JSON还是进行二项分布、正态分布的计算,用Python都是很方便的,因此我使用了Python来编写一个测试程序,算出本人在2023年的全部玉之间四人南对局的安定段位以及置信区间。其中二项分布和正态分布的计算是用的SciPy库。这里是代码,我真的不太会用Python,也没怎么写过Python,可能写得很丑。

这期间我进行了82场对局,计算出安定段位是雀豪2.98星,与雀魂牌谱屋的计算结果基本相同;置信区间范围是“雀豪-6.98”到“雀圣9.94”,然而实际上雀豪最低只有1星,雀圣最高只有3星,因此这个结果表明,计算出的安定段位毫无意义;但另一方面,这里置信区间的估计用到了中心极限定理,因此在对局数较少时可能不是很准确。但这和MajsoulPaipuAnalyzer的计算结果基本相同。

我把数据复制了12份后当成打了984局,又进行了一遍分析。一般认为1000局的数据就足以看出一个人的实力了,但事实是984局之后置信区间的范围仍然有“雀豪0.53”到“雀圣2.42”这么大,还是几乎包含整个玉之间。进行1000个半庄的对局需要700小时左右的游戏时间,很少有人能花这么多的时间来打麻将;而且1000个半庄的经验积累可能已经足够产生水平的质变了,独立同分布的假设不再适用。由此可见,对于立直麻将这样的运气成分很大的游戏,安定段位并不能很好地作为一个评价实力的指标。

对于安定段位置信区间计算方式的更多讨论,参见安定段位置信区间计算问题

多余的话

我认为唯一客观而有效的判断麻将实力的方法,至少在我目前的水平来看,是NAGA的评分(NAGA度/恶手率)。天凤的安定段也没什么用,腾讯的十段AI LuckyJ安定是天凤位,而国人十段火霊夢(四娃万岁)安定只有七段,都是高达数千个半庄的安定段位,但我认为完全没有理由说这AI比四娃要强。mortal这种次一级的AI可能水平还可以,但无法正常地给出Rating,以至于我作为一个豪一原点下的究极菜鸡,牌谱Rating和“雀魂第一人”呆哥都没有明显区别,一样是一般85-90,少数90+。而NAGA的评分就很能体现水平的差别,毛毛经常用NAGA复盘自己的牌谱,他的NAGA度全部90以上,恶手率全部是5%以下,经常是一点几甚至0的恶手率。而我NAGA度就85左右,恶手率10%左右,差距是很明显的。