Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # import essentials
- import matplotlib.pyplot as plt
- import pandas as pd
- import numpy as np
- #
- from sklearn.preprocessing import MinMaxScaler
- # import keras
- from keras.models import Sequential
- from keras.layers import LSTM, Dense
- # read the data
- # data = pd.read_csv("")
- # create array to train, validate, and test
- pure = np.linspace(0, 100, 200)
- noise = np.random.normal(-1, 1, 200)
- signal = pure + noise + np.sin(pure) + np.sin(2*pure)
- plt.plot(signal, '-')
- # set splitting functions to train, validation, and test sets
- dataset = np.array(signal).reshape(-1, 1)
- window = 10
- scaler = MinMaxScaler(feature_range=(0, 1))
- dataset = scaler.fit_transform(dataset)
- def split(_dataset, p):
- train_size = int(len(_dataset) * p)
- test_size = len(_dataset) - train_size
- return _dataset[0:train_size,:], _dataset[train_size:len(_dataset), :]
- def prepare(_dataset, _look_back=1):
- data_x, data_y = [], []
- for i in range(len(_dataset) - _look_back):
- a = _dataset[i:(i + _look_back), 0]
- data_x.append(a)
- data_y.append(_dataset[i + _look_back, 0]) # increase to 1 dim
- data_x = np.array(data_x)
- data_x = np.reshape(data_x, (data_x.shape[0], data_x.shape[1], 1))
- return data_x, np.array(data_y)
- train, test = split(dataset, 0.8)
- train, val = split(train, 0.6)
- train_x, train_y = prepare(train, window)
- val_x, val_y = prepare(val, window)
- test_x, test_y = prepare(test, window)
- # LSTM model
- model = Sequential()
- model.add(LSTM(window, return_sequences=True, input_shape=(window, 1)))
- model.add(LSTM(window, return_sequences=True))
- model.add(LSTM(window))
- model.add(Dense(1))
- model.compile(loss='mean_squared_error', optimizer='adam',)
- # train the model
- model.fit(train_x, train_y, validation_data=(val_x, val_y),
- epochs=10, batch_size=10, verbose=0)
- # make predictions on concatenated set - train, validation, test together
- prediction = np.concatenate((train_x, val_x), axis=0)
- pred = model.predict(np.concatenate((prediction, test_x), axis=0))
- # do the scaler inversion
- pred = scaler.inverse_transform(pred)
- dataset = scaler.inverse_transform(dataset)
- # reshape dataset for plotting
- dataset = np.array(signal).reshape(-1, 1)
- # Commented out IPython magic to ensure Python compatibility.
- # %matplotlib inline
- def to_plot(dataset, predict, start, end):
- predict_plot = np.empty_like(dataset)
- predict_plot[:, :] = np.nan
- predict_plot[start:end, :] = predict
- return predict_plot
- start = window+1
- end = window + len(pred)+1
- pred_plot = to_plot(dataset, pred, start, end)
- plt.plot(dataset, color='g', label='dataset')
- plt.plot(pred_plot, color='m', label='prediction')
- plt.legend()
- plt.title("prediction for the 200 length dataset")
- plt.show()
- x = scaler.inverse_transform(model.predict(test_x))
- y = dataset[-len(test_x):]
- p = x - y
- plt.figure()
- plt.plot(p[:,0],)
- plt.title("error")
- plt.xlabel("index")
- plt.ylabel("error")
- """Let's repeat all, but for the larger dataset"""
- # create array to train, validate, and test with 2000 values
- pure = np.linspace(0, 100, 2000)
- noise = np.random.normal(-1, 1, 2000)
- signal = pure + noise + np.sin(pure) + np.sin(2*pure)
- plt.plot(signal, '-')
- # set splitting functions to train, validation, and test sets
- dataset = np.array(signal).reshape(-1, 1)
- window = 10
- scaler = MinMaxScaler(feature_range=(0, 1))
- dataset = scaler.fit_transform(dataset)
- train, test = split(dataset, 0.8)
- train, val = split(train, 0.6)
- train_x, train_y = prepare(train, window)
- val_x, val_y = prepare(val, window)
- test_x, test_y = prepare(test, window)
- # train the model
- model.fit(train_x, train_y, validation_data=(val_x, val_y),
- epochs=10, batch_size=10, verbose=0)
- # make predictions on concatenated set - train, validation, test together
- prediction = np.concatenate((train_x, val_x), axis=0)
- pred = model.predict(np.concatenate((prediction, test_x), axis=0))
- # do the scaler inversion
- pred = scaler.inverse_transform(pred)
- dataset = scaler.inverse_transform(dataset)
- # reshape dataset for plotting
- dataset = np.array(signal).reshape(-1, 1)
- # Commented out IPython magic to ensure Python compatibility.
- # %matplotlib inline
- start = window+1
- end = window + len(pred)+1
- pred_plot = to_plot(dataset, pred, start, end)
- plt.plot(dataset, color='g', label='dataset')
- plt.plot(pred_plot, color='m', label='prediction')
- plt.legend()
- plt.title("prediction for the 2000 length dataset")
- plt.show()
- x = scaler.inverse_transform(model.predict(test_x))
- y = dataset[-len(test_x):]
- p = x - y
- plt.figure()
- plt.plot(p[:,0],)
- plt.title("error")
- plt.xlabel("index")
- plt.ylabel("error")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement