2015-06-26 41 views
2

我正在使用Python擬合具有正弦函數的時間序列。我發現相當不錯的比賽,現在我想能夠預測未來的價值..我在這裏輸了。使用正弦函數擬合預測值

下面是我有:

timeSeries = [0.01146, 0.00724, 0.00460, 0.00192, 0.00145, 0.01559, 0.02585, 0.04118, 0.05073, 0.01966, 0.01486, 0.02784] 

import numpy as np 
from scipy.optimize import curve_fit 

def createSinFromFit(x, freq, amplitude, phase, offset): 
    return np.sin(x * freq + phase) * amplitude + offset 

def sinRegr(series): 
    t = np.linspace(0, 4*np.pi, len(series)) 
    guess_freq = 1 
    guess_amplitude = 3*np.std(series)/(2**0.5) 
    guess_phase = 0 
    guess_offset = np.mean(series) 
    p0=[guess_freq, guess_amplitude, guess_phase, guess_offset] 
    fit = curve_fit(createSinFromFit, t, series, p0=p0) 
    results = createSinFromFit(t,*fit[0]) 
    return results 

plotThis = sinRegr(timeSeries) 

此代碼生成您在此圖片中看到的配件:

![pic]http://i.stack.imgur.com/sNdIu.png

如何延長正弦函數,以便它預測系列的未來點?即我如何才能將正弦圖跨越到「已知」數據點所覆蓋的區域的右側?

+0

什麼是你的實際問題?你有參數計算,你有'createSinFromFit'函數可以計算任何'x'的'y'。這就是你需要的。 – dlask

回答

1

您需要區分數據時間線(​​輸入)和擬合時間線(輸出)。一旦你這樣做,這種方法是相當清楚的。下面,我稱他們爲tdatatfit

enter image description here

import numpy as np 
from scipy.optimize import curve_fit 
import matplotlib.pyplot as plt 

tdata = np.linspace(0, 10) 
timeSeries = np.sin(tdata) + .4*np.random.random(tdata.shape) 

def createSinFromFit(x, freq, amplitude, phase, offset): 
    return np.sin(x * freq + phase) * amplitude + offset 

def sinRegr(tdata, series): 
    tfit = np.linspace(0, 6*np.pi, len(series)) 
    guess_freq = .2 
    guess_amplitude = 3*np.std(series)/(2**0.5) 
    guess_phase = 0 
    guess_offset = np.mean(series) 
    p0=[guess_freq, guess_amplitude, guess_phase, guess_offset] 
    fit = curve_fit(createSinFromFit, tdata, series, p0=p0) # use tdata to create the fit 
    results = createSinFromFit(tfit,*fit[0])     # use tfit to generate a new curve 
    return tfit, results 

tfit, plotThis = sinRegr(tdata, timeSeries) 

plt.plot(tfit, plotThis) 
plt.plot(tdata, timeSeries, "ro") 
plt.show()