#python #scipy #distribution #scipy-optimize-minimize #irr
Вопрос:
парни. Я пытаюсь сгенерировать массив оптимизированных значений из функции, которая имеет 3 переменные. Две переменные являются известными распределениями. Задача состоит в том, чтобы найти распределение IRR(внутренней нормы прибыли), когда известно распределение денежных потоков. Я начал с преобразования входных распределений в массивы
s_q = salv_samp.tolist() a_q = A_samp.tolist() ax = np.array(a_q) sx = np.array(s_q)
затем я использовал scipy.оптимизируйте следующим образом
for q,j in zip(ax,sx): squared_error = lambda i : np.abs(NPV(q,j,i)) result_b= opt.minimize(fun=squared_error, x0=0.05, method='L-BFGS-B', bounds=((0, 1),)) print(result_b)
Приведенный выше код не дает ошибок, но я ожидал, что мои результаты будут массивом того же размера, что и входные массивы, а не просто скалярным значением. Смотрите выходные данные, которые генерирует код ниже:
fun: array([1.52194751e-07]) hess_inv: lt;1x1 LbfgsInvHessProduct with dtype=float64gt; jac: array([192.26050246]) message: 'ABNORMAL_TERMINATION_IN_LNSRCH' nfev: 128 nit: 6 njev: 64 status: 2 success: False x: array([0.24347229])
Когда я использую дистрибутивы такими, какие они есть, я получаю ошибку.
for q,j in zip(A_samp,salv_samp): squared_error = lambda i : np.abs(NPV(A_samp,salv_samp,i)) result_b= opt.minimize(fun=squared_error, x0=0.05, method='L-BFGS-B', bounds=((0, 1),)) print(result_b)
Сообщение об ошибке: 0-е измерение должно быть исправлено на 1, но получено 15000 (реальный индекс=0)
-------------------------------------------------------------------------- ValueError Traceback (most recent call last) lt;ipython-input-109-8b5da553a644gt; in lt;modulegt; 2 squared_error = lambda i : np.abs(NPV(A_samp,salv_samp,i)) 3 ----gt; 4 result_b= opt.minimize(fun=squared_error, x0=0.05, method='L-BFGS-B', bounds=((0, 1),)) 5 print(result_b) ~anaconda3libsite-packagesscipyoptimize_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options) 617 **options) 618 elif meth == 'l-bfgs-b': --gt; 619 return _minimize_lbfgsb(fun, x0, args, jac, bounds, 620 callback=callback, **options) 621 elif meth == 'tnc': ~anaconda3libsite-packagesscipyoptimizelbfgsb.py in _minimize_lbfgsb(fun, x0, args, jac, bounds, disp, maxcor, ftol, gtol, eps, maxfun, maxiter, iprint, callback, maxls, finite_diff_rel_step, **unknown_options) 349 while 1: 350 # x, f, g, wa, iwa, task, csave, lsave, isave, dsave = --gt; 351 _lbfgsb.setulb(m, x, low_bnd, upper_bnd, nbd, f, g, factr, 352 pgtol, wa, iwa, task, iprint, csave, lsave, 353 isave, dsave, maxls) ValueError: 0-th dimension must be fixed to 1 but got 15000 (real index=0)
Любая помощь будет очень признательна. Есть ли в scipy.optimize какой-либо другой метод для решения такого рода проблем? Мой размер входного распределения составляет 15000 для обоих. Спасибо!