Увеличить точность с плавающей точкой

#python

#python

Вопрос:

Я разрабатываю алгоритм, основанный на машинном обучении, на python. Главное, что мне нужно вычислить для решения этой проблемы, — это вероятности. Таким образом, у меня есть следующий код:

 class_ans = class_probability[current_class] * lambdas[current_class]
for word in appears_words:
   if word in message:
      class_ans *= words_probability[(word, current_class)]
   else:
      class_ans *= (1 - words_probability[(word, current_class)])
 
   ans.append(class_ans)
   ans[current_class] /= summ
 

Это работает, но в случае, если набор данных слишком большой или значение лямбды слишком мало, у меня закончилась точность с плавающей запятой.

Я попытался исследовать другой алгоритм вычисления значения моего ответа, умножая и разделяя на некоторые случайные переменные, чтобы они не переполнялись. Несмотря на это, ничего не помогало.

Таким образом, я хотел бы спросить, есть ли какие-либо способы увеличить мою точность с плавающей запятой в python?

Спасибо!

Комментарии:

1. большое плавание

2. Вы не можете просто увеличить точность с плавающей запятой. Обычным решением здесь является преобразование области вычислений в пространство журналов. То есть регистрируйте все отдельные значения и используйте сложение вместо умножения для вычисления условных вероятностей.

Ответ №1:

Вы не можете. При использовании серьезных научных вычислений, где точность является ключевой (а скорость — нет), рассмотрите следующие два варианта:

  1. Вместо использования float переключите свой тип данных на decimal.Decimal и установите желаемую точность.
  2. Для более тщательной реализации, проверенной в боях, переключитесь на gmpy2.mpfr тип данных as.

Однако, если все ваши вычисления (или, по крайней мере, проблемная часть) связаны с умножением множителей, вы часто можете обойти необходимость в вышеупомянутом, работая в лог-пространстве, как предлагает Конрад Рудольф в комментариях:

 a * b * c * d * ... = exp(log(a)   log(b)   log(c)   log(d)   ...)