基于SVM的时间序列预测-python实现(附源码)

admin 2018-09-16 阅读


首先我们需要一些数据来对其进行预测:

第0列是我们的序列号,single1,single2,single3是我们需要预测的数据,我们首先需要对其进行读取:

def read_20180829():
    fname = "20180829.xlsx"
    bk = xlrd.open_workbook(fname)
    # shxrange = range(bk.nsheets)
    try:
        sh = bk.sheet_by_name("Sheet1")
    except:
        print("no sheet in %s named Sheet1" % fname)
    # 获取行数
    nrows = sh.nrows
    # 获取列数
    ncols = sh.ncols
    # 获取第一行第一列数据
    cell_value = sh.cell_value(1, 0)
    time = []
    single1 = []
    single2 = []
    single3 = []
    # 获取各行数据
    for i in range(1, nrows):
        row_data = sh.cell_value(i, 0)
        time.append(row_data)
    for i in range(1, nrows):
        row_data = sh.cell_value(i, 1)
        single1.append(row_data)
    for i in range(1, nrows):
        row_data = sh.cell_value(i, 2)
        single2.append(row_data)
    for i in range(1, nrows):
        row_data = sh.cell_value(i, 3)
        single3.append(row_data)
    return time,single1,single2,single3

得到数据之后我们就可以对其进行预测了:

import numpy as np
from matplotlib import pyplot as plt
from sklearn.svm import SVR
from read_data import read_20180829
time,single1,single2,single3 = read_20180829()
# 需要预测的长度是多少
long_predict = 40
def svm_timeseries_prediction(c_parameter,gamma_paramenter):
    X_data = time
    Y_data = single1
    print(len(X_data))
    # 整个数据的长度
    long = len(X_data)
    # 取前多少个X_data预测下一个数据
    X_long = 1
    error = []
    svr_rbf = SVR(kernel='rbf', C=c_parameter, gamma=gamma_paramenter)
    # svr_rbf = SVR(kernel='rbf', C=1e5, gamma=1e1)
    # svr_rbf = SVR(kernel='linear',C=1e5)
    # svr_rbf = SVR(kernel='poly',C=1e2, degree=1)
    X = []
    Y = []
    for k in range(len(X_data) - X_long - 1):
        t = k + X_long
        X.append(Y_data[k:t])
        Y.append(Y_data[t + 1])
    y_rbf = svr_rbf.fit(X[:-long_predict], Y[:-long_predict]).predict(X[:])
    for e in range(len(y_rbf)):
        error.append(Y_data[X_long + 1 + e] - y_rbf[e])
    return X_data,Y_data,X_data[X_long+1:],y_rbf,error


X_data,Y_data,X_prediction,y_prediction,error = svm_timeseries_prediction(10,1)
figure = plt.figure()
tick_plot = figure.add_subplot(2, 1, 1)
tick_plot.plot(X_data, Y_data, label='data', color='green', linestyle='-')
tick_plot.axvline(x=X_data[-long_predict], alpha=0.2, color='gray')
# tick_plot.plot(X_data[:-X_long-1], y_rbf, label='data', color='red', linestyle='--')
tick_plot.plot(X_prediction, y_prediction, label='data', color='red', linestyle='--')
tick_plot = figure.add_subplot(2, 1, 2)
tick_plot.plot(X_prediction,error)
plt.show()

相关数据、代码网址:https://github.com/18279406017/time_series_prediction/tree/master/SVM

声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。