【问题标题】:scipy curve_fit not working correctlyscipy curve_fit 无法正常工作
【发布时间】:2018-03-25 10:00:57
【问题描述】:

好像只适合第一个参数。

当我尝试使用 curve_fit 示例生成曲线时,一切都很好,但当我使用自己的数据时却不行。

这是我的原始数据:https://pastebin.com/0hs2JVXL

为了简单起见,我将其转换为整数,所以这是我提供给curve_fit 的数据:https://pastebin.com/2uP0iyTw

这是我试图拟合的曲线(基本上是带有刻度值的对数正态分布的公式):

def func(x, k, s, u):
    x=np.array(x)
    return k * (1 / (x * s * np.sqrt(2*np.pi)))  *  np.exp(  - np.power((np.log(x)-u),2)  /  (2*np.power(s , 2)))

这就是我使用它的方式:

graphData.append(
    {
        'x': xdata,
        'y': ydata,
        'name': "data",
        'mode': 'lines'
    }
)

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

graphData.append(
    {
        'x': xdata,
        'y': func(xdata, *popt),
        'name': "" + "[Fit]",
        'mode': 'lines'
    }
)

但这是我得到的输出数据:https://pastebin.com/WjaTH9wQ

这些是它设置的参数:k=33.06185171 s= 1. u=1.

并且可视化:

我完全不确定为什么这不起作用。

【问题讨论】:

  • 您是否尝试使用 p0 参数添加接近预期结果的初始猜测?
  • @jadsq 我会尽快尝试。我希望将来针对相同形状的不同图形自动执行此操作,所以我不确定依靠猜测是否是个好主意
  • 这里是一个使用 scipy.optimize.differential_evolution 遗传算法模块为曲线拟合创建 p0 初始参数估计的示例,该示例将碳纳米管的拉曼光谱数据拟合到双洛伦兹峰方程:bitbucket.org/zunzuncode/ramanspectroscopyfit - 根据您的具体情况修改此代码,您应该没问题。

标签: python numpy scipy regression curve-fitting


【解决方案1】:

使用 cmets 中的一个想法,我得到了它的工作:

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

data = np.loadtxt(open("scipycurve.csv", "rb"), delimiter=",", skiprows=1)
xdata = data[:,0]
ydata = data[:,1]
    
def func(x, k, s, u):
    x=np.array(x)
    return k * (1 / (x * s * np.sqrt(2*np.pi)))  *  np.exp(  - np.power((np.log(x)-u),2)  /  (2*np.power(s , 2)))

p0 = [1000,1,10]
popt, pcov = curve_fit(func, xdata, ydata, p0)

pyplot.figure()
pyplot.plot(xdata, ydata, label='Data', marker='o')
pyplot.plot(xdata,  func(xdata, popt[0], popt[1], popt[2]), 'g--')
pyplot.show()

print (popt)

[ 6.84279941e+07 5.09882839e-01 1.05414859e+01]

希望对您有所帮助。看起来算法在这种情况下需要一些帮助,通过给它参数。

【讨论】:

    猜你喜欢
    • 2020-12-22
    • 2017-02-04
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 2016-11-29
    • 2018-08-16
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多