首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指数相减计算对称拟合模型时的AttributeError

指数相减计算对称拟合模型时的AttributeError
EN

Stack Overflow用户
提问于 2019-01-10 17:47:33
回答 1查看 199关注 0票数 3

我建立了一个模型,用指数中的相减来拟合一些数据。它适用于fits,但是当我显式地计算模型时,我得到了奇怪的结果和一个AttributeError:'Mul‘对象没有属性'exp’。

这个问题似乎源于lambdify的工作方式,并在评估包含非平凡函数(如增强或指数)的模型时发生。

代码语言:javascript
复制
import symfit as sf

a = sf.Parameter('a',1,0,2) #name, initial value, minimum, maximum
b = sf.Parameter('b',1,0,2)
c=sf.Parameter('c',1,0,2)
x, y = sf.variables('x, y')

model=sf.Model({y: a * (c - sf.exp((x) / b))})
model(1,a,b,c)
Out: Ans(y=a*(c + 1))

model=sf.Model({y: a * (1 - sf.exp((x-c) / b))})
model(1,a,b,c)
Traceback (most recent call last):

  File "<ipython-input-9-faba3b52b923>", line 1, in <module>
    model(1,a,b,c)

  File "C:\PortablePrograms\Python\WPy-3670\python-3.6.7.amd64\lib\site-packages\symfit\core\fit.py", line 334, in __call__
    return Ans(*self.eval_components(**bound_arguments.arguments))

  File "C:\PortablePrograms\Python\WPy-3670\python-3.6.7.amd64\lib\site-packages\symfit\core\fit.py", line 296, in eval_components
    return [expr(*args, **kwargs) for expr in self.numerical_components]

  File "C:\PortablePrograms\Python\WPy-3670\python-3.6.7.amd64\lib\site-packages\symfit\core\fit.py", line 296, in <listcomp>
    return [expr(*args, **kwargs) for expr in self.numerical_components]

  File "C:\PortablePrograms\Python\WPy-3670\python-3.6.7.amd64\lib\site-packages\sympy\utilities\lambdify.py", line 444, in wrapper
    return funcarg(*newargs, **kwargsx)

  File "<string>", line 1, in <lambda>

AttributeError: 'Mul' object has no attribute 'exp'

我希望参数的初始值被使用,或者得到一个象征性的答案,但两者都得不到。

因此,对于第一个模型,结果是错误的,也是不一致的。

代码语言:javascript
复制
Ans(y=a*(c-exp(1/b)) 

代码语言:javascript
复制
Ans(y=a*(c-1)) 

或者只是简单的

代码语言:javascript
复制
Ans(y=0)

对于第二个模型,lambdify似乎无法解析表达式。

在使用sf.sqrt()或sympy.exp()时也是如此。我在python3.6.7和IPython 7.1.1中工作,使用Symfit 0.4.6和Sympy1.1.1(因为Symfit不适用于更高版本的pip)。

我可以使用任何一种模型来拟合数据,并使用最好的拟合参数来评估模型,如这里的示例(https://pypi.org/project/symfit/)所示。线

代码语言:javascript
复制
yfit = model(x=xdata, **fit_result.params)[y] 

也不能工作(在python 2.7、3.5和3.6上尝试),除非更改为

代码语言:javascript
复制
yfit = [model(x=x, **fit_result.params) for x in xdata]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-29 10:04:57

Model中调用symfit意味着符号表达式被转换为lambda函数,即不再是符号的普通python函数。

在您的例子中,调用

代码语言:javascript
复制
sf.Model({y: a * (c - sf.exp((x) / b))})

等于写

代码语言:javascript
复制
lambda x, a, b, c: a * (c - np.exp((x) / b))

注意,符号指数现在已更改为numpy指数。从这个例子中可以看出,模型不是用符号表达式调用的,而是用数字或数组调用的。

所以你的电话应该改为

代码语言:javascript
复制
model(x=1, a=1, b=1, c=1)

如果您需要在符号级别上工作,请继续直接使用Model中的表达式,该调用纯粹用于数字用途。

最后,文档中的示例假设xdata是一个数组,但在示例中它是一个列表。那应该由我来更新。

最后,学习喜欢python中的关键字参数;)。以下内容相当于:

代码语言:javascript
复制
a = sf.Parameter('a',1,0,2) #name, initial value, minimum, maximum
a = sf.Parameter('a', value=1, min=0, max=2)

但只有一个是自我记录:)。

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

https://stackoverflow.com/questions/54134273

复制
相关文章

相似问题

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