gpt4 book ai didi

python - scipy curve_fit 不喜欢数学模块

转载 作者:太空宇宙 更新时间:2023-11-03 15:48:40 26 4
gpt4 key购买 nike

在尝试使用 scipy.optimize curve_fit 创建示例时,我发现 scipy 似乎与 Python 的 math 模块不兼容。虽然函数 f1 工作正常,但 f2 会抛出一条错误消息。

from scipy.optimize import curve_fit
from math import sin, pi, log, exp, floor, fabs, pow

x_axis = np.asarray([pi * i / 6 for i in range(-6, 7)])
y_axis = np.asarray([sin(i) for i in x_axis])

def f1(x, m, n):
return m * x + n

coeff1, mat = curve_fit(f1, x_axis, y_axis)
print(coeff1)

def f2(x, m, n):
return m * sin(x) + n

coeff2, mat = curve_fit(f2, x_axis, y_axis)
print(coeff2)

完整的回溯是

Traceback (most recent call last):
File "/Documents/Programming/Eclipse/PythonDevFiles/so_test.py", line 49, in <module>
coeff2, mat = curve_fit(f2, x_axis, y_axis)
File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/minpack.py", line 742, in curve_fit
res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/minpack.py", line 377, in leastsq
shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/minpack.py", line 26, in _check_func
res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/minpack.py", line 454, in func_wrapped
return func(xdata, *params) - ydata
File "/Documents/Programming/Eclipse/PythonDevFiles/so_test.py", line 47, in f2
return m * sin(x) + n
TypeError: only length-1 arrays can be converted to Python scalars

错误消息与列表和 numpy 数组一样作为输入出现。它影响所有 math 函数,我测试过(参见导入中的函数)并且必须与 math 模块如何操作输入数据有关。这在 pow() 函数中最为明显 - 如果我不从 math 导入此函数,curve_fit 可以与 pow 一起正常工作()

显而易见的问题 - 为什么会发生这种情况以及如何将 math 函数与 curve_fit 一起使用?

P.S.:请不要讨论,不应该用线性拟合来拟合样本数据。这只是为了说明问题。

最佳答案

小心 numpy 数组、对数组的操作和对标量的操作!

Scipy optimize 假设输入(初始点)是一个一维数组,并且在其他情况下经常会出错(例如,一个列表变成一个数组,如果你假设在列表上工作,事情就会变得很糟糕;那些问题在 StackOverflow 上很常见,并且调试不是那么容易用眼睛完成;代码交互很有帮助!)。

import numpy as np
import math

x = np.ones(1)

np.sin(x)
> array([0.84147098])

math.sin(x)
> 0.8414709848078965 # this only works as numpy has dedicated support
# as indicated by the error-msg below!
x = np.ones(2)

np.sin(x)
> array([0.84147098, 0.84147098])

math.sin(x)
> TypeError: only size-1 arrays can be converted to Python scalars

老实说:这是对 numpy 非常基本的理解的一部分,在使用 scipy 的有些敏感的函数时应该理解。

关于python - scipy curve_fit 不喜欢数学模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48226089/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com