2014-02-07 2 views
0

Я сделал приложение для обнаружения спам-почты с использованием классификатора Naive Bayes.Как Java может представлять собой очень маленькие дробные числа?

При оценке некоторых вероятностей результаты очень маленькие, поэтому java возвращает ноль (0.0).

Переменные объявляются как float. Как Java может обрабатывать очень маленькие цифры, такие как 6.9e-232?

+0

Если проблема заключается в простое отображение значений, вы можете попробовать 'printf()'. – Christian

+1

[Использование] (http://www.opentaps.org/docs/index.php/How_to_Use_Java_BigDecimal:_A_Tutorial) [BigDecimal] (http://docs.oracle.com/javase/7/docs/api/java/math /BigDecimal.html). –

+0

Java doubles может представлять числа размером от 2.2e-308 (приблизительное), поэтому я подозреваю, что вы делаете что-то неправильно. –

ответ

0

Даже если вы переходите от float к double, умножение многих «малых» чисел в конечном итоге будет уменьшаться до нуля. Вместо этого используйте логарифмы для умножения.

То есть, поскольку журнал (а * Ь) = журнал (а) + журнал (б), вычислить произведение A * B * C * ... * г как

product = exp(log(a) + log(b) + log(c) + ... + log(z)) 

Это будет защитите вас от недостаточного потока.

0

наименьший число с плавающей запятой двойной точность число есть, равен: 2^(- 1074). Это примерно равно: 4.94 × 10^(- 324). Поскольку вы упомянули, что используете вместо float поплавки, наименьшее число с плавающей точкой с одинарной точностью равно: 2^(- 382), что примерно равно 1.01 × 10^(- 115). Поэтому, если ваше приложение приходит к выводу, что вероятности меньше этого, то у вас есть ошибка в ваших расчетах, а не с самими числами.

4

Изменение от float до double. Это приведет к тому, что вам снизятся цифры примерно до 2.2e-308, прежде чем точность уменьшится.

Кроме того, передумайте, нужно ли обрабатывать номера этого размера. Если вероятность чего-то составляет 6.9e-232, вряд ли это произойдет в вашей жизни.

+1

Да, из моего опыта с Байесом любая вероятность ниже примерно 1%, вероятно, не имеет значения. –

+0

Если у вас есть слово только с одним появлением ??? – Jimmysnn

+1

@jimmysnn: Слово с одним видом не имеет вероятности где-то около 6.9e-232. Если все семь миллиардов человек каждый управляют миллиардом компьютеров, производящих миллиард слов в секунду в течение миллиарда лет, это всего лишь 2.2e44 слова. –

Смежные вопросы