畢業(yè)設(shè)計(jì) 大數(shù)據(jù)物流平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)
0 前言
?? 這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。
為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天要分享的是
?? ?深度學(xué)習(xí)大數(shù)據(jù)物流平臺(tái)
難度系數(shù):3分
工作量:3分
創(chuàng)新點(diǎn):4分
畢設(shè)幫助,選題指導(dǎo),技術(shù)解答,歡迎打擾,見B站個(gè)人主頁
https://space.bilibili.com/33886978
1 課題背景
根據(jù)研究報(bào)告,中國擁有全球最大的道路運(yùn)輸市場(chǎng),2020年市場(chǎng)規(guī)模為人民幣6.2萬億元。其中整車(FTL)和零擔(dān)(LTL)運(yùn)輸占中國公路運(yùn)輸市場(chǎng)的大部分,2020年到達(dá)了人民幣5.3萬億元。

整個(gè)物流市場(chǎng)由物流公司、專項(xiàng)車隊(duì)、司機(jī)等角色組成。一個(gè)普通物流訂單由貨主,物流公司,車隊(duì)和司機(jī)通過逐層人工訂單傳遞完成。物流中還有計(jì)劃外的貨運(yùn)需求,需要由調(diào)度人員通過人工電話聯(lián)系各個(gè)下級(jí)的承運(yùn)方進(jìn)行承運(yùn)。另外,物流行業(yè)中還有許多地方需要人工支持,如車輛的在途信息、貨運(yùn)單據(jù)以及財(cái)務(wù)結(jié)算。可見,人工支持在物流行業(yè)中占有較高比例。
較高的人工支持占比導(dǎo)致物流企業(yè)在運(yùn)營過程中無法針對(duì)一些具體的情況或者突發(fā)事件進(jìn)行快速的反應(yīng)和決策,使得一些中小企業(yè)在市場(chǎng)競(jìng)爭(zhēng)中處于劣勢(shì)。因此,物流公司需要一個(gè)智能高效的數(shù)字化物流平臺(tái),使其擁有信息化、數(shù)據(jù)處理以及算法能力,形成一個(gè)高效的物流生態(tài)。
2 物流大數(shù)據(jù)平臺(tái)的架構(gòu)與設(shè)計(jì)
物流大數(shù)據(jù)平臺(tái)通過數(shù)字化各個(gè)物流環(huán)節(jié),使得各流程實(shí)時(shí)銜接,提升物流系統(tǒng)的效率。隨著車輛的移動(dòng)、票據(jù)資金的流轉(zhuǎn)以及交易的完成,所有業(yè)務(wù)數(shù)據(jù)都會(huì)沉淀到物流大數(shù)據(jù)平臺(tái)。接著,通過大數(shù)據(jù)平臺(tái)的計(jì)算能力,對(duì)數(shù)據(jù)進(jìn)行整理,歸類和分析,將數(shù)據(jù)提供給物流平臺(tái)中的各個(gè)應(yīng)用模塊。同時(shí),平臺(tái)引入算法(機(jī)器學(xué)習(xí)和深度學(xué)習(xí)),在海量數(shù)據(jù)中不斷接近業(yè)務(wù)問題的全局最優(yōu)解,借助算法決策使得收益最大化。
目前,物流大數(shù)據(jù)技術(shù)平臺(tái)主要是由應(yīng)用層,算法平臺(tái),數(shù)據(jù)倉庫和數(shù)據(jù)平臺(tái)組成。
最上層的是 應(yīng)用層 ,包括銷售管理、智能調(diào)度、貨源推薦、圖片資料審核等,提供了平臺(tái)所需要的核心功能,其實(shí)現(xiàn)應(yīng)用了很多算法。這些算法是在算法平臺(tái)上開發(fā)的。 算法平臺(tái) 提供豐富的算法以及模型來支撐整個(gè)平臺(tái)的運(yùn)轉(zhuǎn)。 算法層的下一層是 數(shù)據(jù)倉庫 ,存放了集團(tuán)所有的業(yè)務(wù)數(shù)據(jù)。只有基于這些豐富的數(shù)據(jù),算法才能夠能夠?yàn)樯蠈討?yīng)用提供服務(wù)。 最底層是整個(gè) 大數(shù)據(jù)平臺(tái)基礎(chǔ)設(shè)施 ,包含CDH集群(Hadoop/ spark/ Impala)、Doris集群和監(jiān)控系統(tǒng)。它們實(shí)現(xiàn)了海量數(shù)據(jù)的基礎(chǔ)存儲(chǔ)和計(jì)算能力,對(duì)批量數(shù)據(jù)進(jìn)行秒級(jí)的統(tǒng)計(jì)分析,讓企業(yè)的業(yè)務(wù)人員和分析人員能實(shí)時(shí)掌握企業(yè)的運(yùn)營情況。
應(yīng)用案例

