2016-03-06 58 views
2

我正在使用Matlab的distfit函數來擬合我的數據的概率分佈。有時會出現以下警告消息:如何在Matlab中捕捉警告?

最大似然估計沒有收斂。迭代限制 超過

在這種情況下,分佈擬合(負對數似然並不複雜或無窮大),但配合非常不好(高AIC)。

如何在Matlab中檢查此警告是否出現?如果出現這樣的警告,我想拋出一個錯誤(並抓住它)。

目前,我正在調查是否存在複雜或無限的對數似然性,如果是的話,我會拋出一個錯誤。還有其他檢查我應該做嗎?

+0

這些功能通常具有可選輸出,可以提供關於適合度的反饋。你可以檢查。看看這些文檔,這可能在返回的分發對象中。 –

+0

@AndrasDeak我已經在計算AIC分數,但很難確定是否合適。 – machinery

+0

你可能也想檢查它是否也是'〜isnan()'。但是,不要拋出一個錯誤(在任何檢查的案例中),只需爲負面似然函數分配一個大的成本。這將告訴優化器它目前正在尋找一個不好的區域,但不會終止它。 –

回答

4

不能直接抓到一個警告,但通過鍵控關閉警告郵件可以它通過使用下面的構造

% 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'什麼。

+0

我認爲這對OPs問題是非常好的:他們想在檢查後檢查是否有任何問題。 –

+0

使用未記錄的語法,可以捕獲警告。看到我的答案。 –

+0

+1,這是我所知道的最佳解決方案。請注意,任何代碼先擲出嚴重警告,然後再發出任何其他警告都不會引發錯誤。只有在沒有其他警告發生時纔可以使用,這是您永遠無法保證的,因爲在將來的MATLAB版本中可能會出現移植警告。我通常更喜歡那些假陽性的代碼在假陰性忽略問題的代碼上拋出異常,所以我會提出任何錯誤警告。 – Daniel

1

使用無證語法warning('error', 'mycomponent:myMessageID')會告訴MATLAB警告轉換爲錯誤,然後你就可以用try-catch塊捕獲並妥善處理:

你可以找到使用lastwarn剛過你的警告消息ID它發生。