Das LSTM NN wird mit 500 Eingabedaten gespeist und soll dann eine Vorhersage für 600 Daten machen.
Um das auszuprobieren, müsstet ihr tensorflow, numpy, keras, sklearn sowie matplotlib.pyplot installieren. Außerdem bräuchtet ihr eine CSV-Datei mit Eingabedaten (irgendein Kursverlauf).
Vielen Dank
Code: Alles auswählen
import numpy as np
import tensorflow as tf
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
import sys
import random
import datetime
import matplotlib
data = []
with open(sys.argv[1]) as fp:
lines = fp.readlines()
for c, line in enumerate(lines):
x = line.split(";")
data.append((float(x[1]) + float(x[2])) / 2.0)
data2 = []
for i in range(9):
temp = []
for j in range(i * 50, i * 50 + 100):
temp.append(data[j])
data2.append(temp)
sc_x = MinMaxScaler()
sc_y = MinMaxScaler()
train_data_x = sc_x.fit_transform(data2).reshape(-1, 1, 1)
train_data_y = []
for i in range(9):
for j in range(i * 50, i * 50 + 100):
train_data_y.append(j)
train_data_y = sc_y.fit_transform(np.reshape(train_data_y, (-1, 1)))
print(train_data_x.shape, train_data_y.shape)
units_c = 100
regressor = Sequential()
regressor.add(
LSTM(units=units_c, return_sequences=True, input_shape=(train_data_x.shape[1], 1))
)
regressor.add(Dropout(0.2))
regressor.add(LSTM(units=units_c, return_sequences=True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units=units_c, return_sequences=True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units=units_c))
regressor.add(Dropout(0.2))
regressor.add(Dense(units=1))
regressor.compile(optimizer="adam", loss="mean_squared_error")
regressor.fit(train_data_x, train_data_y, epochs=20, batch_size=16)
data3 = []
for i in range(500):
data3.append(data[i])
for i in range(100):
data3.append((1.01 - random.random() * 0.02) * data[-1])
test_data_x = sc_x.fit_transform([data3]).reshape(-1, 1, 1)
pre = regressor.predict(test_data_x)
pre = sc_x.inverse_transform(pre.reshape(1, -1)).reshape(-1)
xs1 = []
for i in range(500):
xs1.append(data[i])
for i in range(100):
xs1.append(data[-1])
xs2 = []
for i in range(600):
xs2.append(pre[i])
nowy = datetime.datetime.now()
ys = []
for i in range(600):
ys.append(nowy + datetime.timedelta(0, 300 * (i - 500)))
dates = matplotlib.dates.date2num(ys)
print(len(xs1), len(xs2), len(ys))
plt.plot_date(dates, xs1, label="data", linestyle="solid")
plt.plot_date(dates, xs2, label="data2", linestyle="solid")
plt.legend()
plt.show()