首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻止symfit模型共享参数对象

阻止symfit模型共享参数对象
EN

Stack Overflow用户
提问于 2019-03-05 01:23:16
回答 1查看 105关注 0票数 3

多个symfit模型实例共享具有相同名称的参数对象。我想知道这种行为是从哪里来的,它的意图是什么,以及是否有可能停用它。

为了说明我的意思,我们举一个最小的例子:

代码语言:javascript
复制
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标签吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-05 17:48:58

问得好。原则上这是因为Parameter对象是sympy.Symbol的子类,并且从它的文档字符串:

代码语言:javascript
复制
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中使用它。但是,值和固定参数不被视为假设,因此它们不用于区分参数。

现在,对于你关于这将如何影响拟合的问题。就像你说的,顺序工作是一个很好的解决方案,而且不会有任何副作用:

代码语言:javascript
复制
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())

因此,不需要在每次迭代中定义一个新的Parameterb.value属性在每个循环中都是相同的,所以这不可能出错。我能想象的唯一的错误是,如果你使用threading,那可能会产生一些竞争条件。但是无论如何,threading对于CPU受限的任务是不可取的,multiprocessing是可行的。在这种情况下,将产生单独的进程,创建单独的微观世界,因此也不会有问题。

我希望这能回答你的问题,如果不能,请让我知道。

附注:我正在慢慢地回答,直到1500才能做这个标签,但如果有人先我一步,我当然会更高兴;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54988433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档