【问题标题】:using curve_fit function from scipy python使用来自 scipy python 的 curve_fit 函数
【发布时间】:2016-03-08 20:16:10
【问题描述】:

我对这个函数应该如何工作感到困惑。我正在尝试为 xdata 和 ydata 的数据集拟合一条最佳拟合线。此代码会产生错误,但我不明白 curve_fit 函数应该如何工作,或者我是否对我想做的事情使用了正确的术语。绘制在图表上的 xdata 和 ydata 会产生弯曲的图案,先上升,然后下降。非常感谢任何帮助。

#define xdata dnd ydata 
xdata = np.array([-2,-1.64,-1.33,-0.7,0,0.45,1.2,1.64,2.32,2.9])
ydata = np.array([0.699369,0.700462,0.695354,1.03905,1.97389,2.41143,1.91091,0.919576,-0.730975,-
1.42001]) 



# get the curve fit funtion 
from scipy.optimize import curve_fit
def func(xdata, p1, p2):
    return p1*np.cos(p2*xdata) + p2*np.sin(p1*xdata)


popt, pcov = curve_fit(func, xdata, ydata)


#plot code for data points 
plot.plot(xdata,ydata,"bo",label="Xdata and Ydata")
plot.plot(popt,pcov,"r--",label="Curve of Best Fit")
plot.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plot.show()

目前这会产生一条直线,它不是最适合数据的曲线。我试图尽可能地反映数据模式,但目前我还差得很远。

【问题讨论】:

  • 函数中的x是什么?你的意思是xdata
  • 我的意思是它是 xdata(我认为),但我只是更改了它,现在我收到错误“只有长度为 1 的数组可以转换为 Python 标量”
  • 因为你需要np.cosnp.sin
  • 您将协方差矩阵绘制为最佳拟合参数的函数。您可能需要阅读 curve_fit 的输出:您需要自己创建最佳拟合曲线,使用 popt 作为输入。 @eph 的回答最清楚。

标签: python matplotlib scipy


【解决方案1】:

你错过了什么:

  1. 正如我在 cmets 中所说,您需要 np.cosnp.sin。这是因为xdataydata(10,) 形状的numpy 数组。因此 Python 无法识别,它必须是 (10,1)
  2. 您需要为数据定义一个linspace,在下面的示例中称为xfine

这是一个工作示例:

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

#define xdata dnd ydata 
xdata = np.array([-2,-1.64,-1.33,-0.7,0,0.45,1.2,1.64,2.32,2.9])
ydata = np.array([0.699369,0.700462,0.695354,1.03905,1.97389,2.41143,1.91091,0.919576,-0.730975,-
1.42001]) 

def func(xdata, p1, p2):
    return p1*np.cos(p2*xdata) + p2*np.sin(p1*xdata)

xfine = np.linspace(xdata.min(), xdata.max(), 100)

popt, pcov = curve_fit(func, xdata, ydata)

plt.plot(xdata, ydata, '.');
plt.plot(xfine, func(xfine, popt[0], popt[1]),'r-')

【讨论】:

    【解决方案2】:

    你需要使用numpy.cos而不是math.cos来处理向量:

    def func(xdata, p1, p2):
        return p1*np.cos(p2*xdata) + p2*np.sin(p1*xdata)
    

    你需要生成这样的拟合曲线:

    xfit = np.linspace(xdata[0], xdata[-1], 100)
    yfit = func(xfit, *popt)
    plt.plot(xdata, ydata)
    plt.plot(xfit, yfit)
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 2014-09-05
      • 2021-02-16
      • 1970-01-01
      • 2016-04-24
      • 2021-08-11
      • 2021-03-19
      • 2016-09-16
      • 2017-04-11
      • 1970-01-01
      相关资源
      最近更新 更多