船舶轨迹预测
經(jīng)濟全球化程度日益增大,各國經(jīng)濟貿易往來頻繁帶動航運行業(yè)欣欣向榮,海域航道以及港口水域的負載增加,造成船舶交通阻塞、船舶碰撞事件事故頻發(fā)等問題。因此,準確獲取船舶航行實時動態(tài)信息,及時發(fā)現(xiàn)船舶異常軌跡情況并提前預測船舶的航行運動狀態(tài),成為國內外學者的研究熱點。
隨著AIS系統(tǒng)的普及,現(xiàn)如今收到的AIS數(shù)據(jù)遠超預期,我國AIS系統(tǒng)大概每天收到AIS實時報文一億條,數(shù)據(jù)量爆炸的同時蘊含很多對船舶軌跡預測和減少船舶碰撞有用的信息。AIS發(fā)送的信息包括水上移動通信業(yè)務標識碼(Maritime Mobile Service identify,MMSI) ,船舶經(jīng)緯度、船舶的對地航向和對地航速等。與雷達、聲納或閉路電視等傳統(tǒng)海事方法相比,AIS具有許多優(yōu)勢,首先AIS消息幾乎以實時方式提供了其主機的豐富信息,其次AIS數(shù)據(jù)可以在很長的距離內發(fā)送和接收(從機載收發(fā)器的20海里到衛(wèi)星接收器的上千海里),且AIS受海洋和天氣等外部因素的影響較小,對AIS數(shù)據(jù)的有效利用能對船舶軌跡預測有非常重要的現(xiàn)實意義。
參考如下
(8條消息) LSTM模型 軌跡經(jīng)緯度預測_Muzi_Water的博客-CSDN博客_軌跡預測模型
訓練
訓練集和測試機劃分
'''train and test dataes''' ship_data1 = pd.read_csv('D:\船舶軌跡預測\服務器實驗結果\ship trajectory prediction--can run/11_30_four_input.txt', sep=',', engine='python').iloc[:, 0:4].values dataset1 = ship_data1 train_size1 = int(len(dataset1)*0.8) test_size1 = len(dataset1)-train_size1 train1, test1 = dataset1[0:train_size1, :], dataset1[train_size1:len(dataset1), :] data1 = train1 ship_data2 = pd.read_csv('D:\船舶軌跡預測\服務器實驗結果/3_18新增實驗/ship1.txt', sep=',', engine='python').iloc[:, 0:4].values #data = pd.read_csv('D:/ship trajectory prediction--can run/11_30_four_input.txt', sep=',', engine='python') dataset2 = ship_data2 train_size2 = int(len(dataset2)*0.8) test_size2 = len(dataset2)-train_size2 train2, test2 = dataset2[0:train_size2, :], dataset2[train_size2:len(dataset2), :] data2 = train2 data = np.vstack((data1, data2))'''創(chuàng)建變量X,Y'''
def create_dataset(data, n_predictions, n_next):'''對數(shù)據(jù)進行處理'''dim = data.shape[1]# train_X是n個經(jīng)緯度, train_Y是下一個(n+1)經(jīng)緯度train_X, train_Y = [], []for i in range(data.shape[0] - n_predictions - n_next - 1):a = data[i:(i + n_predictions), :]train_X.append(a)tempb = data[(i + n_predictions):(i + n_predictions + n_next), :]b = []for j in range(len(tempb)):for k in range(dim):b.append(tempb[j, k])train_Y.append(b)train_X = np.array(train_X, dtype='float64')train_Y = np.array(train_Y, dtype='float64')return train_X, train_Y定義模型
def trainModel(train_X, train_Y):# trainX,trainY: 訓練LSTM模型所需要的數(shù)據(jù)model = Sequential()model.add(LSTM(80,activation='tanh',input_shape=(train_X.shape[1], train_X.shape[2]),# 將輸出維度傳遞給下一層LSTM輸入return_sequences=False))# 1000個神經(jīng)元大概300被置為0model.add(Dropout(0.2))# model.add(LSTM(# 120,# return_sequences=False))# model.add(Dropout(0.3))model.add(Dense(train_Y.shape[1]))model.add(Activation("tanh"))# 方法用于在配置訓練方法時,告知訓練時用的優(yōu)化器、損失函數(shù)和準確率評測標準model.compile(loss='mse', optimizer='adam', metrics=['acc'])fig1 = plt.figure(figsize=(12, 8))history = model.fit(train_X, train_Y, epochs=500, batch_size=16, verbose=2)plt.plot(history.history['loss'])plt.title('model loss')plt.ylabel('loss')plt.xlabel('epoch')plt.show()model.summary()return model主函數(shù)
if __name__ == "__main__":train_num = 5per_num = 1# set_range = Falseset_range = True # 生成訓練數(shù)據(jù) train_X, train_Y = create_dataset(data, train_num, per_num) # train_X, train_Y, test_X, test_Y = create_dataset(data, train_num, per_num) print("x\n", train_X.shape) print("y\n", train_Y.shape)# 訓練模型 # train_X, train_Y放進去訓練 model = trainModel(train_X, train_Y) loss, acc = model.evaluate(train_X, train_Y, verbose=2) print('Loss : {}, Accuracy: {}'.format(loss, acc * 100))# 保存模型 np.save(".2022_03_18_lstm_model_trueNorm.npy", normalize) model.save(".2022_03_18_lstm_model.h5")軌跡對比
?
總結
- 上一篇: 学习大数据开发培训前景如何
- 下一篇: 【通讯录自动导入】txt格式转vcf格式