① 車輛在途追蹤
數(shù)據(jù)平臺(tái)可追蹤到任意一臺(tái)已經(jīng)安裝了特定GPS設(shè)備的車輛。GPS設(shè)備每三十秒給數(shù)據(jù)中心傳輸一條經(jīng)緯度位置的數(shù)據(jù),從而讓數(shù)據(jù)平臺(tái)獲取車輛的實(shí)時(shí)位置。連續(xù)的實(shí)時(shí)位置可構(gòu)成行車記錄,用于判斷車輛在貨運(yùn)的途中是否正常行駛、是否偏離方向、是否超速行駛等。
② 實(shí)時(shí)調(diào)度中心
實(shí)時(shí)調(diào)度中心可以實(shí)時(shí)地計(jì)算出物流平臺(tái)上各時(shí)間段內(nèi)累計(jì)的貨運(yùn)單量、活躍司機(jī)數(shù)、貨主數(shù)、交易金額等,便于業(yè)務(wù)決策。
3 智能車貨匹配推薦算法的實(shí)現(xiàn)
1. 問題陳述
智能車貨匹配推薦算法的應(yīng)用場(chǎng)景分為兩種:一是人找貨,二是貨找人。人找貨是貨運(yùn)司機(jī)通過瀏覽貨運(yùn)信息找到想要運(yùn)輸?shù)呢浳铮回浾胰耸前l(fā)貨人下單后調(diào)度人員推送貨源信息給貨運(yùn)司機(jī)。兩個(gè)場(chǎng)景均涉及三個(gè)變量:司機(jī)、貨物、環(huán)境。(具體涵蓋如下圖所示)

唯有合理運(yùn)用這三個(gè)變量,才能計(jì)算出合理的車貨匹配度。問題可以被抽象地用數(shù)學(xué)表達(dá)為 y=F(Xi, Xu, Xc),其中y表示匹配程度,Xi指的是我們的item貨物,Xu指的是貨運(yùn)司機(jī)user,Xc指的是環(huán)境context。
不妨將該問題變成點(diǎn)擊率預(yù)測(cè)問題。當(dāng)司機(jī)查看一個(gè)貨源列表的時(shí)候,如果他點(diǎn)擊了某條貨源信息,就表示該司機(jī)對(duì)這條貨源信息比較感興趣;如果他沒有點(diǎn)擊,則假設(shè)他對(duì)這條貨源信息不感興趣。通過點(diǎn)擊數(shù)據(jù),我們可以把每一條貨源信息標(biāo)記為0和1,點(diǎn)擊是1,未點(diǎn)擊是0。從而,根據(jù)司機(jī)、貨物以及環(huán)境所有的屬性特征,我們預(yù)測(cè)該貨源信息最終是否發(fā)生點(diǎn)擊(變成了一個(gè)二分類問題)。
2. 算法模型
在實(shí)際應(yīng)用中,解決是否點(diǎn)擊問題經(jīng)常引用的模型是DeepFM。DeepFM是深度學(xué)習(xí)和FM模型結(jié)合的一個(gè)框架,比單個(gè)深度學(xué)習(xí)模型或FM模型要表現(xiàn)好。
① FM模型
FM (Factorization Machine) 主要是為了解決數(shù)據(jù)稀疏的情況下,特征怎樣組合的問題,也就是特征兩兩組合的問題。數(shù)學(xué)表達(dá)式如下:
其中n表示樣本的特征數(shù)。這里的特征是離散化后的特征。與線性模型相比,F(xiàn)M的模型多了特征兩兩組合的部分。
② DeepFM構(gòu)建

