似乎它只适合第一个参数。
当我尝试使用curve_fit示例生成曲线时,这一切都很棒,但是当我使用自己的数据时却没有。
以下是我的原始数据:https://pastebin.com/0hs2JVXL
为了简单起见,我要转换为ingeger数字,所以这里的数据是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.
并想象:
我不确定为什么这不起作用。
答案 0 :(得分:2)
使用评论中的一个想法让我开始工作:
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]
希望它有所帮助。在这种情况下,通过给出参数,看起来算法需要一些帮助。