#python #optimization #scipy #statistics
Вопрос:
У меня есть следующая функция to_minimize
, которая должна быть равна логарифмической вероятности набора данных для распределения Вейбулла, усеченного слева на d.
import numpy as np from scipy.optimize import minimize def to_minimize(args, data, d=1): theta, tau = args n = len(data) if tau lt;= 0 or theta lt;= 0: pass term1 = n * (np.log(tau) - tau * np.log(theta) - (-d / theta) ** tau) term2 = 0 for x in data: term2 = (tau - 1) * np.log(x) (-x / theta) ** tau return term1 term2 data = numpy.random.rand(100) weibull = minimize(lambda args: -to_minimize(args, data), x0=np.array((1., 1.)), bounds=np.array([(1e-15, 10), (1e-15, 10)]))
Насколько я могу судить, единственное, что должно вызвать ошибку формы
RuntimeWarning: invalid value encountered in double_scalars
должно быть, если тау или тета равны 0. Но границы этих параметров специально превышают 0, так почему же моя процедура оптимизации завершается сбоем?
Ответ №1:
После вызова np.seterr(all='raise')
и дополнительной отладки я заметил, что в моих расчетах произошла ошибка. -
В экспоненциальной функции должно быть применено после мощности. В противном случае он попытается извлечь корень из отрицательного числа, которое не будет работать по очевидным причинам.