8

我有一组数据点(下面代码中的 x 和 y),我正在尝试通过我的点创建一条最适合的线性线。我正在使用scipy.optimize.curve_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()
4

2 回答 2

6

您也可以使用 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()

这是输出:在此处输入图像描述

于 2013-10-31T18:35:16.563 回答
3

编辑:此行为现已在当前版本的 scipy 中进行了修补,以使其.curve_fit更加万无一失:

https://github.com/scipy/scipy/issues/3037


出于某种原因,.curve_fit真的希望输入是一个 numpy 数组,如果您将其传递给常规列表,则会给您错误的结果(恕我直言,这是意外行为,可能是一个错误)。将定义更改x为:

x=np.array([1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7])

你得到:

在此处输入图像描述

我猜想发生这种情况,因为m*xm 是一个整数,x 是一个列表,会产生该列表的 m 个副本,显然不是您要寻找的结果!

于 2013-10-31T19:29:58.757 回答