ساخت NARX در انجام پروژه متلب برای پیش بینی داده های سری زمانی.
کندوسکیگ در جریان های زیاد. در جریان های پایین تر
سال گذشته مقاله ای منتشر کردم (در مورد
PaddleSoft
حساب) جایی که من پیش بینی جریان کندوسکیگ را با استفاده از NARX ساخته شده در MATLAB توضیح دادم. با این حال، من به طور هدفمند جزئیات فنی زیادی را که سعی کردم برای مخاطبان عمومی بنویسم، درج نکردم. خوب، من اکنون یک آموزش کامل در مورد نحوه ساخت یک شبکه اتورگرسیو غیرخطی با ورودی اگزوژن (NARX) در MATLAB برای پیش بینی داده های سری زمانی ایجاد کرده ام.
آموزش
این فرآیند در واقع نسبتاً ساده است: داده های خود را وارد کنید، مدل خود را ایجاد کنید، مدل خود را آموزش دهید، و سپس پیش بینی کنید.
این CSV نمونه ای از نوع CSV است که در آموزش با آن کار خواهیم کرد. اساساً سه ستون وجود دارد: ارتفاع، دما و بارندگی. ما می خواهیم از ارتفاع قبلی به همراه دما و بارندگی برای پیش بینی ارتفاع فعلی استفاده کنیم.
داده ها را وارد کنید
ابتدا باید داده های خود را وارد کنیم. برای این کار از یک تابع ساده استفاده می کنیم:
function [X_input, height] =load_data(path) filename1 = path; height = xlsread(filename1,'A:A'); X_input = xlsread(filename1,'B:C');
ما این تابع را با [X_input,height]=load_data('height.csv') فراخوانی می کنیم (توجه داشته باشید که حتی اگر از xlsread استفاده می کنیم، همچنان روی فایل های CSV کار می کند).
2. آموزش
حالا بیایید به کد آموزشی خود نگاه کنیم:
X = tonndata(X_input,false,false);
T = tonndata(height,false,false); % Choose a Training Function % For a list of all training functions type: help nntrain % 'trainlm' is usually fastest. % 'trainbr' takes longer but may be better for challenging problems. % 'trainscg' uses less memory. Suitable in low memory situations. trainFcn = 'trainbr'; % Levenberg-Marquardt backpropagation. % Create a Nonlinear Autoregressive Network with External Input inputDelays = 1:30; feedbackDelays = 1:3; hiddenLayerSize = 30; net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize,'open',trainFcn); % Prepare the Data for Training and Simulation % The function PREPARETS prepares timeseries data for a particular network, % shifting time by the minimum amount to fill input states and layer % states. Using PREPARETS allows you to keep your original time series data % unchanged, while easily customizing it for networks with differing % numbers of delays, with open loop or closed loop feedback modes. [x,xi,ai,t] = preparets(net,X,{},T); %[ed,ei,ci,w] = preparets(net,Y,{},D); % Setup Division of Data for Training, Validation, Testing net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 5/100; % Train the Network [net,tr] = train(net,x,t,xi,ai); % Test the Network y = net(x,xi,ai); prediction_of_test=net(ed,ei,ci); e = gsubtract(t,y); performance = perform(net,t,y); % View the Network view(net) % Plots % Uncomment these lines to enable various plots. %figure, plotperform(tr) %figure, plottrainstate(tr) %figure, ploterrhist(e) %figure, plotregression(t,y) %figure, plotresponse(t,y) %figure, ploterrcorr(e) %figure, plotinerrcorr(x,e) % Closed Loop Network % Use this network to do multi-step prediction. % The function CLOSELOOP replaces the feedback input with a direct % connection from the outout layer. netc = closeloop(net); netc.name = [net.name ' - Closed Loop']; view(netc) [xc,xic,aic,tc] = preparets(netc,X,{},T); yc = netc(xc,xic,aic); closedLoopPerformance = perform(net,tc,yc); % Step-Ahead Prediction Network % For some applications it helps to get the prediction a timestep early. % The original network returns predicted y(t+1) at the same time it is % given y(t+1). For some applications such as decision making, it would % help to have predicted y(t+1) once y(t) is available, but before the % actual y(t+1) occurs. The network can be made to return its output a % timestep early by removing one delay so that its minimal tap delay is now % 0 instead of 1. The new network returns the same outputs as the original % network, but outputs are shifted left one timestep. nets = removedelay(net); nets.name = [net.name ' - Predict One Step Ahead']; view(nets) [xs,xis,ais,ts] = preparets(nets,X,{},T); ys = nets(xs,xis,ais); stepAheadPerformance = perform(nets,ts,ys);
اجازه دهید این کد را کمی تجزیه کنیم. اولین کاری که باید انجام دهیم این است که از تابع tonndata برای دریافت ورودی خود به یک آرایه سلولی استفاده کنیم. بعد، ما باید عملکرد آموزشی خود را انتخاب کنیم. من شخصاً بیشترین موفقیت را با تنظیم بیزی (به عنوان مثال trainbr) داشته ام، با این حال، این احتمالاً بیشتر طول می کشد. پس از آن، آماده ها داده ها را با فرمت صحیح برای NARX ما آماده می کنند (24).
پارامترهای تاخیر(های) ورودی و تاخیر(های) بازخورد بسیار مهم هستند و تاثیر زیادی بر پیش بینی شما خواهند داشت. روشی که من در ابتدا روش خودم را انتخاب کردم این بود که میزان بارندگی در مقابل تغییر ارتفاع را ترسیم کنم تا تعیین کنم که چه زمانی بارندگی بیشترین تأثیر را بر ارتفاع جریان دارد. سپس با تنظیمات مختلف آزمایش کردم. همچنین روش های ریاضی بیشتری برای تعیین آن با استفاده از همبستگی متقابل وجود دارد (). با این حال، در حال حاضر، شما فقط می توانید در اطراف بازی کنید تا ببینید چه چیزی بهترین کار را می کند.
سپس تصمیمات نسبتاً استانداردی مانند آموزش / اعتبارسنجی / تقسیم آزمایشی در خطوط 28 تا 30 می گیریم و در نهایت شبکه را آموزش می دهیم (خط 30). بقیه کد اختیاری است، بنابراین من به جزئیات زیاد در مورد آن نمی پردازم. اما، با خیال راحت بازی کنید و از چیزهایی که در دسترس هستند احساس کنید.
3. پیش بینی
اکنون، برای انجام پیشبینیهای خود در CSV(های) خود، از height_net جدید ایجاد شده خود استفاده میکنیم. من شخصاً سادهترین حالت را پیدا کردم که دادههای آزمایش را به دو CSV تقسیم کنم: یکی با ورودیها (دمای هوا و میزان بارندگی) و مقادیر ارتفاع برای مهرهای 0:length-240 و دومی فقط با ورودیهای طول-240:length ( * که در آن طول تعداد ردیفهای CSV آزمایشی ما است). این تقریباً پیشبینی یک پیشبینی آب و هوای 10 روزه را تقلید میکند (یعنی استفاده از یک سری زمانی طولانی شناخته شده و سپس پیشبینی مهرهای 10*24 که از API آبوهوا دریافت کردهاید). به همین راحتی میتوانید دادهها را در خود کد متلب خود تقسیم کنید، اما به نظر من انجام آن از این طریق سادهتر است. با در نظر گرفتن این موضوع، کد پیشبینی ما اینجاست:
% Load test data [knownInput, knownY] = load_data('data/test_data.csv'); [predict_input, unknownY] = load_data('data/test_data_pred.csv'); % Format data toPredict = tonndata(predict_input,false,false); X = tonndata(knownInput,false,false); A = tonndata(knownY,false,false); [ai,ab,ac] = preparets(height_net,X,{},A); [y1,xf,af] = height_net(ai,ab,ac); % Close the loop to make multiple preds [netc,xi,ai] = closeloop(height_net,xf,af); [y2,xf,af]= netc(toPredict,xi,ai); unknownY = y2;
ما در دنباله مهر زمانی شناخته شده به شبکه ارتفاع باز عبور می کنیم تا xf و af را بدست آوریم. سپس شبکه را می بندیم تا پیش بینی های متعدد انجام شود (12). در نهایت، پیش بینی های واقعی را انجام می دهیم (13). اکنون می توانید پیش بینی ها را با نگاه کردن به y2 یاknownY که مجدداً اختصاص داده ایم نگاه کنید.
امیدوارم این مثال برای خیس شدن پاهای شما با NARX(ها) در متلب کافی باشد. در آینده، من امیدوارم که بیشتر در مورد مزایای NARX ها در مقابل سایر RNN ها مانند LSTM ها تحقیق کنم.
شما می توانید من را دنبال کنید و همچنین پرداخت کنید
برای بیشتر نوشته هایم