主要内容

异常检测代码生成

此示例演示如何使用经过训练的隔离林模型或单类支持向量机(OCSVM)生成检测数据异常的单精度代码。

isanomaly的函数isolationForest预测函数ClassificationSVM支持代码生成。这些对象函数需要经过训练的模型对象,但是arg游戏选择codegen(MATLAB编码器)不接受这些对象。通过使用saveLearnerForCoder而且loadLearnerForCoder如本例所述。

此流程图显示了异常检测的代码生成工作流。

在您训练一个模型之后,通过使用保存训练的模型saveLearnerForCoder.定义一个入口点函数,用于加载保存的模型loadLearnerForCoder并调用对象函数。然后为入口点函数生成代码codegen,并验证生成的代码。有关更详细的代码生成工作流示例,请参见命令行机器学习模型预测的代码生成

加载数据

加载激光雷达扫描数据集,其中包含车辆周围物体的坐标,存储为3-D点集合。

负载(“lidar_subset.mat”) loc = lidar_子集;

为了突出车辆周围的环境,将感兴趣的区域设置为距离车辆左右20米,车辆前后20米,以及路面以上的区域。

xBound = 20;米%yBound = 20;米%zLowerBound = 0;米%

裁剪数据以只包含指定区域内的点。

指数= loc (: 1) < = xBound & loc (: 1) > = -xBound...& loc(:,2) <= yBound & loc(:,2) >= -yBound...& loc(:,3) > zLowerBound;Loc = Loc (indexes,:);谁疯狂的
名称大小字节类属性loc 19070x3 228840 single

疯狂的为包含19,070个三维点样本的单精度矩阵。

将数据可视化为二维散点图。注释情节以突出车辆。

