【问题标题】:MATLAB: Function to calculate true Elo performance ratingMATLAB:计算真实 Elo 性能等级的函数
【发布时间】:2019-03-08 10:11:32
【问题描述】:

我正在寻找一个函数来计算与国际象棋游戏相关的真实 Elo 表现等级。

它会接受:

  1. game_results 向量,例如[1 0 0.5] 表示玩家赢了第一局,输掉了第二局,平了第三局。由此我们将得到另一个变量 score,这里是 1.5,另一个变量 num_games,这里是 3。

  2. 一个对手评分的向量,例如[1200 1400 1350] 表示第一个对手的评分为 1200,第二个为 1400,第三个为 1350。

我知道在以下等式中真正的绩效评级是 x:

for i = 1:num_games        
    score = score + (1/(1+10^((opp_ratings(i)-x)/400)));        
end

需要找到x的正确值,使这里的分数加起来为实际分数1.5。

在这里我碰巧知道x=1317.55 会产生大约正确的答案。

在我看来,我需要将包含上述代码的匿名函数传递给其他优化函数。然而:

  1. 我从this answer 了解到,匿名函数不能包含循环。

  2. 我不确定哪种优化功能合适。 MATLAB 似乎没有任何原生二分函数。

【问题讨论】:

  • 你不需要使用匿名函数。您需要将句柄传递给函数。您可以将您的函数写入一个名为myfun.m 的文件中,然后使用@myfun 获取句柄。匿名函数只是函数句柄的一个特例。

标签: matlab


【解决方案1】:

您可以使用非线性方程求解器,例如fsolve

fsolve 将为方程f(x) == 0 找到x 的值。

所以你可以创建函数f(x)并运行fsolve

opp_ratings = [1200 1400 1350];
tot_score   = 1.5
f           = @(x) sum(1./(1+10.^((opp_ratings-x)/400)))-tot_score; 
res         = fsolve(f,0) %the second argument is the initial point x0

% res       =  1317.6

注意到我已经使用运算符.^(元素智能幂运算符)和./(元素智能除法)线性化了你的for循环。所以现在定义单线方程更容易了f(x)

另外,这是一个细节,但为了提高 fsolve 性能(减少所需的迭代次数),您可以例如将初始 x0 值设置为“平均 ELO 评级”,例如 1000。所以fsolve(f,1000) 将统计收敛速度更快。

不推荐:

如果你的方程不能线性化,你确实可以这样写f(x)

f = @(x) sum(arrayfun(@(opp_ratings) (1/(1+10^((opp_ratings-x)/400))),opp_ratings))-tot_score  

使用数组乐趣。但如果可能,请避免使用此解决方案(因为它很难看,而且速度有点慢)。

【讨论】:

    猜你喜欢
    • 2014-11-20
    • 2015-12-10
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 2021-04-03
    相关资源
    最近更新 更多