#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?
Спасибо!
Комментарии:
2. Вы не можете просто увеличить точность с плавающей запятой. Обычным решением здесь является преобразование области вычислений в пространство журналов. То есть регистрируйте все отдельные значения и используйте сложение вместо умножения для вычисления условных вероятностей.
Ответ №1:
Вы не можете. При использовании серьезных научных вычислений, где точность является ключевой (а скорость — нет), рассмотрите следующие два варианта:
- Вместо использования
float
переключите свой тип данных наdecimal.Decimal
и установите желаемую точность. - Для более тщательной реализации, проверенной в боях, переключитесь на
gmpy2.mpfr
тип данных as.
Однако, если все ваши вычисления (или, по крайней мере, проблемная часть) связаны с умножением множителей, вы часто можете обойти необходимость в вышеупомянутом, работая в лог-пространстве, как предлагает Конрад Рудольф в комментариях:
a * b * c * d * ... = exp(log(a) log(b) log(c) log(d) ...)