import keras import matplotlib.pyplot as plt import pandas as pd import tensorflow as tf import numpy as np from sklearn.preprocessing import MinMaxScaler from keras.layers import Dense, LSTM, Activation, Dropout from keras.optimizers import SGD colum = 13 step = 50 df = pd.read_csv('文件名') df_for_training=df[:24000] df_for_testing=df[24000:] # print(df_for_testing.iloc[:, 2:]) scaler = MinMaxScaler(feature_range=(-1, 1)) df_for_training_scaled = scaler.fit_transform(df_for_training.iloc[:, 2:]) print("df_for_training_scaled shape:",df_for_training_scaled.shape) #print(df_for_training_scaled.shape) #print(df_for_testing_scaled.shape) #抽取特征与标签列 def createXY(dataset, n_past): dataX = [] dataY = [] for i in range(n_past, len(dataset)): dataX.append(dataset[i - n_past:i, 1:dataset.shape[1]]) dataY.append(dataset[i, 0]) return np.array(dataX), np.array(dataY) #trainX,testX数据的shape为[samples, steps, features] trainX, trainY = createXY(df_for_training_scaled, step) testX, testY = createXY(df_for_testing_scaled, step) #构建模型 def build_model(): model = tf.keras.models.Sequential() #经试验,如果下一层还是LSTM的话必须将return_sequences设置为True model.add(LSTM(20, input_shape=(step, column), return_sequences=True)) model.add(LSTM(20)) model.add(Activation('relu')) model.add(Dropout(0.2)) model.add(Dense(1)) model.compile(loss='mae', optimizer=SGD(lr=0.1,momentum=0.3)) return model lstm_net = build_model() lstm_net.fit(trainX, trainY, batch_size=8, epochs=100) predictions = lstm_net.predict(testX) #进行逆变换 test_Predict_copy = np.repeat(predictions,column+1,axis=-1) test_Predict_inverse = scaler.inverse_transform(test_Predict_copy)[:,0] #test_Predict_inverse = scaler.inverse_transform(test_Predict) test_label = np.array(df_for_testing['omega_vsg_1'])[50:] testY_copy = np.repeat(np.reshape(testY,(len(testY), 1)),column+1,axis=-1) testY_inverse = scaler = scaler.inverse_transform(testY_copy)[:,0] plt.plot(test_Predict_inverse,color='red') plt.plot(test_label,color='green') plt.plot(testY_inverse, color='blue') plt.savefig('result_test.png')