Python版本 http://code.google.com/p/pyglicko/source/browse/glicko.py | JavaScript 版本 https://github.com/austinyun/JS-Glicko/blob/master/glicko.js | 白皮书 http://www.glicko.net/glicko/glicko.pdf
因此,我正在开发一个网站来计算两人游戏的 Glicko 评级。它涉及大量浮点算术(平方根、指数、除法,所有讨厌的东西),并且出于某种原因,我得到的答案与我逐行翻译的算法的 Python 实现完全不同。 Python 版本基本上给出了描述算法的原始白皮书中示例的预期答案,但 Javascript 版本有相当大的偏差。
我在翻译中犯了错误吗?还是 Javascript 的浮点数学不太准确?
Expected answer: [1464, 151.4]
Python answer: [1462, 155.5]
Javascript answer: [1470.8, 89.7]
因此,评级计算并没有那么糟糕,准确率为 99.6%,但方差却减少了 2/3!
编辑:人们指出 Pyglicko 版本中 RD 的默认值是 200。我相信这是原始实现者留在测试代码中的情况,因为测试用例是在 RD 为 200 的人身上完成的,但是显然默认值应该是 350。但是,我在 Javascript 测试用例中指定了 200,所以这不是这里的问题。
编辑:更改算法以使用映射/归约。评级不太准确,方差更准确,两者都没有明显的原因。撞墙开始。
通常,当您减去两个相似的数字时,您会遇到这样的错误 - 然后值之间通常不显着的差异会被放大。例如,如果您有两个值,在 python 中为 1.2345 和 1.2346,但在 javascript 中为 1.2344 和 1.2347,则差异分别为 1e-4 和 3 e-4(即一个是另一个的 3 倍)。
所以我会看看代码中哪里有减法并检查这些值。您可能会发现您可以(1)重写数学以避免减法(通常事实证明您可以找到一个以其他方式计算差异的表达式)或(2)关注为什么该特定点的值两种语言之间存在差异(也许其他答案确定的 pi 差异正在以这种方式被放大)。
尽管这里不太可能,但也有可能存在差异,因为某些东西在 python 中被视为整数,但在 javascript 中被视为浮点数。在Python中,整数和浮点数之间是有区别的,如果你不小心,你可以做一些事情,比如将两个整数相除以获得另一个整数(例如Python中的3/2 = 1)。而在 javascript 中,所有数字都是“真正的”浮点数,因此不会发生这种情况。
最后,计算的执行方式可能存在细微差别。但这些都是“正常的”——要获得如此巨大的差异,你也需要像我上面描述的那样发生。
PS:还要注意 Daniel Baulig 在上面的评论中所说的关于参数 rd 的初始值的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)