【问题标题】:How to catch warning in Matlab?如何在 Matlab 中捕捉警告?
【发布时间】:2016-03-06 12:59:21
【问题描述】:

我正在使用 Matlab 的 distfit 函数来拟合我的数据的概率分布。有时会出现以下警告信息:

最大似然估计没有收敛。迭代限制 超过

在这种情况下,分布是拟合的(负对数似然不是复杂的或无限的)但拟合非常糟糕(高 AIC)。

如果出现此警告,我如何在 Matlab 中检查?如果出现这样的警告,我想抛出一个错误(并捕获它)。

目前,我正在调查负对数可能性是复杂的还是无限的,如果是,我会抛出一个错误。还有其他我应该做的检查吗?

【问题讨论】:

  • 这些函数通常有可选的输出,为您提供关于拟合优度的反馈。你可以检查一下。查看文档,这可能在返回的分布对象中。
  • @AndrasDeak 我已经在计算 AIC 分数,但很难确定是否适合。
  • 您可能还想检查它是否也是~isnan()。但是,不要抛出错误(在任何检查的情况下),只需将较大的成本分配给负似然函数。这将告诉优化器它当前正在查找错误区域,但不会终止它。

标签: matlab probability distribution


【解决方案1】:

您不能直接捕获警告,但可以通过使用以下构造关闭警告消息来伪造

% reset warnings
lastwarn('');

% Do your fitting
<your code here>

% Check which warning occured (if any)
[msgstr, msgid] = lastwarn;
switch msgid
   case 'ThisParticularMessageID'
      % In your case you say you want to throw an error
      error(msgstr); % or your custom error message
   %case 'SomeOtherMessageIDIfYouWantToCheckForSomethingElse'

end

棘手的事情是找到正确的 msgid。最简单的方法是使用您现有的代码,在看到警告消息后,在命令行输入

[msgstr,msgid] = lastwarn

这会告诉你你想为'ThisParticularMessageID'使用什么。

【讨论】:

  • 我认为这对于 OPs 问题来说非常好:他们想在拟合后检查是否有任何问题。
  • 使用未记录的语法,您可以捕获警告。看我的回答。
  • +1,我知道的最好的解决方案。请注意,任何代码首先抛出严重警告然后任何其他警告都不会引发错误。只有在没有其他警告出现时才可以安全使用,您永远无法保证这一点,因为迁移警告可能总是出现在未来的 MATLAB 版本中。我通常更喜欢误报引发异常的代码,而不是误报忽略问题的代码,所以我会提出任何错误警告。
【解决方案2】:

使用未记录的语法 warning('error', 'mycomponent:myMessageID') 将告诉 MATLAB 将警告转换为错误,然后您可以使用 try-catch 块捕获并适当处理:

您可以在警告发生后使用lastwarn 找到警告的消息 ID。

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多