0
我找不到可能告訴curve_fit只使用特定範圍內的x值。我找到了「邊界」參數,但這似乎只適用於我的函數的參數。Python:來自scipy.optimze的Curve_fit對x值的範圍沒有可能
當有人想要適合的數據(例如,線性曲線(但僅限於數據的特定區域))時,必須創建一個新列表。特別是因爲pyplot.plot需要兩個單獨的列表x和y值,而手工整理你需要它們作爲(x,y)對。
我找不到可能告訴curve_fit只使用特定範圍內的x值。我找到了「邊界」參數,但這似乎只適用於我的函數的參數。Python:來自scipy.optimze的Curve_fit對x值的範圍沒有可能
當有人想要適合的數據(例如,線性曲線(但僅限於數據的特定區域))時,必須創建一個新列表。特別是因爲pyplot.plot需要兩個單獨的列表x和y值,而手工整理你需要它們作爲(x,y)對。
最簡單的解決方案的確是創建一個新列表,它是原始列表的過濾版本。當然最好使用numpy數組而不是python列表。
所以假設有兩個數組x
和y
,其中你只是想以適應這些值,其中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()
最後只提它,你也可以用邏輯運算符,如x[(x>0.7) & (x<2.5)]
連接幾個條件。