python - 防止 symfit 模型共享参数对象

标签 python sympy symfit

多个 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 标签

最佳答案

好问题。原则上这是因为 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())

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

我希望这能回答您的问题,如果没有请告诉我。

附注我正在慢慢地回答我的方法,直到 1500 来制作那个标签,但如果有人打败我,我当然会更高兴;)

关于python - 防止 symfit 模型共享参数对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54988433/

相关文章:

python - 为什么 SymPy 1.1.1 在计算这个基本积分时返回错误?

python - 使用 symfit 进行全局拟合示例

python - 使用 Symfit : typestructure of dataset 进行全局拟合

python - 计算曲线下面积

python - 将具有 df 的两列值的两个数据框与另一个数据框的单列值连接起来。基于某些条件?

python - 如何计算 SymPy 中函数比率的形式幂级数? [属性错误: 'Mul' object has no attribute 'truncate' ]

python - 使用 Python Sympy 和 Latex 计算 10 的幂

python - 如何从 Pandas 数据框中提取 x 和 y 对,然后在 symfit 中使用?

Python - 如何始终将文档中找到的列表中的单词打印到另一个列表?

python - 如何实现粒子引擎