使用 MATLAB 的 BADS 优化工具,不同模型的 FVAL 得分相同

问题描述 投票:0回答:1

我正在Matlab中编写一个程序,其任务是使用5个不同的模型来拟合8个参数并输出它们的FVAL,以便计算AIC和BIC以获得5个模型中的最佳模型。 我的问题是,虽然不同模型拟合的参数完全不同,但我得到相同的 FVAL 分数,这对我来说毫无意义。

我的任务总共有 234 个数据点和 8 个参数,但每个数据点仅使用 2 个参数。答案是二进制 1 或 0。 我有一个名为“结果”的 234x1 双变量,它是我想要预测的分数,每个数据点为 1 或 0。 另一个 234x1 双变量称为“tParamVal”,它是使用的 2 个参数中的第一个参数,得分为 1、2、3 或 4。 最后,234x1 双变量名为“sParamVal”,这是使用的第二个参数,得分为 5、6、7 或 8。 因此,对于 234 个数据点中的每个数据点,我都有 param1(例如 3)、param2(例如 8)、结果(例如 1)。

我这样定义了我的模型:

null = @(params, x) mean(results); % null model.
multiplicative = @(params, x) params(x(1)) * params(x(2)); % multiplicative model
minimalism = @(params, x) min(params(x(1)), params(x(2))); % minimum model.

对于目标函数,我使用负对数似然定义为:

objective_null = @(params) -mean((results .* log(null(params, ...
        [tParamVal, sParamVal]) + 1e-10)) + ((1 - results) .* ...
        log(1 - null(params, [tParamVal, sParamVal]) + 1e-10)));
objective_mul = @(params) -mean((results .* log(multiplicative(params, ...
        [tParamVal, sParamVal]) + 1e-10)) + ((1 - results) .* ...
        log(1 - multiplicative(params, [tParamVal, sParamVal]) + 1e-10)));
objective_min = @(params) -mean((results .* log(minimalism(params, ...
        [tParamVal, sParamVal]) + 1e-10)) + ((1 - results) .* ...
        log(1 - minimalism(params, [tParamVal, sParamVal]) + 1e-10)));

这些是 3 个基本模型,我添加了另外 2 个模型,它们具有以下规则的约束: 第一个参数>第二个参数>第三个参数>第四个参数的分数,另一个规则:第五个参数>第六个>第七个>第八个。 这就是我定义约束的方式:

constraint = @(params) [params(1) - params(2), params(2) - params(3), ...
        params(3) - params(4), params(5) - params(6), ...
        params(6) - params(7), params(7) - params(8)];

最后 2 个具有约束条件的模型的目标函数定义为:

penalized_objective_mul = @(params) objective_mul(params) + ...
        sum(min(0, constraint(params)).^2);
penalized_objective_min = @(params) objective_min(params) + ...
        sum(min(0, constraint(params)).^2);

对于 BADS 优化算法,您需要提供一个起点 x0:

x0 = [0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5];        % Starting point

以及硬下限 (lb) 和上限 (ub):

lb = [0 0 0 0 0 0 0 0];                        % Lower bounds
ub = [1 1 1 1 1 1 1 1];                        % Upper bounds

为了获取拟合参数和 fval,我对 5 个模型运行以下行:

% null model
[null_fit, null_fval] = bads(objective_null, x0, lb, ub);
nullStruct.(subject) = [null_fit, null_fval];

% multiplicative model
[mul_fit, mul_fval] = bads(objective_mul, x0, lb, ub);
mulStruct.(subject) = [mul_fit, mul_fval];

% multiplicative with constraint model
[mulConst_fit, mulConst_fval] = bads(penalized_objective_mul, x0, lb, ub);
mulConstStruct.(subject) = [mulConst_fit, mulConst_fval];
    
% minimalism model
[min_fit, min_fval] = bads(objective_min, x0, lb, ub);
minStruct.(subject) = [min_fit, min_fval];

% minimalism with constraint model
[minConst_fit, minConst_fval] = bads(penalized_objective_min, x0, lb, ub);
minConstStruct.(subject) = [minConst_fit, minConst_fval];

这一切都在每个“主题”的 for 循环中运行。

对于每个科目,我得到不同的 FVAL 分数,但在同一科目内以及不同模型之间,我得到相同的 FVAL 分数。值得注意的是,虽然 FVAL 相同,但不同模型输出的拟合参数不同。

我预计问题出在目标函数中,我尝试更改和审查几次但没有成功。

提前致谢。

matlab optimization modeling log-likelihood fminsearch
1个回答
0
投票

问题出在模型函数中。

更正模型功能:

multiplicative = @(params, x) (params(x(:,1)) .* params(x(:,2)))';
minimalism = @(params, x) (min(params(x(:,1)), params(x(:,2))))'; 
© www.soinside.com 2019 - 2024. All rights reserved.