Как заставить большие шаги выполнять функции scipy.optimize?

У меня есть функция compare_images(k, a, b) которая сравнивает два 2d-массива a и b

Внутри funcion я применяю gaussian_filter с sigma=k к моей идее – оценить, сколько я должен сгладить изображение a чтобы оно было похоже на изображение b

Проблема заключается в том, что функция compare_images будет возвращать только разные значения, если k вариация более 0.5 , и если я делаю fmin(compare_images, init_guess, (a, b) она обычно зацикливается на значении init_guess .

Я считаю, что проблема fminminimize ) имеет тенденцию начинаться с очень маленьких шагов, что в моем случае будет воспроизводить то же самое возвращаемое значение для compare_images , и поэтому метод считает, что он уже нашел минимум. Он попробует пару раз.

Есть ли способ заставить fmin или любую другую функцию минимизации из scipy предпринять более крупные шаги? Или есть какой-либо метод, более подходящий для моей потребности?

EDIT: Я нашел временное решение. Во-первых, как рекомендовано, я использовал xtol=0.5 и выше в качестве аргумента для fmin . Даже тогда у меня все еще были проблемы, и несколько раз fmin возвращал init_guess . Затем я создал простой цикл, так что если fmin == init_guess , я бы сгенерировал еще одну случайную init_guess и попробовал ее снова.

Конечно, это довольно медленно, но теперь я получил его для запуска. Это займет 20 часов или около того, чтобы запустить его для всех моих данных, но мне не нужно будет делать это снова.

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

  • У меня есть 2 изображения, A и B , содержащие некоторые научные данные.
  • A выглядит как несколько точек с переменным значением (это матрица, в которой каждая значащая точка представляет собой событие, в котором произошло событие, и его интенсивность)
  • B выглядит как сглаженная тепловая карта (это наблюдаемая плотность появления)
  • B выглядит так, как если бы вы применили гауссовский фильтр к A с небольшим количеством случайных помех.
  • Мы приближаем B , применяя гауссовский фильтр с постоянной sigma к A Эта sigma была выбрана визуально, но работает только для определенного класса изображений.
  • Я пытаюсь получить оптимальную sigma для каждого изображения, поэтому позже я мог найти некоторые отношения sigma и класс события, показанный на каждом изображении.

В любом случае спасибо за помощь!

  • Установка numpy в PyCharm в Windows
  • Постройте цветовое колесо (полярное) на основе цветовой карты с использованием Python / Matplotlib
  • Передача функции python на массивы numpy
  • python scipy.stats.powerlaw отрицательный показатель
  • Интерполяция Python / Scipy (map_coordinates)
  • Вычисление спектра мощности в python
  • Значение по умолчанию scipy.sparse
  • Как работает функция scipy distance_transform_edt?
  • 2 Solutions collect form web for “Как заставить большие шаги выполнять функции scipy.optimize?”

    Быстрая проверка: вы, вероятно, действительно имели в виду fmin(compare_images, init_guess, (a,b)) ?

    Если gaussian_filter ведет себя так, как вы говорите, ваша функция кусочно-постоянна, что означает, что оптимизаторы, полагающиеся на производные (то есть большинство из них), отсутствуют. Вы можете попробовать глобальный оптимизатор, такой как отжиг или грубой поиск по разумному диапазону k .

    Однако, как вы описали проблему, в общем случае будет только ясный глобальный минимум compare_images если b – сглаженная версия a . Ваш подход имеет смысл, если вы хотите определить количество сглаживания, что делает оба изображения наиболее похожими.

    Если вопрос «насколько похожи изображения», то я думаю, что сравнение по пикселям (возможно, с небольшим сглаживанием) – это путь. В зависимости от того, какие изображения мы говорим, может потребоваться сначала выровнять изображения (например, для сравнения фотографий). Просьба уточнить 🙂

    edit : Еще одна идея, которая может помочь: переписать compare_images так, чтобы он вычислял две версии сглаженных-один с sigma = floor(k) и один с ceil(k) (т. е. round k для следующего-нижнего / более высокого int) , Затем вычислите a_smooth = a_floor*(1-kfrac)+a_ceil*kfrac , причем kfrac является дробной частью k . Таким образом, функция сравнения становится непрерывной по k .

    Удачи!

    Спрыгивание в бассейне может немного улучшить, поскольку у него есть большая вероятность продолжения в любом случае, когда он застревает на плато.

    Я нашел в этом примере функцию, что она достаточно хорошо работает при низкой температуре:

     >>> opt.basinhopping(lambda (x,y): int(0.1*x**2 + 0.1*y**2), (5,-5), T=.1) nfev: 409 fun: 0 x: array([ 1.73267813, -2.54527514]) message: ['requested number of basinhopping iterations completed successfully'] njev: 102 nit: 100 
    Interesting Posts
    Python - лучший язык программирования в мире.