Python 为什么scipy.optimize.curve_fit不能为我的点生成最佳拟合线?

Python 为什么scipy.optimize.curve_fit不能为我的点生成最佳拟合线?,python,optimization,scipy,curve-fitting,Python,Optimization,Scipy,Curve Fitting,我有一组数据点,(下面代码中的x和y),我试图通过我的点创建一条最佳拟合的线性线。我正在使用scipy.optimize.curve\u fit。我的代码生成一行,但不是最佳拟合的行。我试着给出函数模型参数,用于梯度和截距,但每次都会产生完全相同的线,不适合我的数据点 蓝点是我的数据点,红线应适用于: 如果有人能指出我错在哪里,我将不胜感激: import numpy as np import matplotlib.pyplot as mpl import scipy as sp import

我有一组数据点,(下面代码中的x和y),我试图通过我的点创建一条最佳拟合的线性线。我正在使用
scipy.optimize.curve\u fit
。我的代码生成一行,但不是最佳拟合的行。我试着给出函数模型参数,用于梯度和截距,但每次都会产生完全相同的线,不适合我的数据点

蓝点是我的数据点,红线应适用于:

如果有人能指出我错在哪里,我将不胜感激:

import numpy as np
import matplotlib.pyplot as mpl
import scipy as sp
import scipy.optimize as opt

x=[1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7]
y=[6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828]
trialX = np.linspace(1.0,4.0,1000)                         #Trial values of x

def f(x,m,c):                                        #Defining the function y(x)=(m*x)+c
    return (x*m)+c

popt,pcov=opt.curve_fit(f,x,y)                       #Returning popt and pcov
ynew=f(trialX,*popt)                                                  

mpl.plot(x,y,'bo')
mpl.plot(trialX,ynew,'r-')
mpl.show()

您也可以使用numpy.polyfit获得最佳拟合线:

import numpy as np
import matplotlib.pyplot as mpl

x=[1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7]
y=[6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828]
trialX = np.linspace(1.0,4.0,1000)                         #Trial values of x

#get the first order coefficients 
fit = np.polyfit(x, y, 1)

#apply 
ynew = trialX * fit[0] + fit[1]                                              

mpl.plot(x,y,'bo')
mpl.plot(trialX,ynew,'r-')
mpl.show()

以下是输出:

编辑:此行为现在已在当前版本的scipy中进行了修补,以使
.curve\u fit
更加简单:


出于某种原因,
.curve\u fit
确实希望输入是一个numpy数组,如果您向它传递一个常规列表,它将给您错误的结果(这是一个意外行为,可能是一个bug)。将
x
的定义更改为:

x=np.array([1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7])
你会得到:


我猜这是因为
m*x
其中m是一个整数,x是一个列表,将生成该列表的m个副本,显然不是您想要的结果

我设法自己解决了这个问题。x被定义为列表,而不是数组。我只是简单地将np.array放在定义的x和y数组的前面,就解决了这个问题。我得出了相同的结论Lizi,我应该先看到这个评论!下次出现这种情况时,请随意将其作为您自己问题的答案发布并接受。请注意,这已被修补:您可以通过将拟合行更改为类似以下内容来扩展此答案:
fit\u poly=np.poly1d(np.polyfit(x,y,1))
ynew=fit\u poly(trialX)
。如果你以后愿意的话,这会使你更容易改成二次曲线。我给了你另一个向上投票,这应该足以将图片添加到你以后的文章中(并编辑这篇文章)。欢迎来到堆栈溢出!您不需要添加“希望这有帮助”之类的内容,如果有,您将获得投票,如果没有,您将获得反对票或要求澄清的评论。我们在这里尽量保持答案干净!这听起来像是curve_fit中的一个bug:你能在@Zhenya上提交一个问题吗?我一直在想,这不是一个bug,但对新用户来说是出乎意料的。因此,请注意:f是函数,而曲线拟合只是将x传递给它。因此,您应该检查您的函数是否具有正确的数据行为。:)