www.gusucode.com > stats 源码程序 matlab案例代码 > stats/PredictClassLabelsUsingMATLABFunctionBlockExample.m
%% Predict Class Labels Using MATLAB Function Block % Products Used: Simulink(R) and statistics and Machine Learning % Toolbox(TM) %% % This example shows how to add a MATLAB Function block to a Simulink(R) % for label prediction. The MATLAB Function block accepts streaming data, % and predicts the label and classification score using a trained, support % vector machine (SVM) classification model. For details on using the % MATLAB Function block, see <docid:simulink_ug.f6-130172>. %% % The |ionosphere| data set, which is included in the Statistics and % Machine Learning Toolbox(TM), contains radar-return qualities (|Y|) and % predictor data (|X|). Radar returns are either of good quality (|'g'|) or % of bad quality (|'b'|). %% % Load the |ionosphere| data set. Determine the sample size. load ionosphere n = numel(Y) %% % The MATLAB Function block cannot return cell arrays. So, convert the % response variable to a logical vector whose elements are % |1| if the radar returns are good, and |0| otherwise. Y = strcmp(Y,'g'); %% % Suppose that the radar returns are detected in sequence, and you have the % first 300 observations, but you have not received the last 51 yet. % Partition the data into present and future samples. prsntX = X(1:300,:); prsntY = Y(1:300); ftrX = X(301:end,:); ftrY = Y(301:end); %% % Train an SVM model using all, presently available data. Specify predictor % data standardization. Mdl = fitcsvm(prsntX,prsntY,'Standardize',true); %% % |Mdl| is a <docid:stats_ug.bt63jyz ClassificationSVM> model. At the % command line, you can use |Mdl| to make predictions for new observations. % However, you cannot use |Mdl| as an input argument in a function meant % for code generation. %% % Prepare |Mdl| to be loaded within the function using % <docid:stats_ug.bvclu99 saveCompactModel>. saveCompactModel(Mdl,'SVMIonosphere'); %% % |saveCompactModel| compacts |Mdl|, and then saves it in the MAT-file % |SVMIonosphere.mat|. %% % Declare a function named |svmIonospherePredict.m| that predicts whether a % radar return is of good quality. The function should: % % * Include the code generation directive |%#codegen| somewhere in the % function. % * Accept radar-return predictor data. The data must be commensurate with % |X| except for the number of rows. % * Load |SVMIonosphere.mat| using <docid:stats_ug.bvcl05n-1 % loadCompactModel>. % * Return predicted labels and classification scores for predicting the % quality of the radar return as good (that is, the positive-class score). % % <include>svmIonospherePredict.m</include> %% % |svmIonospherePredict.m| is located in your % |mlr/help/toolbox/stats/examples| folder, where |mlr| is the value of % |matlabroot|. %% % Load the Simulink(R) model |slexSVMIonospherePredictExample.slx| located % in |mlr/examples/stats|. mlr = matlabroot; SimMdlName = 'slexSVMIonospherePredictExample'; pathToModel = fullfile(mlr,'examples','stats',SimMdlName); open_system(pathToModel); %% % The figure displays the Simulink(R) model. When the input node detects a % radar return, it directs that observation into the MATLAB Function block % that dispatches to |svmIonospherePredict.m|. After predicting the label % and score, the model returns these values to the workspace and displays % the values within the model one at a time. When you load % |slexSVMIonospherePredictExample.slx|, MATLAB(R) also loads the data set % that it requires called |radarReturnInput|. However, this example shows % how to construct the required data set. %% % The model expects to receive input data as a structure array called % |radarReturnInput| containing these fields: % % * |time| - The points in time at which the observations enter the model. % In the example, the duration includes the integers from 0 though 50. The % orientation must correspond to the observations in the predictor data. % So, for this example, |time| must be a column vector. % * |signals| - A 1-by-1 structure array describing the input data, and % containing the fields |values| and |dimensions|. |values| is a matrix of % predictor data. |dimensions| is the number of predictor variables. % % Create an appropriate structure array for future radar returns. radarReturnInput.time = (0:50)'; radarReturnInput.signals(1).values = ftrX; radarReturnInput.signals(1).dimensions = size(ftrX,2); %% % You can change the name from |radarReturnInput|, and then specify the new % name in the model. However, Simulink(R) expects the structure array to % contain the described field names. %% % Simulate the model using the data held out of training, that is, the data % in |radarReturnInput|. sim(SimMdlName); %% % <<../classifyIonosphereAfterSim.png>> % %% % The figure shows the model after it processes all observations in % |radarReturnInput| one at a time. The predicted label of |X(351,:)| is % |1| and its positive-class score is |1.431|. The variables |tout|, % |yout|, and |svmlogsout| appear in the workspace. |yout| and |svmlogsout| % are |SimulinkData.Dataset| objects containing the predicted labels and % scores. For more details, see <docid:simulink_ug.bs40i1i-1>. % %% % Extract the simulation data from the simulation log. labelsSL = svmlogsout.getElement(1).Values.Data; scoresSL = svmlogsout.getElement(2).Values.Data; %% % |labelsSL| is a 51-by-1 numeric vector of predicted labels. |labelsSL(j)| % = |1| means that the SVM model predicts that radar return |j| in the % future sample is of good quality, and |0| means otherwise. |scoresSL| is % a 51-by-1 numeric vector of positive-class scores, that is, signed % distances from the decision boundary. Positive scores correspond to % predicted labels of |1|, and negative scores correspond to predicted % labels of |0|. %% % Predict labels and positive-class scores at the command line using % <docid:stats_ug.bt74bzo predict>. [labelCMD,scoresCMD] = predict(Mdl,ftrX); scoresCMD = scoresCMD(:,2); %% % |labelCMD| and |scoresCMD| are commensurate with |labelsSL| and % |scoresSL|. %% % Compare the future-sample, positive-class scores returned by % |slexSVMIonospherePredictExample| to those returned by calling |predict| % at the command line. err = sum((scoresCMD - scoresSL).^2); err < eps %% % The sum of squared deviations between the sets of scores is negligible. %% % If you also have a Simulink(R) Coder(TM) license, then you can generate C % code from |slexSVMIonospherePredictExample.slx| in Simulink(R) or from % the command line using <docid:rtw_ref.bttxa6u rtwbuild>. For more % details, see <docid:rtw_gs.btyj0uu>.