Предотвращение совместного использования моделей параметров объектами параметров - PullRequest
0 голосов
/ 04 марта 2019

Несколько экземпляров модели Symfit совместно используют объекты параметров с одинаковыми именами.Я хотел бы понять, откуда это поведение, каково его намерение и возможно ли его отключить.

Чтобы проиллюстрировать, что я имею в виду, приведен минимальный пример:

import symfit as sf
# Create Parameters and Variables
a = sf.Parameter('a',value=0)
b = sf.Parameter('b',value=1,fixed=True)
x, y = sf.variables('x, y')

# Instanciate two models
model1=sf.Model({y:a*x+b})
model2=sf.Model({y:a*x+b})

# They are indeed not the same
id(model1) == id(model2)
>>False

# There are two parameters
print(model1.params)
>>[a,b]
print(model1.params[1].name, model1.params[1].value)
>>b 1
print(model2.params[1].name, model2.params[1].value)
>>b 1
#They are initially identical

# We want to manually modify the fixed one in only one model
model1.params[1].value = 3
# Both have changed
print(model1.params[1].name, model1.params[1].value)
>>b 3
print(model2.params[1].name, model2.params[1].value)
>>b 3
id(model1.params[1]) == id(model2.params[1])
>>True
# The parameter is the same object

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

PS: Может ли кто-нибудь с достаточной репутацией создать тег symfit

1 Ответ

0 голосов
/ 05 марта 2019

Отличный вопрос.В принципе это происходит потому, что Parameter объекты являются подклассом sympy.Symbol, а из его строки документации:

Symbols are identified by name and assumptions:

>>> from sympy import Symbol
>>> Symbol("x") == Symbol("x")
True
>>> Symbol("x", real=True) == Symbol("x", real=False)
False

Это является фундаментальным для внутренней работы sympy, и, следовательно, что-то, что мы также используем вsymfit.Но значение и фиксированные аргументы не рассматриваются как предположения, поэтому они не используются для различения параметров.

Теперь к вашему вопросу о том, как это повлияет на подгонку.Как вы говорите, последовательная работа - это хорошее решение, которое не будет иметь побочных эффектов:

model = sf.Model({y:a*x+b})
b.fixed = True
fit_results = []

for b_value, xdata, ydata in datastream:
    b.value = b_value
    fit = Fit(model, x=xdata, y=ydata)
    fit_results.append(fit.execute())

Так что нет необходимости определять новый Parameter каждую итерацию, атрибут b.valueбудет одинаковым в каждом цикле, так что это не может пойти не так.Единственный способ, которым я могу представить, что это идет не так, если вы используете threading, это, вероятно, создаст некоторые условия гонки.Но в любом случае threading нежелателен для задач, связанных с процессором, multiprocessing - это путь.И в этом случае будут порождаться отдельные процессы, создавая отдельные микрокосмы, поэтому здесь тоже не должно быть никаких проблем.

Надеюсь, это ответит на ваш вопрос, если не даст мне знать.

psЯ медленно отвечаю на свой путь до 1500, чтобы сделать этот тег, но если кто-то превзойдет меня, я, конечно же, буду счастливее;)

...