Python:来自scipy.optimze的Curve_fit不可能有x值范围

时间:2017-04-08 11:04:26

标签: python python-3.x matplotlib scipy

我找不到告诉curve_fit仅使用特定范围内的x值的可能性。我找到了“bounds”参数,但这似乎只适用于我的函数的参数。

如果您有想要适合的数据,例如线性曲线(但仅限于数据的特定区域),则必须创建新列表。特别是因为pyplot.plot需要两个单独的x和y值列表,而对于manuall整理,你需要它们作为(x,y)对。

1 个答案:

答案 0 :(得分:1)

最简单的解决方案确实是创建一个新列表,它是原始列表的过滤版本。当然最好使用numpy数组而不是python列表。

因此假设有两个数组xy,其中您只想将x大于某个数字a的值拟合到函数f 。 您可以过滤并curve_fit将其作为

x2 = x[x>a]
y2 = y[x>a]
popt2, _ = scipy.optimize.curve_fit(f, x2, y2 )

一个完整的例子:

import numpy as np; np.random.seed(0)
import matplotlib.pyplot as plt
import scipy.optimize

x = np.linspace(-1,3)
y = x**2 + np.random.normal(size=len(x))
f = lambda x, a,b : a* x +b

popt, _ = scipy.optimize.curve_fit(f, x,y, p0=(1,0))

x2 = x[x>0.7]
y2 = y[x>0.7]
popt2, _ = scipy.optimize.curve_fit(f, x2,y2, p0=(1,0))

plt.plot(x,y, marker="o", ls="", ms=4, label="all data")
plt.plot(x, f(x, *popt), color="moccasin", label="fit all data")
plt.plot(x2, f(x2, *popt2),  label="fit filtered data")

plt.legend()
plt.show()

enter image description here

最后,您还可以使用逻辑运算符连接多个条件,例如x[(x>0.7) & (x<2.5)]