我有一些要點,我想要適合這一點的曲線。我知道存在scipy.optimize.curve_fit
函數,但我不理解文檔,即如何使用此函數。蟒蛇numpy/scipy曲線擬合
我的分數:np.array([(1, 1), (2, 4), (3, 1), (9, 3)])
任何人能解釋如何做到這一點?
我有一些要點,我想要適合這一點的曲線。我知道存在scipy.optimize.curve_fit
函數,但我不理解文檔,即如何使用此函數。蟒蛇numpy/scipy曲線擬合
我的分數:np.array([(1, 1), (2, 4), (3, 1), (9, 3)])
任何人能解釋如何做到這一點?
我建議你用簡單的多項式擬合開始,scipy.optimize.curve_fit
嘗試,以適應功能f
,你必須知道一組點。
這是使用numpy.polyfit
和poly1d
一個簡單的3階多項式擬合,第一執行最小二乘多項式擬合和第二計算新的點:
import numpy as np
import matplotlib.pyplot as plt
points = np.array([(1, 1), (2, 4), (3, 1), (9, 3)])
# get x and y vectors
x = points[:,0]
y = points[:,1]
# calculate polynomial
z = np.polyfit(x, y, 3)
f = np.poly1d(z)
# calculate new x's and y's
x_new = np.linspace(x[0], x[-1], 50)
y_new = f(x_new)
plt.plot(x,y,'o', x_new, y_new)
plt.xlim([x[0]-1, x[-1] + 1 ])
plt.show()
這隻適用於給定的數據集。但是當我改變點時,在大多數情況下,兩點之間只有曲線。爲什麼? – Dmitri
只要您正確提供數據,即兩個相同大小的數組,例如:'x = np.array([1,2,3,4,5,6])'和'y = np.array([0.2,1,1.2,3,0.8,1.1])' – jabaldonedo
它只繪製兩行之間的曲線,並且具有以下數據集: x = np.array([0,1, - , 1,.5]) y = np.array([0,1,.9,.7]) – Dmitri
您首先需要將您的numpy數組分成兩個單獨的包含x和y值的數組。
x = [1, 2, 3, 9]
y = [1, 4, 1, 3]
curve_fit還需要一個函數來提供您想要的擬合類型。例如,線性擬合將使用像
def func(x, a, b):
return a*x + b
scipy.optimize.curve_fit(func, x, y)
一個函數將返回含有兩個陣列一個numpy的陣列:首先將包含a
和b
值最適合你的數據,並且所述第二將所述協方差的最佳擬合參數。
下面是與您提供的數據進行線性擬合的示例。
import numpy as np
from scipy.optimize import curve_fit
x = np.array([1, 2, 3, 9])
y = np.array([1, 4, 1, 3])
def fit_func(x, a, b):
return a*x + b
params = curve_fit(fit_func, x, y)
[a, b] = params[0]
此代碼將返回a = 0.135483870968
和b = 1.74193548387
這裏是你的點和線性擬合......這顯然是一個壞的一個情節,但你可以改變擬合函數獲得的任何類型適合你喜歡。
你能提供一個例子嗎? – Bob
Python的曲線擬合庫pyeq2,BSD許可證,可在Google Code Repository處獲得:
https://github.com/zunzun/pyeq2
它配備了很多例子,包括並行編程和用戶定義的函數,你可以在網上免費試用:
我是作者,所以如果你有任何問題,給我發電子郵件直接使用電子郵件地址[email protected] - 我會盡我所能幫助您,並幫助您掌握並運行示例。
zunzun鏈接已關閉.... –
我的願景變得太糟糕了,無法讓網站繼續運行儘管目前我仍然可以用右眼讀書。如果您想在您自己的服務器上使用原始站點代碼,那麼它現在位於https://github.com/zunzun/zunzunsite3(Python 3)或https://github.com/zunzun/zunzunsite(Python 2)。 –
你想適合什麼樣的曲線?多項式? – jabaldonedo
是的,多項式 – Bob
所以看看我的答案,是最簡單的方法使用numpy – jabaldonedo