Вопрос по scipy – Положительная производная по направлениям для линейного поиска

9

Что означает «scipy.optimize» для положительной производной по направлениям для линейного поиска? имею в виду?

например в fmin_slsqp http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html

Пожалуйста, дайте ссылку на страницу документации. Sven Marnach

Ваш Ответ

5   ответов
5

вы также можете попробовать поэкспериментировать с параметрами ftol и eps. Изменение ftol на более высокое значение эквивалентно изменению функции на меньшее значение.

лучше подходит как комментарий
Правда что. Я сделал ошибку при публикации и не знал, как ее исправить.
1

но вы можете увидеть исходный код, который генерирует смуду здесь:

https://github.com/scipy/scipy/blob/master/scipy/optimize/slsqp/slsqp_optmz.f

Назначенияmode = 8 («Позитивная производная по направлениям для поиска строки», о которой вы спрашиваете) можно найти в строках 412 и 486. Если вы можете выяснить, почему они назначены в коде, вы получили свой ответ.

1

x0 is outside the valid range you defined in bounds. and the unconstrained maximum is attained for values outside bounds.

Я создам гипотетическую задачу оптимизации, запустю ее с двумя разными начальными значениями и выведу выводscipy.optimize:

import numpy as np
from scipy import optimize

H = np.array([[2., 0.],
              [0., 8.]])

c = np.array([0, -32])

x0 = np.array([0.5, 0.5])    # valid initial value
x1 = np.array([-1, 1.1])     # invalid initial value

def loss(x, sign=1.):
    return sign * (0.5 * np.dot(x.T, np.dot(H, x)) + np.dot(c, x))

def jac(x, sign=1.):
    return sign * (np.dot(x.T, H) + c)

bounds = [(0, 1), (0, 1)]

Теперь, когда есть функция потерь, градиент, x0 и границы, мы можем решить проблему:

def solve(start):
    res = optimize.minimize(fun=loss, 
                            x0=start, 
                            jac=jac, 
                            bounds=bounds,
                            method='SLSQP')
    return res



solve(x0)   # valid initial value
# fun: -27.999999999963507
# jac: array([ 2.90878432e-14, -2.40000000e+01])
# message: 'Optimization terminated successfully.'
# ...
#  status: 0
# success: True
# x: array([1.45439216e-14, 1.00000000e+00])

solve(x1)      # invalid initial value:
#  fun: -29.534653465326528
#  jac: array([ -1.16831683, -23.36633663])
#  message: 'Positive directional derivative for linesearch'
#  ...
#  status: 8
#  success: False
#  x: array([-0.58415842,  1.07920792])

Как @pv. Как указано в принятом ответе, алгоритм не может проверить, что это минимум:

I think this message means that the optimizer got into a position where it did not manage to find a direction where the value of the objective function decreases (fast enough), but could also not verify that the current position is a minimum.

15

выбирая направление спуска, а затем выполняя поиск линии в этом направлении. Я думаю, что это сообщение означает, что оптимизатор попал в положение, в котором ему не удалось найти направление, в котором значение целевой функции уменьшается (достаточно быстро), но также не может проверить, является ли текущая позиция минимальной.

12

что это значит, но как это решить. По сути, оптимизируемая функция должна возвращать меньшее значение.

F(x):
    ...
    return value / 10000000
Я знаю, что это старый вопрос, но если вы делите функцию для оптимизацииn уговорить метод работать, что вы делаете со значениямиx в решениях?
Более общий ответ заключается в том, что оптимизируемая функция плохо масштабируется. Я думаю, что в идеале оптимизируемая функция должна давать среднее значение где-то в диапазоне 1-5. Для моего использования я должен был умножить на 1000.
@ Windstorm1981, если масштабировать только цель, то значения решенияx должно быть хорошо, как есть. Если, однако, вы также масштабировали входные значения, то вам необходимо изменить масштабирование в конце, чтобы получить фактическое решение. Для этих проблем на самом деле лучше, если все значения, как исходные, так и целевые, масштабируются до первого порядка. Требуется некоторое усилие, чтобы реализовать это масштабирование и немасштабирование в конце, но если проблема оптимизации велика, это должно помочь сходимости много.

Похожие вопросы