Как заставить большие шаги выполнять функции 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 и класс события, показанный на каждом изображении.

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

  • Использование scipy.io.savemat для сохранения вложенных списков
  • Получить координаты локальных максимумов в 2D-массиве выше определенного значения
  • Распознавание формы с помощью numpy / scipy (возможно, водораздела)
  • Как исправить утечку памяти в scipy.stats при генерации случайных вариаций с помощью rv_continuous?
  • Заполнение пробелов в массиве numpy
  • Детерминированный скрипт python ведет себя недетерминированным образом
  • Как использовать scipy.weave.inline вместе с внешними библиотеками C?
  • fmin_cg: Желаемая ошибка не всегда достигается из-за потери точности
  • 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

    как передать аргумент в потоки?

    Есть ли плагин для vim для автоматического импорта библиотек python?

    предупреждения, выпущенные во время 'easy_install'

    используя pyodbc на linux для вставки символов unicode или utf-8 в поле nvarchar mssql

    Перегрузка функций в Python: отсутствует

    как извлечь значения из <связанного метода Server.diagnostics <Server: ubuntu12_6 >>?

    Как я могу очистить первую ссылку поиска Google с красивым супом

    Хороший XML-принтер Python с lxml

    Удалить последнюю строку ввода в Python

    Как сопоставить регулярное выражение с группировкой с неизвестным количеством групп

    Треугольные индексы для многомерных массивов в numpy

    Сохранение операторов соединения pyqt, когда пользовательский интерфейс все еще меняется

    Проблема с отправкой запросов POST с использованием запросов библиотеки

    Преобразование единиц в Python

    Могу ли я создавать обработчики сообщений OSC, содержащие подстановочные знаки?

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