我目前正在尝试几种方法来拟合,然后使用二次多项式函数转换一些数据。我一直在使用以下代码:
import matplotlib.pyplot as plt
import numpy
from scipy.optimize import curve_fit
def fitFunc(self, x,a,b,c):
return a*x**2 + b*x + c
def calcQuadratic(self,data):
""" This function fits the specified function in 'fitFunc'
to the data, using the curve_fit package from scipy.optimize.
INPUT: A list of (m/z,int) tuples
OUTPUT: The parameters for the fitted function
"""
expected = []
observed = []
for i in data:
expected.append(i[0])
observed.append(i[1])
z = curve_fit(self.fitFunc, observed, expected)
#############
# Plot Code #
#############
newX = numpy.linspace(0,400,2500)
yNew = self.fitFunc(newX,*z[0])
fig = plt.figure()
ax = fig.add_subplot(111)
plt.scatter(expected,observed,label='raw')
plt.plot(newX,yNew,label='obs-exp')
plt.legend()
plt.show()
###############
# end of plot #
###############
return z[0]
随后我基本上做了转换数据:
new = []
for i in data:
new.append((fitFunc(i[0],*z[0]),i[1]))
问题
上述转换可导致我的Y截距具有正X值。结果是,在转换之后,我现在找到的数据值相同(见下图)
紫色线连接的数据点是问题情况的例子,在~5秒和~110秒观察到的数据将被强制转换为~100秒的时间。
问题
因此,我想知道是否有办法强制函数最大值(或最小值)为X = 0?我也接受其他建议来绕过这个问题(目前,我忽略了多项式的左半部分作为临时脏黑客/修复)。
其他信息
不可能删除拟合函数的b*x
部分,因为此函数也应该能够返回(接近)线性拟合,请参见下图
答案 0 :(得分:1)
如果“接近线性”和二次结果都是合法的可能性,我怀疑你正在寻找某种经验拟合。也许幂律将是一个更好的模型:a*x**b + c
。这包括抛物线的可能性(b
是2)和一条线(b
是1)