ScyPy curve_fit: нелинейная гиперповерхностная модель с несколькими переменными (11) и параметрами (23) - PullRequest
0 голосов
/ 03 ноября 2018

Большое спасибо за все вклады в переполнение стека. Я почти нахожу здесь ответ на мои вопросы без необходимости публиковать новые вопросы.

Я работаю над оптимизацией очень дорогой функции (для вычисления новой точки требуется несколько часов) с 11 переменными. Мы используем метод оптимизации суррогатной функции, и мне нужно подогнать «функцию суброгата» к «дорогой функции».

Для оптимизации мы выбрали полиномную функцию второго сорта a * x ** 2 + b * x + c для каждой из 11 переменных, поэтому имеем 11 (a) + 11 (b) + 1 (с) = 23 параметра

Я не нашел слишком много информации о scypy.curve_fit с несколькими переменными и параметрами.

Ниже приведен упрощенный код, включающий создание тестового стенда.

Вопросы: 1. Если вы напечатаете переменную X в оптимизируемой функции, вы увидите, что curve_fit каждый раз проходит весь начальный массив x1 без изменений. Что такое де объяснение? (Я не нашел никакой информации о внутреннем поведении кривой_прибора) 2. Вы рекомендуете другую функцию, чтобы соответствовать? 3. Является ли scypy хорошим инструментом для этой работы? У вас есть другие рекомендации? 4. Есть ли более пектонический способ управления параметрами?

import numpy as np
from scipy.optimize import curve_fit
def func_model(x, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
           b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11,
           c):
    a = [a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11]
    b = [b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11]
    y = np.sum(a * np.square(x) + b * x) + c
    return y
def func_model2(X, P):
    return func_model(X, P[0], P[1], P[2], P[3], P[4], P[5], P[6], P[7], P[8], P[9], P[10], P[11], P[12], P[13], P[14],
                  P[15],
                  P[16], P[17], P[18], P[19], P[20], P[21], P[22])
# =====================================================================================================================
# ====================================================Comienza el programam ============================================
p0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  # 2 x 11 + 1 parámetros
# Prepara las martrices X1 e Y1
x1 = np.zeros((30, 11), dtype=np.float64)
y1 = np.zeros(30, dtype=np.float64)
for sample in range(0, 30):
    x1[sample, :] = np.linspace(0.1, sample, 11)
for sample in range(0, 30):
    y1[sample] = func_model2(x1[sample, :], p0) + np.random.random(1) / 100
opt_param, opt_cov = curve_fit(func_model, x1, y1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...