2017-04-04 39 views
11

我正在嘗試使用一些可能導致問題的概率很小的概率。例如在R中使用非常小的數字的算術運算符

probs <- c(4.225867e-03,3.463125e-04,2.480971e-05,1.660538e-06,1.074064e-07,6.829168e-09,4.305051e-10,2.702241e-11,1.692533e-12,1.058970e-13,6.622117e-15,4.139935e-16,2.587807e-17,1.617488e-18,1.010964e-19,6.318630e-21,3.949177e-22 2.468246e-23,1.542657e-24,9.641616e-26,6.026013e-27,3.766259e-28,2.353912e-29,1.471195e-30,9.194971e-32 

但是用這個載體的任何運算引起的一切後,第12項,以四捨五入爲零(可能是因爲它比。機$ double.eps更少)。例如:

probs > 0 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

1-probs < 1 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

我使用GMP包試過,但我在做組合學依據計算和as.bigq(probs)當提升到大的權力變得非常慢。

任何方法來解決這個問題?

+11

爲了解決這些問題,通常使用對數概率,這樣就可以將概率相加而不是相乘(這通常是極小概率的原因)。 – Marius

+2

@Marius有點令人驚訝的是,這似乎並不重複(也許我沒有正確搜索)。如果對R中的對數概率使用規範的答案來提高數字精度,那將是很好的。也許你可以擴展你的評論並將其作爲答案。 –

+0

@JohnColeman我們是否真的需要爲每種語言分別說明對數概率策略?我知道我看過其他語言的類似問題。 –

回答

6

機器學習和其他統計計算主題經常遇到非常小的概率情況。由於浮點數的內部表示限制,您正在獲得精度錯誤。這可以使用任意的精確算術來解決,但這並不常見。

最流行的解決方案是使用l og transformation to represent your probabilities,然後使用加法而不是乘法。這被稱爲對數似然。這種變換避免了非常小的問題,此外,對數似然值可以直接用於比較事物的概率(較低的對數似然總是意味着較低的概率)。

請注意,有一個subtle distinction between likelihood and probability,但日誌轉換將極小的數字轉換爲負數,並且小數位數的變化較小。