# Assignment 3:Time Series Prediction
## 1.Description & data
給出第一部分{x(t)}(t=1->1000)的時間串列,來預測第二部分{x(t)}(t=1001->1500)的時間串列。
## 2.實作RNN
1. 數據前處理
```python=
f = open('train_data1.txt')
num_file = f.read()
data = num_file.split('\n')
f.close()
file_seq = list(map(float,data))
```
2. 數據圖像
```python=
import matplotlib.pyplot as plt
plt.plot(file_seq )
plt.show()
```
3. 引入keras,並且定義了兩個方法用於切分數字向量和預測
```python=
from numpy import array
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
import numpy as np
import keras
def int_to_vectors(sequence, n_steps): # 這一方法可以將數據切分為數字向量
X = [ ]
y =[ ]
for i in range(len(sequence)):
end_idx = i + n_steps # n_steps為數字向量的大小
if end_idx > len(sequence)-1:
break
vectors_x = sequence[i:end_idx]
vector_y = sequence[end_idx]
X.append(vectors_x)
y.append(vector_y)
return array(X), array(y)
def seq_prediction(epochs): # 這一方法用於預測後面的數據,輸入的值為要測多少個
global x_result
x_input_r = raw_seq[-(n_steps-1):]
x_result = [ ]
x_input = array(raw_seq[-n_steps:])
x_input = x_input.reshape((1, n_steps, n_features))
for i in range(epochs):
yhat = model.predict(x_input, verbose=0)
x_result.append(yhat[0][0])
x_input_r.append(yhat[0][0])
x_input = array(x_input_r[-100:])
x_input = x_input.reshape((1, n_steps, n_features))
```
4. 切分數據
將讀入的原始序列切分為大小為n_step的數字向量,這裡我們用的步長為100,可以觀察得知100步內數據呈現規律,
這裡的訓練數據為X,標籤為y
```python=
x_result = [ ]
raw_seq = file_seq # 將文件內的數據存入原始序列
n_steps = 100 # 時序步長設為100
X, y = int_to_vectors(raw_seq,n_steps)
n_features = 1 # 特征值只有一個
X = X.reshape((X.shape[0], X.shape[1], n_features))
```
5. 定義模型
```python=
model = Sequential()
model.add(LSTM(50, activation='relu',input_shape=(n_steps, n_features),return_sequences=True))
model.add(LSTM(30))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
model.summary()
```

6. 訓練模型,并得出第一筆測資的值
```python=
model.fit(X, y, epochs=50, batch_size=20, verbose=1,validation_split = 0.1)
x_input = array(raw_seq[-n_steps:])
x_input = x_input.reshape((1, n_steps, n_features))
yhat = model.predict(x_input, verbose=0)
print(yhat)
```
7. 保存訓練好的模型,預測後面的500個值
```python=
model.save('a2.h5')
seq_prediction(500)
```
8. 繪製圖像
```python=
import matplotlib.pyplot as plt
a = list(range(1000,1500))
plt.plot(raw_seq[:1000])
plt.plot(a,x_result)
plt.show()
```

## 3.Conclusion
RNN全稱Recurrent Neural Networks,可以用來處理序列數據,當前狀態的輸出與過去狀態的輸出也有關係。
