2013-08-05 30 views
4

我正在寫一個算法,其中給定一個模型,我計算數據集列表的可能性,然後需要將每個可能性歸一化(概率)。所以像[0.00043,0.00004,0.00321]這樣的東西可能會被轉換爲[0.2,0.03,0.77]。 我的問題是,我正在使用的日誌可能性非常小(例如,在日誌空間中,值類似-269647.432,-231444.981等)。在我的C++代碼中,當我嘗試添加其中兩個(通過指數)我得到一個「Inf」的答案。我試圖將它們添加到日誌空間(Summation/Subtraction of log)中,但又一次遇到了同樣的問題。正常化一個非常小的雙數字(可能性)的列表

有人可以分享他/她的專家意見嗎?

感謝

+2

某些東西沒有正確的味道。有了這些對數,就會有非常多的零。你計算的東西正確嗎?你能展示一些你的代碼嗎? – John

+0

你能告訴我們一個可管理的代碼部分嗎,這樣我們可以更好地瞭解你的問題嗎? – BrainSteel

+0

因此,要清楚地說明,您需要「正常化」一些6位負數範圍內的數字,作爲實際值的對數。這會讓你乘坐不可能的駕駛帶來一場長途旅行。 (hitchhikers.wikia.com/wiki/Infinite_Improbability_Drive)。正如約翰所說,這似乎是錯誤的......這些數字非常小,以至於在電子高爾夫在宇宙中打球時擊中一個原子的可能性更大。 –

回答

4

假設可能性已經被正確地計算,你可以用最大的可能性將每個人。這可以通過從每個對數似然減去最大的對數似然來以對數形式完成。

然後,您可以轉換出對數空間。最大值將是1.0,因爲它的歸一化日誌爲0.較小的值將分別介於0和1.0之間,並表示爲最大值的一部分。

+0

當然,這是假設最大和最小的數字在彼此的合理範圍內。在給出的示例數字中,差別大概是34000--即使它是log2並使用80位長雙精度,其指數爲2^+/- 16383,它仍然是正常浮點數範圍之外的很長一段距離。 –

+0

@MatsPetersson這些大比率比小尺寸更麻煩我。貝葉斯方程中有一個標準化常數,通常不會計算,因爲它對所有情況都是一樣的。所有這些都可能是由於這個原因造成的。 –

+0

感謝您的提示。我會嘗試並讓你知道 – Ikram

2

這是標準程序。數值穩定的Matlab代碼:

LL = [ . . . ]; % vector of log-likelihoods 
M = max(LL); 
LL = LL - M; 
L = exp(LL); 
L = L ./ sum(L);