有许多MATLAB函数可以进行某种统计模型拟合,例如requests.get(host+endpoint+auth_token)
。这些模型拟合可能由于各种原因而无法收敛。这个问题与导致此类故障的原因或预防方法无关。
我的问题是:除了查看控制台输出之外,是否有其他方法可以确定对fitglm()
的给定调用是否收敛?显而易见的方法似乎是通过输出参数的某些属性来实现的,但是Linear Model class的属性列表似乎并不包含此基本信息。
一个最小的例子(受this question的启发):
fitglm()
关于输出x = [7 0;0 0;8 0;9 0;7 1;8 0;7 0;4 0;7 0;2 0];
y = [0 0 1 1 1 0 0 1 0 0]';
m = fitglm(x,y,'distr','binomial');
Warning: Iteration limit reached.
的什么(如果有的话)告诉我们达到了迭代限制?
答案 0 :(得分:1)
我还没有在GeneralizedLinearModel
class object返回的fitglm
中找到任何此类信息。但是,从技术上避免查看控制台输出的一个选项是使用lastwarn
或warning
捕获有关最后警告的信息:
>> [lastMsg, lastID] = lastwarn
lastMsg =
Iteration limit reached.
lastID =
stats:glmfit:IterationLimit
>> w = warning('query', 'last')
w =
struct with fields:
identifier: 'stats:glmfit:IterationLimit'
state: 'on'
请注意,即使warnings have been suppressed(即使仍生成并存储警告,但不显示警告),该操作仍然有效。
您可以使用此方法的一种方法是,首先将上一条警告设置为虚拟消息(使用lastwarn
),然后拟合模型,然后再次获得上一条警告并将其与您的虚拟消息进行比较。如果不同,则在拟合模型时会引发新的警告:
lastwarn('Nothing to see here', 'this:is:not:a:warning');
m = fitglm(x, y, 'distr', 'binomial');
[lastMsg, lastID] = lastwarn;
warningWasThrown = ~strcmp(lastID, 'this:is:not:a:warning');
此外,您可能有一条switch语句,用于检查警告标识符lastID
的值,并相应地采取不同的操作,例如尝试使用另一组参数拟合模型。