散射(loc (: 1), loc (:, 2),“。”);注释(“椭圆”,[0.48 0.48 0.1 .1],颜色=“红色”

图中包含一个axes对象。axes对象包含一个scatter类型的对象。

这组点的中心(用红色圈出)包含了车辆的车顶和引擎盖。所有其他的点都是障碍。

假设数据中异常值的比例为0.05。

environmentfraction = single(0.05);

隔离林的代码生成

列车隔离森林模型

类训练隔离林模型iforest函数。指定异常值的百分比(ContaminationFraction)为0.05。

rng (“默认”%用于重现性[forest,tf_forest,s_forest] = forest(loc, environmentationfraction = environmentationfraction);

森林是一个IsolationForest对象。iforest也返回异常指示符(tf_forest)和异常评分(s_forest)查阅资料(疯狂的).iforest确定得分阈值(森林。ScoreThreshold),使该函数将特定比例的观察值检测为异常值。

保存模型使用saveLearnerForCoder

将模型对象保存到文件中IsolationForestModel.mat通过使用saveLearnerForCoder

ForestMdlFileName =“IsolationForestModel”;ForestMdlFileName saveLearnerForCoder(森林)

saveLearnerForCoder将对象保存到MATLAB二进制文件中IsolationForestModel.mat作为当前文件夹中的结构数组。

定义入口点函数

定义一个入口点函数,返回输入数据的异常指示器和异常评分。在函数中,使用loadLearnerForCoder,然后将加载的模型传递给isanomaly

类型myIsanomaly.m显示myIsanomaly的内容。m文件
这个函数只支持用于异常检测的示例代码生成,并且可能在未来的版本中更改。这个函数使用MdlFileName文件中保存的%异常检测模型来检测新观察结果中的异常。Mdl = loadLearnerForCoder(MdlFileName,DataType="single");[varargout{1:nargout}] = isexception (Mdl,x, varargout{:});结束

生成代码

的输入参数类型myIsanomaly使用4 × 1单元格数组。将入口点函数的每个输入参数类型分配给每个单元格。通过使用表示具有特定数据类型和数组大小的值集的示例值,指定数据类型和准确的输入数组大小。

ARGS = cell(4,1);p = numel(forest.PredictorNames);ARGS{1} = code . constant (ForestMdlFileName);ARGS{2} = code .typeof(single(0),[Inf,p],[1,0]);ARGS{3} =编码器。常数(“ScoreThreshold”);ARGS{4} = single(0.5);

第二个输入myIsanomaly是一个可变大小的输入。有关可变大小参数的更多详细信息,请参见为代码生成指定可变大小的参数

从入口点函数生成MEX函数myIsanomaly.方法指定输入参数类型arg游戏选项和单元格数组arg游戏.方法在生成的入口点函数中指定输出参数的数量-nargout选择。

codegenmyIsanomalyarg游戏arg游戏-nargout2
代码生成成功。

codegen生成MEX函数myIsanomaly_mex在当前文件夹中使用与平台相关的扩展名。

验证生成的代码

使用生成的MEX函数检测训练数据中的异常。将MEX函数返回的异常指标和评分与返回的异常指标和评分进行比较iforest

[tf_forest_MEX,s_forest_MEX] = myIsanomaly_mex(ForestMdlFileName,loc,“ScoreThreshold”单(forest.ScoreThreshold));isequal (tf_forest tf_forest_MEX)
ans =逻辑1
马克斯(abs (s_forest-s_forest_MEX))
ans =5.9605 e-08

isequal返回逻辑1 (真正的),表示所有异常指标都相等。异常值的差异是不显著的。

OCSVM的代码生成

训练OCSVM模型

训练支持向量机模型的单类学习fitcsvm函数。如果类标签变量是1的向量,则该函数训练一个单类学习模型。指定异常值的百分比(OutlierFraction)为0.05。

MdlOCSVM = fitcsvm(loc,single(ones(size(loc,1),1)),OutlierFraction= environmentfraction,...标准化= true);

MdlOCSVM是一个ClassificationSVM对象。计算离群值分数疯狂的通过使用resubPredict函数。

[~,s_OCSVM] = resubPredict(MdlOCSVM);

负值表示对应的观测值为异常值。获取异常指标。

tf_OCSVM = s_OCSVM < 0;

保存模型使用saveLearnerForCoder

将模型对象保存到文件中SVMModel.mat通过使用saveLearnerForCoder

SVMMdlFileName =“SVMModel”;saveLearnerForCoder (MdlOCSVM SVMMdlFileName)

定义入口点函数

定义一个入口点函数,返回输入数据的异常指示器和异常评分。在函数中,使用loadLearnerForCoder,然后将加载的模型传递给预测计算异常评分。通过评分发现异常指标。

类型myIsanomalySVM.m显示myisabnormysvm的内容。m文件
function [tf,scores] = myisexceptionysvm (MdlFileName,x,scoreThreshold) %#codegen %MYISANOMALY异常检测入口点函数%此函数只支持用于异常%检测的示例代码生成,并可能在未来的版本中更改。这个函数使用MdlFileName文件中保存的单类支持向量机模型检测新观察结果中的异常。Mdl = loadLearnerForCoder(MdlFileName,DataType="single");[~,scores] = predict(Mdl,x);tf = scores < scoreThreshold;结束

生成代码

的输入参数类型myIsanomalySVM使用3 × 1单元格数组。

ARGS = cell(3,1);p = numel(MdlOCSVM.PredictorNames);ARGS{1} = code . constant (SVMMdlFileName);ARGS{2} = code .typeof(single(0),[Inf,p],[1,0]);ARGS{3} = single(0);

从入口点函数生成MEX函数myIsanomalySVM

codegenmyIsanomalySVMarg游戏arg游戏-nargout2
代码生成成功。

验证生成的代码

使用生成的MEX函数检测训练数据中的异常。将MEX函数返回的异常指标和评分与返回的异常指标和评分进行比较resubPredict

[tf_OCSVM_MEX,s_OCSVM_MEX] = myisalarmysvm_mex (SVMMdlFileName,loc,single(0));
isequal (tf_OCSVM tf_OCSVM_MEX)
ans =逻辑1
马克斯(abs (s_OCSVM-s_OCSVM_MEX))
ans =0.0133

isequal返回逻辑1 (真正的),表示所有异常指标都相等。异常分数的差异是可以接受的,因为平均分数(意思是(s_OCSVM))在700左右。当您使用高斯核(单类学习的默认值)时,您会看到分数上的一些差异。

比较检测到的异常值

绘制隔离森林模型和单类支持向量机模型检测到的正常点和异常点。

nexttile gscatter(loc(:,1),loc(:,2),tf_forest) legend(“正常点”“局外人”)标题(“隔离森林”nexttile gscatter(loc(:,1),loc(:,2),tf_OCSVM) legend(“正常点”“局外人”)标题(“看到下面成了一个支持向量机”

图中包含2个轴对象。标题为Isolation Forest的axis对象1包含两个类型为line的对象。这些对象代表正常点,离群点。标题为One-Class SVM的axis对象2包含两个类型为line的对象。这些对象代表正常点,离群点。

两种方法识别出的离群值是相似的。计算两个方法的输出中相同标识符的分数。

mean(tf_forest == tf_OCSVM)
Ans = 0.9732

另请参阅

(MATLAB编码器)||||

相关的话题

Baidu
map