DeepFM模型包含F(xiàn)M和DNN兩部分,F(xiàn)M模型可以抽取low-order特征,DNN可以抽取high-order特征,因而無需人工特征工程。FM模塊進(jìn)行一階和二階的特征進(jìn)行組合并學(xué)習(xí)到低階特征;深度模型模塊可以讓模型學(xué)到更高階的特征組合。最終,通過激活函數(shù),預(yù)測(cè)點(diǎn)擊概率。DeepFM具體框架如上圖右半部分所示。首先,DeepFM對(duì)所有輸入的稀疏特征進(jìn)行embedding向量化,并對(duì)不同的特征之間進(jìn)行交叉,生成新特征。FM layer實(shí)現(xiàn)了上圖左上的公式(2),把變量的二階的特征交叉進(jìn)行線性累加;Hidden layer(DNN)實(shí)現(xiàn)了特征多重交叉,獲得更高階的特征交叉。FM模型和DNN模塊共享特征embedding。通過FM和DNN,模型同時(shí)學(xué)習(xí)低階和高階的一個(gè)特征組合。
③ 模型評(píng)估
我們先用AUC評(píng)價(jià)并篩選出最優(yōu)DeepFM模型。除此以外,還有其它離線指標(biāo)評(píng)判模型是否能上線。
離線指標(biāo)(Top10) : 根據(jù)回溯數(shù)據(jù) ,模型算出司機(jī)(用戶)前十適配的貨源信息,前十適配的貨源里有哪些貨源被點(diǎn)擊,從而計(jì)算出離線的前十點(diǎn)擊率; CTR: 貨源展現(xiàn)點(diǎn)擊率; CVR: 訂單成交轉(zhuǎn)化率; 訂單量: 由對(duì)應(yīng)推薦位。 經(jīng)過評(píng)估,如果該模型比之前的模型離線效果更好,我們就可以上線這個(gè)模型,再對(duì)其進(jìn)行基于AB test的線上效果評(píng)估。如下圖所示,我們先將用戶隨機(jī)分成三組,占比30%,40%和30%。根據(jù)三組的線上CTR和CVR情況,平臺(tái)抉擇出最優(yōu)版本進(jìn)行發(fā)布。抉擇可基于數(shù)值,也可基于統(tǒng)計(jì)學(xué)的假設(shè)檢驗(yàn)。

3. 模型構(gòu)建總覽

平臺(tái)收集到用戶行為數(shù)據(jù)后,通過實(shí)時(shí)計(jì)算框架,對(duì)行為數(shù)據(jù)進(jìn)行處理并存到離線倉庫,以制作模型訓(xùn)練集。模型給用戶提供線上推薦。根據(jù)離線倉庫里的數(shù)據(jù),我們計(jì)算出一些離線特征。將離線倉庫數(shù)據(jù)按日處理獲得日志,其中包括統(tǒng)計(jì)分析以及近線特征。根據(jù)統(tǒng)計(jì)分析可以提煉出指標(biāo)報(bào)表,為業(yè)務(wù)與模型訓(xùn)練提供指引;近線特征是指通過司機(jī)最近的行為計(jì)算其近期特征,可加入推薦模型以獲得更好的推薦效果。
4 司機(jī)標(biāo)簽體系的搭建及算法
推薦車貨匹配系統(tǒng)需要用到很多司機(jī)的標(biāo)簽特征,而且公司的產(chǎn)品和運(yùn)營也需要良好的標(biāo)簽體系的輔助。接下來我們介紹司機(jī)的標(biāo)簽體系。
馬玉潮:物流平臺(tái)的車貨匹配推薦算法及標(biāo)簽體系搭建
司機(jī)的標(biāo)簽體系主要有發(fā)貨地、目的地、車型、車長、貨物等。我們需要通過司機(jī)用戶的歷史行為,包括當(dāng)前坐標(biāo)、瀏覽貨源篩選、報(bào)價(jià)等,做出標(biāo)簽預(yù)測(cè)。
1. 冷啟動(dòng)
前期數(shù)據(jù)匱乏時(shí),我們需要經(jīng)歷一個(gè)冷啟動(dòng)的階段。此時(shí)我們需要通過一些人工規(guī)則方式給司機(jī)打標(biāo)簽。例如,當(dāng)司機(jī)訪問一個(gè)貨源時(shí),若這個(gè)貨源上面有標(biāo)簽,最簡單的方法就是把這個(gè)貨源上的標(biāo)簽打到這個(gè)司機(jī)身上。但司機(jī)的貨運(yùn)需求是變化的。例如,司機(jī)A之前更加關(guān)注輕工業(yè)產(chǎn)品的貨運(yùn)信息,但現(xiàn)在他比較關(guān)注普通商品的貨運(yùn)信息。可見,司機(jī)的近期的行為才更能代表其目前需求。
對(duì)于這個(gè)問題,我們借鑒了牛頓冷卻定律的思想提出了解決方案。牛頓冷卻定律指出物體的冷卻速度與它當(dāng)前溫度與室溫之間的溫差成正比。將該公式映射到推薦場(chǎng)景中,則為距離當(dāng)前時(shí)間越遠(yuǎn)的行為其權(quán)重越低。權(quán)重公式:
冷啟動(dòng)下的標(biāo)簽規(guī)則為,基于權(quán)重公式和人工規(guī)定的閾值,通過司機(jī)點(diǎn)擊行為來給司機(jī)打上標(biāo)簽。
2. LSTM多標(biāo)簽?zāi)P退惴?/h1>
當(dāng)累積一定的司機(jī)數(shù)據(jù)后,不僅平臺(tái)會(huì)預(yù)測(cè)司機(jī)標(biāo)簽,司機(jī)用戶也會(huì)自己維護(hù)標(biāo)簽。之后我們可以拿完整的司機(jī)數(shù)據(jù)(如標(biāo)簽完整度大于80%且其在app中交互行為超過一定閾值的司機(jī)數(shù)據(jù))作為訓(xùn)練集,訓(xùn)練模型以預(yù)測(cè)司機(jī)的標(biāo)簽情況。

