异常检测代码生成
此示例演示如何使用经过训练的隔离林模型或单类支持向量机(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],颜色=“红色”)
这组点的中心(用红色圈出)包含了车辆的车顶和引擎盖。所有其他的点都是障碍。
假设数据中异常值的比例为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(“正常点”,“局外人”)标题(“看到下面成了一个支持向量机”)
两种方法识别出的离群值是相似的。计算两个方法的输出中相同标识符的分数。
mean(tf_forest == tf_OCSVM)
Ans = 0.9732
另请参阅
codegen
(MATLAB编码器)|iforest
|isanomaly
|fitcsvm
|预测