我有一个已知的模型,我试图适应真实的数据。
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
的所有值除以零。
我可以设置选项来防止这种情况发生吗?我已经阅读了文档,但我并不是很清楚所有选项实际上是做什么的。
答案 0 :(得分:0)
让我们假设您的代码中唯一的问题是值会发散,因为会出现一些零值或负值。如果是这种情况,可以通过简单的方法解决这个问题。不是直接估计b(i),而是定义c(i)= ln(b(i)),这意味着b(i)= exp(c(i))。因此,在等式中用exp(c(i))代替b(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)始终为正值。