По сути, вы хотите минимизировать ошибку между оценкой и реальной функцией.
EDIT: Очевидным выбором здесь является использование градиентного спуска по 4 параметрам. Если вы не хотите этого делать и просите более прагматичное решение, вот оно.
Основная проблема здесь в том, что есть 4 параметра. Чтобы решить эту проблему, вы можете сделать это:
- Исправьте любые 3 параметра, оставьте последний без изменений. Попробуем найти это значение.
- Найдите обратную функцию и решите ее либо явно, либо с помощью решателя (это может быть численный метод, такой как метод Ньютона-Рафсона или метод Брента).
Я опишу процесс, чтобы продемонстрировать эту идею. Мы будем использовать scalar_minimizer от scipy, который использует метод Брента.
Для обсуждения давайте сохраним вашу функцию, состоящую из 2 параметров, и предположим, что ваша функция:
def f(p1, p2):
return p1 + np.sqrt(p2)
вы в основном спрашиваете, как найти и значения p1, p2 такие, что f (p1, p2) = 100. Предполагаемые диапазоны следующие:
- диапазоны для p1: 10-20
- диапазоны для p2: 20-30
Давайте зафиксируем p1 равным 10 (вы можете зафиксировать любое значение в этом диапазоне). Теперь функция становится
def g(p2):
return 10 + np.sqrt(p2)
Мы хотим, чтобы это было как можно ближе к 100, поэтому давайте создадим функцию ошибки, которая измеряет, насколько наша оценка далека от 100.
def error(p2):
return 100 - (10 + np.sqrt(p2)) # we want to minimize this
Вы можете найти значение, чтобы свести к минимуму эту ошибку, чтобы вы могли быть как можно ближе к 100 через
from scipy import optimize
optimize.minimize_scalar(error, bounds = (10,20), method = "bounded")
что дает значение x = 19,9 как значение, которое минимизирует ошибку.
person
Emmet B
schedule
21.02.2018
param3
никогда не используется. - person sascha   schedule 21.02.2018