主要内容

异常检测的代码生成

这个例子展示了如何生成单精度检测的代码使用一个训练有素的异常数据隔离森林支持向量机模型或看到下面成了(OCSVM)。金宝app

isanomaly的函数isolationForest预测函数ClassificationSVM金宝app支持代码生成。这些功能需要一个训练有素的模型对象,但是arg游戏选择codegen(MATLAB编码器)不接受这些对象。解决这种限制使用saveLearnerForCoderloadLearnerForCoder如这个例子所示。

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

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

加载数据

载激光雷达扫描数据集,其中包含对象的坐标周围的车辆,存储为3 d点的集合。

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

强调车辆周围的环境,设置感兴趣区域跨度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(指数:);谁疯狂的
类属性名称大小字节loc 228840 x3 19070单身

疯狂的是一个单精度矩阵包含19070个样本的三维点。

可视化数据的二维散点图。注释情节突出了车辆。

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

图包含一个坐标轴对象。坐标轴对象包含一个散射类型的对象。

点集的中心(用红笔圈出来的)包含车辆的屋顶和罩。所有其他点障碍。

假设数据异常值的分数是0.05。

contaminationFraction =单(0.05);

代码生成孤立森林

火车隔离森林模型

火车一个隔离森林模型通过使用iforest函数。指定异常值的分数(ContaminationFraction0.05)。

rng (“默认”)%的再现性[森林,tf_forest s_forest] = iforest (loc, ContaminationFraction = ContaminationFraction);

森林是一个IsolationForest对象。iforest还返回异常指标(tf_forest)和异常分数(s_forest)的数据(疯狂的)。iforest决定了分数阈值(forest.ScoreThreshold),以便观察的功能检测指定的分数作为离群值。

保存模型使用saveLearnerForCoder

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

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

saveLearnerForCoderMATLAB二进制文件保存对象IsolationForestModel.mat作为一个结构数组在当前文件夹。

定义入口点函数

定义一个入口点函数,它返回异常指标和异常分数的输入数据。在函数内,加载一个单精度模型通过使用loadLearnerForCoder,然后通过加载模型isanomaly

类型myIsanomaly.m%显示myIsanomaly内容。m文件
函数varargout = myIsanomaly (MdlFileName, x,变长度输入宗量)% # codegen % myIsanomaly入口点函数异常检测%这个函数只支持的示例代码生成异常%检测和在将来发布的版本中可能会改变。金宝app%这个函数检测异常使用保存的新观察x % MdlFileName文件中的异常检测模型。Mdl = loadLearnerForCoder (MdlFileName数据类型=“单”);[varargout {1: nargout}] = isanomaly (Mdl x,变长度输入宗量{:});结束

生成代码

指定的输入参数类型myIsanomaly使用4-by-1单元阵列。将每个入口点函数的输入参数类型分配给每一个细胞。指定数据类型和准确的输入数组大小通过使用一组示例值代表的值和一个特定的数据类型和数组的大小。

ARGS =细胞(4,1);p =元素个数(forest.PredictorNames);ARGS {1} = coder.Constant (ForestMdlFileName);ARGS {2} = coder.typeof(单(0)、(Inf, p), [1,0]);ARGS {3} = coder.Constant (“ScoreThreshold”);ARGS{4} =单(0.5);

第二个输入的myIsanomaly是一个适应输入。适应可变参数的更多细节,请参阅为代码生成指定适应可变参数

生成一个墨西哥人从入口点函数的函数myIsanomaly。指定输入参数类型使用arg游戏选项和单元阵列arg游戏。指定的输出参数生成的入口点函数使用-nargout选择。

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

codegen生成墨西哥人的功能myIsanomaly_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模型

看到下面成了训练金宝app支持向量机模型学习使用fitcsvm函数。看到下面成了学习的函数列车模型的类标签变量是一个向量的。指定异常值的分数(OutlierFraction0.05)。

MdlOCSVM = fitcsvm (loc,单身的(大小(loc, 1), 1)), OutlierFraction = contaminationFraction,标准化= 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%显示myIsanomalySVM内容。m文件
函数(tf,分数)= myIsanomalySVM (MdlFileName, x, scoreThreshold) % # codegen % MYISANOMALY入口点函数异常检测%这个函数只支持的示例代码生成异常%检测和在将来发布的版本中可能会改变。金宝app%这个函数检测异常使用保存的新观察x %看到下面成了MdlFileName文件中支持向量机模型。金宝appMdl = loadLearnerForCoder (MdlFileName数据类型=“单”);[~,分数]=预测(Mdl x);tf =分数< scoreThreshold;结束

生成代码

指定的输入参数类型myIsanomalySVM使用一个3×1单元阵列。

ARGS =细胞(3,1);p =元素个数(MdlOCSVM.PredictorNames);ARGS {1} = coder.Constant (SVMMdlFileName);ARGS {2} = coder.typeof(单(0)、(Inf, p), [1,0]);ARGS{3} =单(0);

生成一个墨西哥人从入口点函数的函数myIsanomalySVM

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

验证生成的代码

检测到异常的使用生成的墨西哥人训练数据的功能。从墨西哥人比较异常指标和评分与返回的函数resubPredict

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

isequal返回逻辑1 (真正的),这意味着所有的异常指标是相等的。的异常分数的差异是可以接受的,因为平均分数(意思是(s_OCSVM)在700年左右)。你看到一些不同的分数使用高斯内核时,看到下面成了学习的默认值。

比较检测到异常值

情节的正常点和异常值检测隔离森林模型和看到下面成了一个支持向量机模型。

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

图包含2轴对象。坐标轴对象1标题隔离森林包含2线类型的对象。一个或多个行显示的值只使用这些对象标记代表正常点,离群值。坐标轴对象2 SVM与标题看到下面成了一个包含对象类型的线。一个或多个行显示的值只使用这些对象标记代表正常点,离群值。

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

意思是(tf_forest = = tf_OCSVM)
ans = 0.9732

另请参阅

(MATLAB编码器)||||

相关的话题