Nano Hash - криптовалюты, майнинг, программирование

Лучший способ найти корни многомерной скалярной функции с помощью SciPy

Предположим, у меня есть функция, область значений которой — скаляр, а область определения — вектор. Например:

def func(x):
  return x[0] + 1 + x[1]**2

Как найти корень a этой функции? scipy.optimize.fsolve и scipy.optimize.root ожидают, что func вернет вектор (а не скаляр), а scipy.optimize.newton принимает только скалярные аргументы. Я могу переопределить func как

def func(x):
  return [x[0] + 1 + x[1]**2, 0]

Тогда root и fsolve могут найти корень, но нули в якобиане означают, что он не всегда будет работать хорошо. Например:

fsolve(func, array([0,2]))
=> array([-5,  2])

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


РЕДАКТИРОВАТЬ: похоже, что следующее переопределение func работает лучше:

def func(x):
  fx = x[0] + 1 + x[1]**2
  return [fx, fx]

fsolve(func, array([0,5]))
=>array([-16.27342781,   3.90812331])

Так что теперь он готов изменить оба параметра. Хотя код все равно какой-то уродливый.

12.06.2014

  • Любая точка формы (-1 - y**2, y) является корнем, поэтому не имеет смысла запрашивать корень. В общем случае вы должны ожидать, что набор решений f(x,y)=0 будет кривой в плоскости (x,y). Вам нужна вторая функция или ограничение, если вы хотите уникальное решение. 12.06.2014
  • Да, если вы хотите быть педантичным, я ищу корень — предпочтительно тот, который относительно близок к первоначальному предположению. т.е. Я ищу что-то, что ведет себя как scipy.optimize.fsolve или scipy.optimize.root. 12.06.2014

Ответы:


1

Вы пробовали минимизировать абсолютное значение вашей функции, используя fmin? Например:

>>> import scipy.optimize as op
>>> import numpy as np

>>> def func(x):
>>>     return x[0] + 1 + x[1]**2
>>> func1 = lambda x: np.abs(func(x))

>>> tmp = op.fmin(func1, [10000., 10000.])
>>> func(tmp)
0.0
>>> print tmp
[-8346.12025122    91.35162971]
12.06.2014
  • Я бы лично не стал использовать это решение, за исключением некоторых видов функций, потому что выбор начальной точки важен, а Якоби не продолжается. Если вы знаете форму своей функции и она не очень сложна, это может быть решением. 12.06.2014
  • Я думал о том, чтобы попытаться минимизировать абсолютное значение (или квадрат), но решил, что может быть точнее (и, возможно, быстрее) искать корни, а не минимизировать функцию. Для реальной проблемы, которую я пытаюсь решить, у меня есть довольно хорошее начальное предположение, и функция приятная и гладкая, поэтому мне действительно нужен только метод Ньютона (или секущей). 12.06.2014

  • 2

    Поскольку для моей задачи у меня есть хорошая начальная догадка и не сумасшедшая функция, метод Ньютона работает хорошо. Для скалярной многомерной функции метод Ньютона принимает следующий вид:

    уравнение

    Вот грубый пример кода:

    def func(x): #the function to find a root of
      return x[0] + 1 + x[1]**2
    
    def dfunc(x): #the gradient of that function
      return array([1, 2*x[1]])
    
    def newtRoot(x0, func, dfunc):
      x = array(x0)
      for n in xrange(100): # do at most 100 iterations
        f  = func(x)
        df = dfunc(x)
    
        if abs(f) < 1e-6: # exit function if we're close enough
          break
    
        x = x - df*f/norm(df)**2 # update guess
      return x
    

    В использовании:

    nsolve([0,2],func,dfunc)
    => array([-1.0052546 ,  0.07248865])
    
    func([-1.0052546 ,  0.07248865])
    => 4.3788225025098715e-09
    

    Неплохо! Конечно, эта функция очень грубая, но вы поняли. Это также не будет хорошо работать для «хитрых» функций или для тех случаев, когда у вас нет хорошего начального предположения. Я думаю, что буду использовать что-то подобное, но затем вернусь к fsolve или root, если метод Ньютона не сходится.

    13.06.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..