Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 为什么scipy.optimize.curve_拟合不能正确拟合数据?_Python_Numpy_Matplotlib_Curve Fitting_Data Fitting - Fatal编程技术网

Python 为什么scipy.optimize.curve_拟合不能正确拟合数据?

Python 为什么scipy.optimize.curve_拟合不能正确拟合数据?,python,numpy,matplotlib,curve-fitting,data-fitting,Python,Numpy,Matplotlib,Curve Fitting,Data Fitting,一段时间以来,我一直在尝试使用scipy.optimize.curve\u fit将函数拟合到一些数据,但我遇到了真正的困难。我真的看不出这有什么不起作用的原因 # encoding: utf-8 from __future__ import (print_function, division, unicode_literals, absolute_im

一段时间以来,我一直在尝试使用
scipy.optimize.curve\u fit
将函数拟合到一些数据,但我遇到了真正的困难。我真的看不出这有什么不起作用的原因

# encoding: utf-8
from __future__ import (print_function,
                        division,
                        unicode_literals,
                        absolute_import,
                        with_statement)
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as mpl

x, y, e_y = np.loadtxt('data.txt', unpack=True)

def f(x, a, k):
    return (1/(np.sqrt(1 + a*((k-x)**2))))

popt, pcov = curve_fit(f, x, y, maxfev = 100000000)

mpl.plot(x, f(x, *popt), 'r-', label='Fit')
mpl.plot(x, y, 'rx', label='Original')
mpl.legend(loc='best')
mpl.savefig('curve.pdf')
print(popt)

# correct values which should be calculated
# a=0.003097
# k=35.4
下面是由上位代码生成的绘图图像:


首先,尽量不要将
maxfev
增加得太大,这通常是其他方面出问题的迹象!通过以下方法,我可以获得健康:

def f(x, b, a, k):
    return (b/(np.sqrt(1 + a*((k-x)**2))))

popt, pcov = curve_fit(f, x, y, p0=[20, 600.0, 35.0])
首先,假设你给出的拟合函数的最大值为1,因为数据中的峰值为600,所以它永远不会拟合。因此,我添加了一个总系数
b
。第二,努力帮助贫穷的老曲线拟合。如果用肉眼可以看到它在
x~35处达到峰值,那么通过
p0
来告诉它。这需要一些关于函数如何工作的直觉,但如果要使用曲线拟合函数,这一点非常重要


我查看了X-Y散点图上的原始数据,拟合该数据的方程似乎需要一个非常尖锐、狭窄的峰值。给出的方程式不会产生峰值响应。在我看来,由于这个原因,将这些数据拟合到给定的方程是行不通的。

什么样的函数是
f
?你为什么选择
curve\u fit
作为优化器?@Juh\u我选择
curve\u fit
,因为我不知道它的替代品。也许你可以告诉我,哪个优化器会更好。感谢我的问题是关于优化问题的优化选择(
f
&data)。格雷格的回答很好。@Greg你好,谢谢你的回答。我理解你的解释。不幸的是,我不得不使用给定的函数,这意味着您的附加系数
b
必须为1。在这个练习中我不能改变它。也许你可以告诉我另一种方法来获得我在代码中已经提到的
a
k
的正确值。谢谢你。@Greg对不起,你说得很对。给定的函数完全是“错误的”,永远不会适合数据。无法解决的错误练习真的很烦人。谢谢你的帮助!Marsch,在我看来,这个问题似乎遗漏了什么。如果要对现有数据进行标准化,那么此函数将正常工作,它是否要求您对其进行标准化?如果没有,那么它应该,或者给你b的函数。
def f(x, b, a, k):
    return (b/(np.sqrt(1 + a*((k-x)**2))))

popt, pcov = curve_fit(f, x, y, p0=[20, 600.0, 35.0])