這里提出LSTM多標(biāo)簽?zāi)P?,因?yàn)檠h(huán)神經(jīng)網(wǎng)絡(luò)可以處理不定長的用戶行為輸入。具體框架示意如下:

X表示的司機(jī)行為數(shù)據(jù),例如X0表示司機(jī)的一次點(diǎn)擊行為,X1表示司機(jī)的一次電話聯(lián)系行為。X是不可預(yù)測(cè)的。司機(jī)用戶每發(fā)生一種行為,都會(huì)被構(gòu)建成輸入,并被輸入到LSTM模型當(dāng)中。經(jīng)過一系列行為后,模型輸出對(duì)該司機(jī)的多標(biāo)簽預(yù)測(cè)。框架最后一層其實(shí)是對(duì)每一個(gè)標(biāo)簽做二分類,生成了一個(gè)多標(biāo)簽?zāi)P汀?/p>
模型評(píng)價(jià)標(biāo)準(zhǔn)有精確度(Precision)以及召回率(Recall):

此處L是用戶實(shí)際標(biāo)簽,P是模型預(yù)測(cè)標(biāo)簽。
這個(gè)模型現(xiàn)在還有以下幾點(diǎn)待實(shí)現(xiàn)和解決:
預(yù)測(cè)出來的標(biāo)簽都可以作為推薦模型的一個(gè)輸入;
司機(jī)車型、發(fā)貨地和卸貨地的預(yù)測(cè)困難,當(dāng)前司機(jī)的車型標(biāo)簽比較少且固定,但司機(jī)對(duì)于發(fā)貨地卸貨地需求變化多端,因而我們需要更多數(shù)據(jù)才能更加準(zhǔn)確地預(yù)測(cè);
召回率與精確度平衡問題,比如給司機(jī)推送消息需要更高精確性以減少不必要的打擾。
5 貨運(yùn)價(jià)格預(yù)測(cè)
貨運(yùn)價(jià)格一方面可以作為模型的輸入,另一方面可為系統(tǒng)整體運(yùn)作提供提示和參考,尤其是需要知道整體市場(chǎng)價(jià)格的調(diào)度人員。因此,需要有模型來對(duì)貨運(yùn)價(jià)格進(jìn)行預(yù)測(cè)。若要建模,首先要把貨運(yùn)價(jià)格通過專業(yè)知識(shí)拆分出固定的成本,如過路費(fèi)、郵費(fèi)、司機(jī)勞務(wù)費(fèi)用、車輛折舊費(fèi)用等等。另外,針對(duì)一些返程空車情況嚴(yán)重的路線,我們還需要考慮供需關(guān)系對(duì)于價(jià)格的影響?;A(chǔ)的貨運(yùn)價(jià)格公式和價(jià)格模型如下圖所示。

