Scipi минимизирует результаты по всем 0 параметрам - PullRequest
0 голосов
/ 18 января 2019

Итак, у меня есть набор значений (средние значения интенсивности по радиусу на изображении), и я хочу установить полиномиальную функцию для имитации эффекта виньетирования на рисунке. Проблема в том, что функция scipy.optimize.minimize возвращает мне только 0 параметров.

Вот некоторые примеры данных Z_RB, если вы хотите повторить то, что я делаю: Примечание: значения 0 в конце должны игнорироваться в процессе подбора. https://pastebin.com/MKqKgPFr График данных: https://imgur.com/a/7HRM3N5

Кроме того, ограничения не работают, мне нужно, чтобы моя функция была монотонно убывающей и начинающейся с 1. Ошибка: «IndexError: массивы, используемые в качестве индексов, должны иметь целочисленный (или логический) тип» Это не главный вопрос , но если у вас есть совет для меня там, я был бы рад услышать его, я, вероятно, создам второй вопрос для этого, как только сам примерка сработает.

Большая часть моего кода работала в других случаях раньше. Вызов scipy.optimize.minimize работает с упрощенной функцией, но, поскольку я не слишком много с ней работал, возможно, я просто что-то вызываю неправильно Функция звука, насколько я могу проверить это. Потеря тоже должна сработать, но это наиболее вероятный виновник, поскольку раньше это приводило к проблемам. Расчет Z_RB работает, я в этом уверен.

Вызов функции подгонки (p - степень многочлена):

polpar = np.zeros(p)
if config["fitter"]==1:
    V_fit = calc.fit_my_polyfit(Z_RB, polpar, filename)

Функция подгонки:

def fit_my_polyfit(Z_RB,param,title):
    last = np.amax(np.flatnonzero(Z_RB))
    print("polyfit with regularization")

    r = np.arange(0, len(Z_RB),dtype='uint32')
    b = (None,None)
    bnds = (b,)
    for i in range(len(param)-1):
        bnds = bnds + (b,)

    cons = ({'type': 'ineq', 'fun': lambda param: -np.diff(f(r,param))},
        {'type': 'eq', 'fun': lambda param: f(r, param)[0]-1})
    #The Constraints don't work, so they aren't called at the Moment
    res = minimize(loss, param, method='trust-constr', args=(Z_RB[3:last]), bounds=bnds)

    print(res.x)
var = res.x
    V_fit = f(r,var)
    Z_corr = np.minimum(np.divide(Z_RB, V_fit), 1)
    plt.figure(1)
    plt.clf()
    plt.plot(r, Z_RB, 'b-')
    plt.plot(r, V_fit, 'r-')
    plt.plot(r, Z_corr, "g-")
    plt.show()
    return V_fit

Функция потерь:

def loss(param, Z_RB):
    r = np.arange(0, len(Z_RB),dtype='uint32')
    V = f(r,param)
    ll = 1
    lr = 1
    L2 = m.sqrt(np.sum(np.power(np.subtract(Z_RB,f(r, param)),2)))
    reg = np.sum(np.power(param,2))
    return ll*L2 +lr*reg

Функция полинома:

def f(r, param):
    V = np.zeros(len(r),dtype='float32')
    poly = np.poly1d(param)
    V = poly(r)
    return V

Это текущий вывод: https://pastebin.com/P8iCCjan

...