сообщение об ошибке при попытке минимизировать функцию с помощью scipy с использованием jacobian

Используя Python 3.6, я пытаюсь свести к минимуму функцию, используя scipy.optimize.minimize . Моя проблема минимизации – это два ограничения, и я могу найти решение. Пока у меня есть следующее:

 import numpy as np from scipy.optimize import minimize array = np.array([[3.0, 0.25, 0.75], [0.1, 0.65, 2.50], [0.80, 2.5, 1.20], [0.0, 0.25, 0.15], [1.2, 2.40, 3.60]]) matrix = np.array([[1.0, 1.5, -2.], [0.5, 3.0, 2.5], [1.0, 0.25, 0.75]]) def fct1(x): return -sum(x.dot(array.T)) def fct2(x): return x.dot(matrix).dot(x) x0 = np.ones(3) / 3 cons = ({'type': 'eq', 'fun': lambda x: x.sum() - 1.0}, {'type': 'eq', 'fun': lambda x: fct2(x) - tgt}) tgt = 0.15 w = minimize(fct1, x0, method='SLSQP', constraints=cons)['x'] res1 = fct1(w) res2 = fct2(w) 

Теперь я пытаюсь заставить свой оптимизатор работать быстрее, поскольку это только упрощенная проблема. В конце концов, мои массивы и матрицы намного больше. В предыдущем вопросе кто-то придумал идею оптимизации jacobian моей функции для оптимизации, поэтому я добавил следующее:

 def fct1_deriv(x): return -sum(np.ones_like(x).dot(array.T)) w = minimize(fct1, x0, method='SLSQP', jac=fct1_deriv, constraints=cons)['x'] 

Проблема в том, что при попытке запуска появляется следующее сообщение об ошибке:

 0-th dimension must be fixed to 4 but got 2 Traceback (most recent call last): File "C:\Anaconda2\envs\py36\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-111-d1b854178c13>", line 1, in <module> w = minimize(fct1, x0, method='SLSQP', jac=fct1_deriv, constraints=cons)['x'] File "C:\Anaconda2\envs\py36\lib\site-packages\scipy\optimize\_minimize.py", line 458, in minimize constraints, callback=callback, **options) File "C:\Anaconda2\envs\py36\lib\site-packages\scipy\optimize\slsqp.py", line 410, in _minimize_slsqp slsqp(m, meq, x, xl, xu, fx, c, g, a, acc, majiter, mode, w, jw) _slsqp.error: failed in converting 8th argument `g' of _slsqp.slsqp to C/Fortran array 

Любые идеи о том, что может быть проблемой? Ссылка на мой предыдущий ответ здесь: Каков самый быстрый способ свести к минимуму функцию в python?

  • matplotlib: как комментировать точку на разброс автоматически помещенной стрелки?
  • Эффективно накапливается коллекция редких scipy-матриц
  • Сохранение и загрузка Python dict с помощью savemat приводит к ошибке
  • Matplotlib - ступенчатая гистограмма с уже закодированными данными
  • Самый простой способ решения математических уравнений в Python
  • Библиотека коррекции базовой линии Python
  • Как найти точки пересечения прямой и нескольких кривых в Python?
  • Построение матрицы «свернутых» строк эффективно в Numpy
  • 2 Solutions collect form web for “сообщение об ошибке при попытке минимизировать функцию с помощью scipy с использованием jacobian”

    Ваша функция минимизации принимает 3 вектора в качестве входных данных, поэтому ваш якобиан должен соответственно быть 3-м вектором, причем каждый компонент является частной производной по отношению к соответствующему входному компоненту. SciPy жалуется на то, что не знает, что делать с единственным значением, которое вы ему даете.

    В вашем случае, я думаю, это то, что вы хотите:

     def fct1_deriv(x): return -np.sum(array, axis=1) 

    Кроме того, если скорость вызывает беспокойство, вы, вероятно, захотите использовать np.sum , а не sum , в fct1 .

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

    В задаче оптимизации вида y = x^2 решение может быть найдено путем дифференцирования y по x и решения путем задания производной, равной 0. Поэтому решение можно найти с 2x = 0.0 (решение для x=0.0 ). Поэтому у меня возникает ощущение, что передача якобиана (первой производной) функции для оптимизации помогает оптимизатору в поиске решения.

    В проблеме, которую я пытаюсь оптимизировать, моя функция имеет вид y = x . Эта функция не может быть оптимизирована (помимо предоставления ей ограничений), дифференцируя y отношению к x . Это приведет к следующему уравнению: 1.0 = 0.0 . Поэтому предоставление якобиана моей функции моему оптимизатору, вероятно, вызывает проблему из-за вышеизложенного.

    Python - лучший язык программирования в мире.