Код: Выделить всё
import numpy as np
import math
from scipy.optimize import minimize
#parameters
n_strata=4
strata_size = [0.25, 0.25, 0.25, 0.25]
strata_variance = [0.25, 0.25, 0.25, 0.25]
total_sample = 8000
#parameter to control the scale of the objective function
scale_value = 1.0
#objective function that the variance of a stratified estimator
def objective_function(n_vec_in_short):
#convert from numpy to a list
if isinstance(n_vec_in_short,np.ndarray):
n_vec_in_short_list= n_vec_in_short.tolist()
else:
n_vec_in_short_list = n_vec_in_short
#get the sample size of the last stratum
n_last_stratum = total_sample - sum( n_vec_in_short_list)
#now create the vector that is of lenght n_strata
n_vec = n_vec_in_short_list
n_vec.append(n_last_stratum)
variance_total=0.0
#get the sum of variance across strata
for h in range(0,n_strata):
variance_total = variance_total + (strata_size[h]**2)*strata_variance[h]/n_vec[h]
return variance_total*scale_value
solution = minimize(objective_function, [2500,2500,2500] , method='BFGS' )
print(solution)
true_optimum = objective_function([2000,2000,2000])
print(true_optimum)
Я знаю, как это исправить для минимального рабочего примера. Но что касается реальной проблемы, над которой я работаю, я был бы признателен за помощь в лучшем понимании SciPy, чтобы понять, как лучше всего устанавливать параметры для алгоритмов, использующих числовые производные, чтобы лучше избегать подобных проблем сходимости.
Попробовали специальные решения, которые сработали, но нужна помощь сообщества, чтобы понять, свести к лучшему, чтобы иметь менее специальное решение
Подробнее здесь: https://stackoverflow.com/questions/788 ... all-values