Python 使用曲线拟合的Scipy奇怪结果

Python 使用曲线拟合的Scipy奇怪结果,python,scipy,mathematical-optimization,curve-fitting,Python,Scipy,Mathematical Optimization,Curve Fitting,当我尝试拟合我的数据时,结果有点奇怪,我不明白为什么?获得的拟合是平坦的,且第一个输入e=0。似乎在什么地方引起了除法错误。 唯一的工作情况是当我修改e[0]=1.0e-9时 结果如下: 从例子来看,我的例子似乎和我读到的不太一样,但我仍然被卡住了,所以你能帮我解释一下我的案例中出了什么问题吗 import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt src_s = np.a

当我尝试拟合我的数据时,结果有点奇怪,我不明白为什么?获得的拟合是平坦的,且第一个输入e=0。似乎在什么地方引起了除法错误。 唯一的工作情况是当我修改e[0]=1.0e-9时

结果如下:

从例子来看,我的例子似乎和我读到的不太一样,但我仍然被卡住了,所以你能帮我解释一下我的案例中出了什么问题吗

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

src_s = np.array((45.59,50.66664,59.74871,65.71018,72.76012,79.06256,84.13755,90.39944,
                  96.33653,101.65667,106.27968,110.76301,114.41808,117.21922,120.51836))
src_e = np.array((0.0,0.00126,0.00503,0.00804,0.01228,0.01685,0.02127,0.02846,0.03666,
                  0.04581,0.05620,0.06882,0.08005,0.09031,0.10327))
# plot source data
plt.plot(src_e, src_s, 'o')
# fitting function
def sigma(e, k ,n): return k*(e**n)
# find parameters curve fitting
param, var = curve_fit(sigma, src_e, src_s)
new_e = np.linspace(src_e.min(), src_e.max(), 50)
plt.plot(new_e, sigma(new_e, *param))

# modify first input
src_e[0]=1.0e-9
# relaunch parameters curve fitting
param, var = curve_fit(sigma, src_e, src_s)
new_e = np.linspace(src_e.min(), src_e.max(), 50)
plt.plot(new_e, sigma(new_e, *param))

plt.show()

提前感谢您的帮助。

问题的根源在于对参数的错误初始猜测(实际上没有为曲线拟合提供起始参数)

目标函数可以很容易地线性化。让我们这样做,然后做一个线性回归,为
曲线拟合
(通过
p0=
传递给它)获得一组好的初始猜测参数。得到的拟合效果更好(残留量更少),并且不需要替换to be
1e-9的第一个值:

In [38]:

src_e[0]=1.0e-9
# relaunch parameters curve fitting
param, var = curve_fit(sigma, src_e, src_s)
new_e = np.linspace(src_e.min(), src_e.max(), 50)
src_e[0]=0
plt.plot(new_e, sigma(new_e, *param))
plt.plot(src_e, src_s, 'ro')
plt.savefig('1.png')
print 'Residue is:', ((sigma(src_e, *param)-src_s)**2).sum()
Residue is: 2168.65307587


第一个点不能在曲线上,因此需要更改曲线公式:

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

src_s = np.array((45.59,50.66664,59.74871,65.71018,72.76012,79.06256,84.13755,90.39944,
                  96.33653,101.65667,106.27968,110.76301,114.41808,117.21922,120.51836))
src_e = np.array((0.0,0.00126,0.00503,0.00804,0.01228,0.01685,0.02127,0.02846,0.03666,
                  0.04581,0.05620,0.06882,0.08005,0.09031,0.10327))
# plot source data
plt.plot(src_e, src_s, 'o')

def sigma(e, k ,n, offset): return k*((e+offset)**n)
# find parameters curve fitting
param, var = curve_fit(sigma, src_e, src_s)
new_e = np.linspace(src_e.min(), src_e.max(), 50)
plt.plot(new_e, sigma(new_e, *param))
以下是输出:


请解释“结果有点奇怪,我不明白为什么”我为您添加了图像。欢迎来到SO谢谢你,我的朋友;)喝杯啤酒!我已经测试了代码,如果问题中包含了src_e[0]=0(及其相应的src_s[0]值),程序将生成“problem_curvefit.py:21:RuntimeWarning:power return k*(e**n)+s0Spyder中遇到的除以零的结果,它不会向我报告任何警告/错误消息……而控制台报告它:(非常感谢你的提示。偏移量确实可以是目标函数的一个附加参数,但它取决于实验结果。在这里,偏移量似乎提供了最佳拟合,并避免了零除误差。非常感谢你的帮助,我会记住你的方法,但我将尝试使用下一个答案,因为拟合似乎是be在曲线的开始处视觉效果更好,这是我案例中最重要的行为。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

src_s = np.array((45.59,50.66664,59.74871,65.71018,72.76012,79.06256,84.13755,90.39944,
                  96.33653,101.65667,106.27968,110.76301,114.41808,117.21922,120.51836))
src_e = np.array((0.0,0.00126,0.00503,0.00804,0.01228,0.01685,0.02127,0.02846,0.03666,
                  0.04581,0.05620,0.06882,0.08005,0.09031,0.10327))
# plot source data
plt.plot(src_e, src_s, 'o')

def sigma(e, k ,n, offset): return k*((e+offset)**n)
# find parameters curve fitting
param, var = curve_fit(sigma, src_e, src_s)
new_e = np.linspace(src_e.min(), src_e.max(), 50)
plt.plot(new_e, sigma(new_e, *param))