3

我有一个已知模型,我正在尝试拟合真实数据。

fun = @(b,x) b(1)*x(:,1)./(x(:,2).^b(2));
beta0 = [70 1.1]; % expected range is 40-130, and 1.0-1.3
[beta,r]=nlinfit(X,tmp_y,fun,beta0);

当我使用 nlinfit 时,它告诉我我的函数正在返回 Inf 的值。我进入代码并发现在拟合的第二次迭代中,它过度补偿了第二个 beta 项,将其降至 -80。如果 的值非常大x(:,2),这会导致 的所有值都被零除x

我可以设置哪些选项来防止这种情况发生?我已阅读文档,但我不太了解所有选项的实际作用。

4

1 回答 1

0

让我们假设您的代码中唯一的问题是值是不同的,因为出现了一些零值或负值。如果是这种情况,有一个简单的技巧可以解决这个问题。不是直接估计 b(i),而是定义 c(i)=ln(b(i)),这意味着 b(i)=exp(c(i))。因此,在您的等式中将 b(i) 替换为 exp(c(i))。

fun = @(c,x) exp(c(1))*x(:,1)./(x(:,2).^exp(c(2)));

在估计 c(i) 之后,评估 b(i)=exp(c(i))。请注意,在这种情况下,您允许 c(i) 具有零值和负值,但 b(i) 始终为正值。

于 2014-02-21T01:41:37.657 回答