2010-09-13 14 views
21

Ho un classificatore bayesiano programmato in Python, il problema è che quando moltiplico le probabilità di funzionalità ottengo MOLTO piccoli valori float come 2.5e-320 o qualcosa del genere, e all'improvviso si trasforma in 0.0. Lo 0.0 è ovviamente inutile poiché devo trovare la "migliore" classe in base alla quale la classe restituisce il valore MAX (valore maggiore).In Python piccoli galleggianti tendenti a zero

Quale sarebbe il modo migliore per affrontare questo? Ho pensato di trovare la parte esponenziale del numero (-320) e, se è troppo bassa, moltiplicando il valore per 1e20 o un valore del genere. Ma forse c'è un modo migliore?

+23

Questo non è matematica. In matematica, i numeri positivi possono essere arbitrariamente piccoli. Questo è in virgola mobile. – recursive

+6

@S. Questa non è sicuramente una domanda di matematica da nessuna parte. Questo ha tutto a che fare con i numeri in virgola mobile e il modo in cui funzionano in Python e in altri linguaggi di programmazione. –

+12

Credo che 2.5e-320 sia la probabilità esatta che una balena si trasformi improvvisamente in una ciotola di petunie. – Seth

risposta

22

Quello che descrivi è un problema standard con il classificatore naive Bayes. Puoi cercare underflow con quello per trovare la risposta. oppure vedere here.

La risposta breve è che è standard per esprimere tutto ciò in termini di logaritmi . Quindi piuttosto che moltiplicare le probabilità, si sommano i loro logaritmi.

Si potrebbe voler esaminare anche altri algoritmi per la classificazione.

+0

Ehi! grazie mille per la risposta, lo esaminerò, poiché risolve esattamente il mio problema. Stavo pensando che dovrebbe essere comune poiché sto moltiplicando le probabilità come 3.14e-05 più volte, quindi raggiungono i livelli e-300 (ad esempio) piuttosto velocemente, anche di più quando ho molte caratteristiche nel mio classificatore. – Pravel

+0

Sì, come detto anche ricorsivamente, questo viene affrontato usando i logaritmi e aggiungendo le probabilità. Nel link fornito da Maometto è tutto spiegato. Grazie a tutti per le vostre risposte! – Pravel

3

Dai un'occhiata a Decimal dallo stdlib.

from decimal import Decimal, getcontext 

getcontext().prec = 320 

Decimal(1)/Decimal(7) 

Non sto inviando i risultati qui perché è piuttosto lungo.

7

Floating point I numeri non hanno una precisione infinita, motivo per cui hai visto i numeri girare a 0. Potresti moltiplicare tutte le probabilità di un grande scalare, in modo che i tuoi numeri rimangano in una gamma più alta? Se sei solo preoccupato per il massimo e non la magnitudo, non hai nemmeno bisogno di preoccuparti di separarti alla fine. In alternativa è possibile utilizzare un decimale di precisione infinito, come suggerito da ikanobori.

17

Sarebbe possibile svolgere il proprio lavoro in uno spazio logaritmico? (Ad esempio, invece di memorizzare -32010, è sufficiente memorizzare -320 e utilizzare l'aggiunta anziché la moltiplicazione)

+0

Ehi! La tua soluzione sembra grandiosa. È molto semplice e sembra abbastanza facile da provare. Grazie! Lo proverò. – Pravel

Problemi correlati