要搭建模型,首先要做特征工程,得到城市、月份、路程、車長以及其他特征。成本分為三種:線性成本、周期成本與時(shí)序成本。對(duì)于不同成本,我們施與不同的模型策略。線性成本是可以根據(jù)貨運(yùn)距離和油價(jià)計(jì)算出來的成本,例如過路費(fèi)和郵費(fèi),因此使用線性回歸模型進(jìn)行學(xué)習(xí)。周期成本是跟天氣相關(guān)、季節(jié)相關(guān)的。時(shí)序成本,如司機(jī)勞務(wù)費(fèi),是隨著當(dāng)?shù)丨h(huán)境因素(如:收入水平)是在動(dòng)態(tài)變化的。因此,通過連續(xù)的成本模型LSTM模型去進(jìn)行預(yù)測(cè)。對(duì)于突發(fā)狀況,模型則應(yīng)用規(guī)則策略。規(guī)則策略主要是靠人工觀察市場(chǎng)行情,并調(diào)參以調(diào)整價(jià)格模型。那么隨著逐步收集市場(chǎng)數(shù)據(jù),模型中可加入市場(chǎng)行情模型實(shí)現(xiàn)自動(dòng)價(jià)格調(diào)整以及價(jià)格預(yù)測(cè)。
價(jià)格模型的評(píng)估指標(biāo)為SMAPE(對(duì)稱平均絕對(duì)值百分比誤差),以處理高價(jià)帶來的高方差。正常來說,模型對(duì)價(jià)格預(yù)測(cè)在實(shí)際價(jià)格上下10%波動(dòng),可以達(dá)到85%左右的準(zhǔn)確率。
6 總結(jié)
物流大數(shù)據(jù)平臺(tái)通過大量業(yè)務(wù)數(shù)據(jù)沉淀,訓(xùn)練出基于DeepFM的車貨匹配系統(tǒng)模型,基于LSTM的司機(jī)標(biāo)簽體系模型,以及貨運(yùn)價(jià)格預(yù)測(cè)模型,從而成功建造了一個(gè)高效的物流生態(tài)。
7 部分核心代碼
import scipy.io as sio
import numpy as np
import torch
from torch import nn
import matplotlib.pyplot as plt
import matplotlib
import pandas as pd
from torch.autograd import Variable
import math
import csv
# Define LSTM Neural Networks
class LstmRNN(nn.Module):
? ?"""
? ? ? ?Parameters:
? ? ? ?- input_size: feature size
? ? ? ?- hidden_size: number of hidden units
? ? ? ?- output_size: number of output
? ? ? ?- num_layers: layers of LSTM to stack
? ?"""
? ?def __init__(self, input_size, hidden_size=1, output_size=1, num_layers=1):
? ? ? ?super().__init__()
? ? ? ?self.lstm = nn.LSTM(input_size, hidden_size, num_layers) ?# utilize the LSTM model in torch.nn
? ? ? ?self.linear1 = nn.Linear(hidden_size, output_size) # 全連接層
? ?def forward(self, _x):
? ? ? ?x, _ = self.lstm(_x) ?# _x is input, size (seq_len, batch, input_size)
? ? ? ?s, b, h = x.shape ?# x is output, size (seq_len, batch, hidden_size)
? ? ? ?x = x.view(s * b, h)
? ? ? ?x = self.linear1(x)
? ? ? ?x = x.view(s, b, -1)
? ? ? ?return x
if __name__ == '__main__':
# checking if GPU is available
? ?device = torch.device("cpu")
? ?if (torch.cuda.is_available()):
? ? ? ?device = torch.device("cuda:0")
? ? ? ?print('Training on GPU.')
? ?else:
? ? ? ?print('No GPU available, training on CPU.')
? ?# 數(shù)據(jù)讀取&類型轉(zhuǎn)換
? ?data_x = np.array(pd.read_csv('Data_x.csv', header=None)).astype('float32')
? ?data_y = np.array(pd.read_csv('Data_y.csv', header=None)).astype('float32')
? ?# 數(shù)據(jù)集分割
? ?data_len = len(data_x)
? ?t = np.linspace(0, data_len, data_len)
? ?train_data_ratio = 0.8 ?# Choose 80% of the data for training
? ?train_data_len = int(data_len * train_data_ratio)
? ?train_x = data_x[5:train_data_len]
? ?train_y = data_y[5:train_data_len]
? ?t_for_training = t[5:train_data_len]
? ?test_x = data_x[train_data_len:]
? ?test_y = data_y[train_data_len:]
? ?t_for_testing = t[train_data_len:]
? ?# ----------------- train -------------------
? ?INPUT_FEATURES_NUM = 5
? ?OUTPUT_FEATURES_NUM = 1
? ?train_x_tensor = train_x.reshape(-1, 1, INPUT_FEATURES_NUM) ?# set batch size to 1
? ?train_y_tensor = train_y.reshape(-1, 1, OUTPUT_FEATURES_NUM) ?# set batch size to 1
? ?# transfer data to pytorch tensor
? ?train_x_tensor = torch.from_numpy(train_x_tensor)
? ?train_y_tensor = torch.from_numpy(train_y_tensor)
? ?lstm_model = LstmRNN(INPUT_FEATURES_NUM, 20, output_size=OUTPUT_FEATURES_NUM, num_layers=1) ?# 20 hidden units
? ?print('LSTM model:', lstm_model)
? ?print('model.parameters:', lstm_model.parameters)
? ?print('train x tensor dimension:', Variable(train_x_tensor).size())
? ?criterion = nn.MSELoss()
? ?optimizer = torch.optim.Adam(lstm_model.parameters(), lr=1e-2)
? ?prev_loss = 1000
? ?max_epochs = 2000
? ?train_x_tensor = train_x_tensor.to(device)
? ?for epoch in range(max_epochs):
? ? ? ?output = lstm_model(train_x_tensor).to(device)
? ? ? ?loss = criterion(output, train_y_tensor)
? ? ? ?optimizer.zero_grad()
? ? ? ?loss.backward()
? ? ? ?optimizer.step()
? ? ? ?if loss < prev_loss:
? ? ? ? ? ?torch.save(lstm_model.state_dict(), 'lstm_model.pt') ?# save model parameters to files
? ? ? ? ? ?prev_loss = loss
? ? ? ?if loss.item() < 1e-4:
? ? ? ? ? ?print('Epoch [{}/{}], Loss: {:.5f}'.format(epoch + 1, max_epochs, loss.item()))
? ? ? ? ? ?print("The loss value is reached")
? ? ? ? ? ?break
? ? ? ?elif (epoch + 1) % 100 == 0:
? ? ? ? ? ?print('Epoch: [{}/{}], Loss:{:.5f}'.format(epoch + 1, max_epochs, loss.item()))
? ?# prediction on training dataset
? ?pred_y_for_train = lstm_model(train_x_tensor).to(device)
? ?pred_y_for_train = pred_y_for_train.view(-1, OUTPUT_FEATURES_NUM).data.numpy()
? ?# ----------------- test -------------------
? ?lstm_model = lstm_model.eval() ?# switch to testing model
? ?# prediction on test dataset
? ?test_x_tensor = test_x.reshape(-1, 1,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? INPUT_FEATURES_NUM)
? ?test_x_tensor = torch.from_numpy(test_x_tensor) ?# 變?yōu)閠ensor
? ?test_x_tensor = test_x_tensor.to(device)
? ?pred_y_for_test = lstm_model(test_x_tensor).to(device)
? ?pred_y_for_test = pred_y_for_test.view(-1, OUTPUT_FEATURES_NUM).data.numpy()
? ?loss = criterion(torch.from_numpy(pred_y_for_test), torch.from_numpy(test_y))
? ?print("test loss:", loss.item())
? ?# ----------------- plot -------------------
? ?plt.figure()
? ?plt.plot(t_for_training, train_y, 'b', label='y_trn')
? ?plt.plot(t_for_training, pred_y_for_train, 'y--', label='pre_trn')
? ?plt.plot(t_for_testing, test_y, 'k', label='y_tst')
? ?plt.plot(t_for_testing, pred_y_for_test, 'm--', label='pre_tst')
? ?plt.xlabel('t')
? ?plt.ylabel('Vce')
? ?plt.show()
畢設(shè)幫助,選題指導(dǎo),技術(shù)解答,歡迎打擾,見B站個(gè)人主頁
https://space.bilibili.com/33886978