簡體   English   中英

正弦曲線擬合問題:幅度和頻率出來的太低

[英]Problems with sinusoidal curve fitting: amplitude and frequency come out too low

數據

我有一些時間序列數據,它對應於圖像中的黑線(它是滾動平均值)。 我試圖擬合正弦曲線但沒有成功; 淺藍色,幾乎直線是當前的結果。 (深藍色的是多項式擬合,暫時忽略它)。

我試過的是這個。 我從 這里得到了這個功能的想法

def objective(x, a, b, c, d):
    return a * np.sin(b - x) + c * x**2 + d

[..]

from scipy import optimize

X = X.ravel() # 1D array of ordinal dates
y = y.ravel() # 1D array of temperature values

# Curvefit with the objective function.
params, _ = optimize.curve_fit(objective, X, y)

# Plot the curvefit
plt.plot(X_extended, objective(
    X, params[0], params[1], params[2], params[3]))

即使我添加了非常低的頻率或非常高的振幅的猜測,也幾乎沒有任何變化。

任何想法表示贊賞。 如有必要,我可以嘗試在其他地方重現該問題。


應用答案中給出的 p0 值和函數,圖形現在如下所示:

新擬合的函數

謝謝!

沒有要測試的數據,很難准確判斷。 但是,一個很好的猜測是您的起始參數已關閉,然后廣義最小二乘擬合可能(很容易)失敗。 您甚至沒有給curve_fit一組初始參數,因此abcd的初始起始值都將設置為 1。

處理正弦擬合,對於幅度a ,您可能需要大約 7 ,而對於偏移d ,大約為 27。 b更難猜測,因此最初可以保留為 0(或 1)。

但是,方程的二次部分會使事情變得一團糟:x 值很大,所以它會變化得非常快,或者更確切地說, c應該非常接近於零(接近於1/x^2 , 所以說~ 1e-12 , 以抵消大二次變化的影響. 任何這樣小的數字也會有擬合問題:事先規范化你的公式/參數(為 1 級)總是一個好主意。

事實上,我不明白為什么你的函數中有二次方。 也許是底層模型需要這樣做,但數字本身根本沒有顯示二次行為的跡象。 我會刪除它。

最后,雖然您有 x-offset b ,但您沒有周期參數。 結果,它會固定在 2π,而這絕對不是。 這將是擬合數據的最大障礙,僅次於方程的二次部分。 該周期看起來大約是 300(或一年?),或大約 50 * 2π。

因此,請嘗試使用以下功能:

def objective(x, a, b, c, d):
    return a * np.sin(b - c*x/50) + d

具有非常粗略的起始參數:

p0 = [7, 0, 1, 27]

看看你得到了什么。

(如果您想知道公式中的 50:在這些數量級上並不是真的有必要,但它作為將c規范化為 1 階的示例。您可以將d替換為10*d然后將其初始猜測設置為 3。或者,如果你這樣做,你現在可以完全省略p0 ,所有參數猜測都為 1。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM