Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中适合散点图的指数函数_Python_Numpy_Matplotlib_Curve Fitting - Fatal编程技术网

Python中适合散点图的指数函数

Python中适合散点图的指数函数,python,numpy,matplotlib,curve-fitting,Python,Numpy,Matplotlib,Curve Fitting,我不确定为什么这个函数不适合数据。如果有人能给我指出正确的方向,那将非常有帮助。谢谢以下是代码和绘图: from scipy.optimize import curve_fit def func(x, a, b, c): return -a * np.exp(-b * x) + c popt, pcov = curve_fit(func, phases, vels, bounds=([1, .1, -5000], [10, 2, 0])) plt.scatter(phases, vel

我不确定为什么这个函数不适合数据。如果有人能给我指出正确的方向,那将非常有帮助。谢谢以下是代码和绘图:

from scipy.optimize import curve_fit
def func(x, a, b, c):
    return -a * np.exp(-b * x) + c

popt, pcov = curve_fit(func, phases, vels, bounds=([1, .1, -5000], [10, 2, 0]))
plt.scatter(phases, vels)
phase2 = np.linspace(90,400,num=1000)
plt.plot(phase2, func(phase2, *popt), 'r-')
plt.show()


你做的每件事都很好,但是曲线拟合在收敛上有困难,因为它不知道要看哪里。我看到您试图通过强制设置一些边界来缩小正确的参数。这就像大海捞针。问题是,计算机、浮点运算等根本不知道哪些值对数据重要,哪些值不重要。长话短说,如果我们规范化您的数据,那么这将大大有助于它。如果希望公式对未规范化的数据起作用,可以向后运行规范化参数

from scipy.optimize import curve_fit 

def func(x, a, b, c): 
    return -a * np.exp(-b * x) + c 
norm_phases = (phases - phases.mean())/phases.std() 
norm_vels   = (vels   - vels.mean())/vels.std() 

popt, pcov = curve_fit(func, norm_phases, norm_vels,bounds=(0,[3,1,5])) 
plt.scatter(norm_phases,norm_vels) 
phase2 = np.linspace(-1.2,3,num=10000) 
plt.plot(phase2, func(phase2, *popt), 'r-') 
plt.show() 

大多数算法都针对外观正常的数据进行了优化。价值真的很大或很小的东西会把它扔掉

你做的每件事都很好,但是曲线拟合在收敛方面遇到了困难,因为它不知道从哪里看。我看到您试图通过强制设置一些边界来缩小正确的参数。这就像大海捞针。问题是,计算机、浮点运算等根本不知道哪些值对数据重要,哪些值不重要。长话短说,如果我们规范化您的数据,那么这将大大有助于它。如果希望公式对未规范化的数据起作用,可以向后运行规范化参数

from scipy.optimize import curve_fit 

def func(x, a, b, c): 
    return -a * np.exp(-b * x) + c 
norm_phases = (phases - phases.mean())/phases.std() 
norm_vels   = (vels   - vels.mean())/vels.std() 

popt, pcov = curve_fit(func, norm_phases, norm_vels,bounds=(0,[3,1,5])) 
plt.scatter(norm_phases,norm_vels) 
phase2 = np.linspace(-1.2,3,num=10000) 
plt.plot(phase2, func(phase2, *popt), 'r-') 
plt.show() 

大多数算法都针对外观正常的数据进行了优化。价值真的很大或很小的东西会把它扔掉

你确定公式正确吗?是否确实要将
-b
提升到
x
电源?也许你的意思是
x**(-b)
“阶段”没有定义。@Craig我错了,我想要e^(-bx)。我用我的新代码更新了这个问题,但它似乎仍然不符合数据。我也更新了绘图。@BobbyOcean我现在包含了数据,以便您可以查看,但我在运行之前定义了阶段。我也更新了我现在正在使用的代码。考虑使用JejjJuelelin估计参数的方法。例如:你确定公式是正确的吗?是否确实要将
-b
提升到
x
电源?也许你的意思是
x**(-b)
“阶段”没有定义。@Craig我错了,我想要e^(-bx)。我用我的新代码更新了这个问题,但它似乎仍然不符合数据。我也更新了绘图。@BobbyOcean我现在包含了数据,以便您可以查看,但我在运行之前定义了阶段。我也更新了我现在正在使用的代码。考虑使用JejjJuelelin估计参数的方法。例如:我增加了一些界限,但是你可以肯定地玩这些参数。你的边界越大,计算机就越难收敛。此外,我将你的相位和电平转换为numpy数组,这样我可以很容易地对它们进行规范化,以防不清楚。我添加了一些边界,但你当然可以使用它们。你的边界越大,计算机就越难收敛。此外,我将你的相位和电平转换为numpy数组,这样我就可以很容易地对它们进行规范化,以防不清楚。