主要内容

无监督异常检测

本主题介绍了统计和机器学习工具箱™中用于多变量样本数据的无监督异常检测功能,并描述了该功能的工作流程异常值检测(检测训练数据中的异常)和新奇的检测(用未受污染的训练数据检测新数据中的异常)。

对于未标记的多元样本数据,可以使用隔离森林、局部离群因子、一类支持向量机(SVM)和马氏距离来检测异常。金宝app这些方法通过训练模型或学习参数来检测异常值。对于新颖性检测,您使用未受污染的训练数据(没有异常值的数据)训练模型或学习参数,并使用训练过的模型或学习过的参数检测新数据中的异常。

  • 隔离森林-与世隔绝的森林算法通过使用隔离树的集合将它们与正常点隔离来检测异常。方法检测异常值iforest函数,并通过使用对象函数来检测新奇isanomaly

  • 局部离群因素-局部离群因子(LOF)算法基于观测值相对于周围邻域的相对密度来检测异常。方法检测异常值lof函数,并通过使用对象函数来检测新奇isanomaly

  • 一类支持向量机(SV金宝appM)看到下面成了一个支持向量机,即无监督SVM,尝试在转换后的高维预测空间中从原点分离数据。方法检测异常值ocsvm函数,并通过使用对象函数来检测新奇isanomaly

  • Mahalanobis距离-如果样本数据服从多元正态分布,则样本到分布的马氏距离的平方服从卡方分布。因此,您可以根据卡方分布的临界值使用距离来检测异常。对于异常值检测,使用robustcov函数来计算鲁棒马氏距离。对于新颖性检测,您可以使用robustcov而且pdist2功能。

异常值检测

本例说明了四种无监督异常检测方法(隔离森林、局部离群因子、一类支持向量机和马氏距离)的离群检测工作流程。

加载数据

加载humanactivity数据集,其中包含变量的壮举而且actid.的变量的壮举包含24075个观测值的60个特征的预测器数据矩阵和响应变量actid以整数形式包含观察的活动id。本例使用的壮举异常检测变量。

负载humanactivity

求变量的大小的壮举

[N,D] =大小(壮举)
N = 24075
D = 60

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

污染分数= 0.05;

与世隔绝的森林

方法检测异常值iforest函数。

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

rng (“默认”%用于再现性[forest,tf_forest,s_forest] = forest(feat,...ContaminationFraction = ContaminationFraction);

森林是一个IsolationForest对象。iforest还返回异常指示符(tf_forest)和异常分数(s_forest)查阅资料(的壮举).iforest确定分数阈值(森林。ScoreThreshold),以便该函数将观测值的指定部分检测为异常值。

绘制分数值的直方图。在分数阈值处创建一条对应于指定分数的垂直线。

图直方图(s_forest正常化=“概率”)参照线(森林。ScoreThreshold,“k -”...加入([“阈值= "forest.ScoreThreshold]))标题(隔离林异常分值直方图

图中包含一个轴对象。标题为“隔离森林异常分数直方图”的axis对象包含2个直方图类型的对象,常量线。

检查数据中检测到的异常的比例。

OF_forest = sum(tf_forest)/N
OF_forest = 0.0496

当得分在阈值处有并列值时,异常值分数可以小于指定分数(0.05)。

局部离群因子

方法检测异常值lof函数。

训练局部离群因子模型lof函数。指定异常值的百分比(ContaminationFraction)为0.05,500个最近邻居,马氏距离。

[LOFObj,tf_lof,s_lof] = lof(壮举,...ContaminationFraction = ContaminationFraction,...NumNeighbors = 500,距离=“mahalanobis”);

LOFObj是一个LocalOutlierFactor对象。lof还返回异常指示符(tf_lof)和异常分数(s_lof)查阅资料(的壮举).lof确定分数阈值(LOFObj。ScoreThreshold),以便该函数将观测值的指定部分检测为异常值。

绘制分数值的直方图。在分数阈值处创建一条对应于指定分数的垂直线。

图直方图(s_lof正常化=“概率”)参照线(LOFObj。ScoreThreshold,“k -”...加入([“阈值= "LOFObj.ScoreThreshold]))标题(局部离群因子异常值直方图

图中包含一个轴对象。标题为“局部离群因子异常分数直方图”的axis对象包含2个直方图类型的对象,常量线。

检查数据中检测到的异常的比例。

OF_lof = sum(tf_lof)/N
OF_lof = 0.0500

看到下面成了一个支持向量机

方法检测异常值ocsvm函数。

训练一个单类SVM模型ocsvm函数。指定异常值的百分比(ContaminationFraction)为0.05。此外,设置KernelScale“汽车”让函数使用启发式过程选择适当的内核规模参数,并指定StandardizeData作为真正的标准化输入数据。

[Mdl,tf_OCSVM,s_OCSVM] = ocsvm(feat,...ContaminationFraction = ContaminationFraction,...KernelScale =“汽车”, StandardizeData = true);

Mdl是一个OneClassSVM对象。ocsvm还返回异常指示符(tf_OCSVM)和异常分数(s_OCSVM)查阅资料(的壮举).ocsvm确定分数阈值(Mdl。ScoreThreshold),以便该函数将观测值的指定部分检测为异常值。

绘制分数值的直方图。在分数阈值处创建一条对应于指定分数的垂直线。

图直方图(s_OCSVM正常化=“概率”)参照线(Mdl。ScoreThreshold,“k -”...加入([“阈值= "Mdl.ScoreThreshold]))标题(“单类支持向量机异常得分直方图”

图中包含一个轴对象。axis对象的标题为Histogram of Anomaly Scores for One-Class SVM,其中包含2个直方图类型的对象,constantline。

检查数据中检测到的异常的比例。

OF_OCSVM = sum(tf_OCSVM)/N
Of_ocsvm = 0.0500

Mahalanobis距离

使用robustcov函数来计算稳健的马氏距离和稳健的估计的平均值和数据的协方差。

计算马氏距离的壮举的分布的壮举通过使用robustcov函数。指定异常值的百分比(OutlierFraction)为0.05。robustcov使95%以上的观测值的协方差行列式最小化。

[sigma,mu,s_robustcov,tf_robustcov_default] = robustcov(feat,...OutlierFraction = contaminationFraction);

robustcov找到稳健的协方差矩阵估计(σ)和稳健平均估计(μ),它们对异常值的敏感性低于而且的意思是功能。的robustcov函数也计算马氏距离(s_robustcov)和异常值指标(tf_robustcov_default).默认情况下,该函数假设数据集遵循多元正态分布,并根据卡方分布的临界值将2.5%的输入观测值识别为异常值。

如果数据集满足正态假设,则马氏距离的平方服从卡方分布D自由度,其中D是数据的维数。在这种情况下,可以使用chi2inv函数检测作为异常值的观测值的指定部分。

s_robustcov_threshold = sqrt(chi2inv(1-污染分数,D));Tf_robustcov = s_robustcov > s_robustcov_threshold;

创建一个距离-距离图(DD图)来检查数据的多元正态性。

图d_classical = pdist2(feat,mean(feat),“mahalanobis”);gscatter (d_classical s_robustcov tf_robustcov,“kr”“方式”)参照线(s_robustcov_threshold“k -”) yline (s_robustcov_threshold“k -”...加入(["Threshold = "s_robustcov_threshold]));L = refline([10]);l.Color =“k”;包含(“Mahalanobis距离”) ylabel (“健壮的距离”)传说(“正常点”“局外人”位置=“西北”)标题(“距离是阴谋”

图中包含一个轴对象。标题为Distance-Distance Plot的axis对象包含5个类型为line, constantline的对象。这些对象表示法线点,异常值。

放大坐标轴可以看到正点。

Xlim ([0 10]) ylim([0 10])

图中包含一个轴对象。标题为Distance-Distance Plot的axis对象包含5个类型为line, constantline的对象。这些对象表示法线点,异常值。

如果数据集遵循多元正态分布,则数据点紧密地聚集在45度参考线周围。DD图表明数据集不遵循多元正态分布。

由于数据集不满足正态性假设,因此使用距离值的分位数表示累积概率(1 -污染分数)来寻找一个门槛。

s_robustcov_threshold =分位数(s_robustcov,1-污染物分数);

获取的异常指标的壮举使用新的阈值s_robustcov_threshold

Tf_robustcov = s_robustcov > s_robustcov_threshold;

检查数据中检测到的异常的比例。

OF_robustcov = sum(tf_robustcov)/N
OF_robustcov = 0.0500

比较检测到的异常值

方法来降低数据维数,以可视化检测到的异常值tsne函数。

rng (“默认”%用于再现性T = tsne(专长,标准化=正确,困惑=100,夸张=20);

在降维中绘制法向点和异常值。比较了隔离森林算法、局部离群因子算法、一类支持向量机模型和鲁棒马氏距离四种方法的结果robustcov

图tiledlayout(2,2) nexttile gscatter(T(:,1),T(:,2),tf_forest,“kr”[] [],“关闭”)标题(“隔离森林”) nexttile gscatter(T(:,1),T(:,2),tf_lof,“kr”[] [],“关闭”)标题(“本地离群因素”) nexttile gscatter(T(:,1),T(:,2),tf_OCSVM,“kr”[] [],“关闭”)标题(“看到下面成了一个支持向量机”) nexttile gscatter(T(:,1),T(:,2),tf_robustcov,“kr”[] [],“关闭”)标题(鲁棒马氏距离) l =传说(“正常点”“局外人”取向=“水平”);l.Layout.Tile =“北”

图中包含4个轴对象。标题为“隔离森林”的axis对象1包含2个类型为line的对象。标题为Local Outlier Factor的Axes对象2包含2个类型为line的对象。标题为One-Class SVM的坐标轴对象3包含2个类型为line的对象。标题为Robust Mahalanobis Distance的Axes对象4包含2个类型为line的对象。这些对象表示法线点,异常值。

四种方法识别的新奇之处在减少的维度上彼此靠近。计算四种方法返回相同标识符的数据的百分比。

意思是((tf_forest = = tf_lof) & (tf_lof = = tf_OCSVM) & (tf_OCSVM = = tf_robustcov))
Ans = 0.9419

方法选择的两个最重要的特性也可以使观测值可视化fsulaplacian函数。

Idx = fsulaplacian(壮举);图t = tiledlayout(2,2);nexttile gscatter(壮举:idx(1)),专长(:,idx (2)), tf_forest,“kr”[] [],“关闭”)标题(“隔离森林”) nexttile gscatter(壮举:idx(1)),专长(:,idx (2)), tf_lof,“kr”[] [],“关闭”)标题(“本地离群因素”) nexttile (3) gscatter(壮举:idx(1)),专长(:,idx (2)), tf_OCSVM,“kr”[] [],“关闭”)标题(“看到下面成了一个支持向量机”) nexttile (4) gscatter(壮举:idx(1)),专长(:,idx (2)), tf_robustcov,“kr”[] [],“关闭”)标题(“Mahalanobis距离”) l =传说(“正常点”“局外人”取向=“水平”);l.Layout.Tile =“北”;包含(t,加入([“列”idx (1)])) ylabel (t)加入([“列”idx (2))))

图中包含4个轴对象。标题为“隔离森林”的axis对象1包含2个类型为line的对象。标题为Local Outlier Factor的Axes对象2包含2个类型为line的对象。标题为One-Class SVM的坐标轴对象3包含2个类型为line的对象。标题为Mahalanobis Distance的Axes对象4包含2个类型为line的对象。这些对象表示法线点,异常值。

新奇的检测

本例说明了四种无监督异常检测方法(隔离森林、局部离群因子、一类支持向量机和马氏距离)新颖性检测的工作流程。

加载数据

加载humanactivity数据集,其中包含变量的壮举而且actid.的变量的壮举包含24075个观测值的60个特征的预测器数据矩阵和响应变量actid以整数形式包含观察的活动id。本例使用的壮举异常检测变量。

负载humanactivity

将数据划分为训练集和测试集cvpartition函数。使用50%的观测数据作为训练数据,50%的观测数据作为测试数据进行新颖性检测。

rng (“默认”%用于再现性c = cvpartition(actid,Holdout=0.50);trainingIndices = training(c);%训练集的指数testIndices =测试(c);%测试集的索引XTrain = feat(trainingIndices,:);XTest = feat(testindexes,:);

假设训练数据没有被污染(没有异常值)。

找到训练集和测试集的大小。

[N,D] = size(XTrain)
N = 12038
D = 60
NTest = size(XTest,1)
NTest = 12037

与世隔绝的森林

使用object函数检测新奇事物isanomaly训练一个隔离森林模型后,使用iforest函数。

训练一个隔离森林模型。

[forest,tf_forest,s_forest] = forest(XTrain);

森林是一个IsolationForest对象。iforest还返回异常指示符(tf_forest)和异常分数(s_forest)下载训练数据(XTrain).默认情况下,iforest将所有训练观察结果视为正常观察结果,并设置得分阈值(森林。ScoreThreshold)至最高分。

使用训练好的隔离林模型和目标函数isanomaly在里面发现新奇事物XTest.的isanomaly函数标识分数高于阈值的观测值(森林。ScoreThreshold)作为新奇事物。

[tfTest_forest,sTest_forest] = isanomaly(forest,XTest);

isanomaly函数返回异常指示器(tfTest_forest)和异常分数(sTest_forest)下载测试数据。

得分值的直方图。在分数阈值处创建一条垂直线。

图直方图(s_forest正常化=“概率”)举行直方图(sTest_forest正常化=“概率”)参照线(森林。ScoreThreshold,“k -”...加入([“阈值= "forest.ScoreThreshold]))传说(“训练数据”“测试数据”位置=“东南”)标题(隔离林异常分值直方图)举行

图中包含一个轴对象。标题为“隔离森林异常分数直方图”的axis对象包含3个直方图、常量线类型的对象。这些对象表示训练数据、测试数据。

测试数据的异常分分布与训练数据的异常分分布相似,因此isanomaly检测测试数据中的少量异常。

检查测试数据中检测到的异常的比例。

NF_forest = sum(tfTest_forest)/NTest
NF_forest = 8.3077e-05

显示试验数据中异常的观测指标。

idx_forest = find(tfTest_forest)
Idx_forest = 3422

局部离群因子

使用object函数检测新奇事物isanomaly训练出局部离群因子模型lof函数。

训练一个局部离群因子模型。

[LOFObj,tf_lof,s_lof] = lof(XTrain);

LOFObj是一个LocalOutlierFactor对象。lof返回异常指示符(tf_lof)和异常分数(s_lof)下载训练数据(XTrain).默认情况下,lof将所有训练观察结果视为正常观察结果,并设置得分阈值(LOFObj。ScoreThreshold)至最高分。

使用训练好的局部离群因子模型和目标函数isanomaly在里面发现新奇事物XTest.的isanomaly函数标识分数高于阈值的观测值(LOFObj。ScoreThreshold)作为新奇事物。

[tfTest_lof,sTest_lof] = isanomaly(LOFObj,XTest);

isanomaly函数返回异常指示器(tfTest_lof)和异常分数(sTest_lof)下载测试数据。

得分值的直方图。在分数阈值处创建一条垂直线。

图直方图(s_lof正常化=“概率”)举行直方图(sTest_lof正常化=“概率”)参照线(LOFObj。ScoreThreshold,“k -”...加入([“阈值= "LOFObj.ScoreThreshold]))传说(“训练数据”“测试数据”位置=“东南”)标题(局部离群因子异常值直方图)举行

图中包含一个轴对象。标题为“局部离群因子异常分数直方图”的axis对象包含3个直方图类型的对象,常量线。这些对象表示训练数据、测试数据。

测试数据的异常分分布与训练数据的异常分分布相似,因此isanomaly检测测试数据中的少量异常。

检查测试数据中检测到的异常的比例。

NF_lof = sum(tfTest_lof)/NTest
NF_lof = 8.3077e-05

显示试验数据中异常的观测指标。

idx_lof = find(tfTest_lof)
Idx_lof = 8704

看到下面成了一个支持向量机

使用object函数检测新奇事物isanomaly训练一个单类SVM模型ocsvm函数。

训练一个单类SVM模型。集KernelScale“汽车”让函数使用启发式过程选择适当的内核规模参数,并指定StandardizeData作为真正的标准化输入数据。

[Mdl,tf_OCSVM,s_OCSVM] = ocsvm(XTrain,...KernelScale =“汽车”,规范= true);

Mdl是一个OneClassSVM对象。ocsvm返回异常指示符(tf_OCSVM)和异常分数(s_OCSVM)下载训练数据(XTrain).默认情况下,ocsvm将所有训练观察结果视为正常观察结果,并设置得分阈值(Mdl。ScoreThreshold)至最高分。

使用训练好的单类SVM模型和目标函数isanomaly要在测试数据中发现新奇之处(XTest).的isanomaly函数标识分数高于阈值的观测值(Mdl。ScoreThreshold)作为新奇事物。

[tfTest_OCSVM,sTest_OCSVM] = isanomaly(Mdl,XTest);

isanomaly函数返回异常指示器(tfTest_OCSVM)和异常分数(sTest_OCSVM)下载测试数据。

得分值的直方图。在分数阈值处创建一条垂直线。

图直方图(s_OCSVM正常化=“概率”)举行直方图(sTest_OCSVM正常化=“概率”)参照线(Mdl。ScoreThreshold,“k -”...加入([“阈值= "Mdl.ScoreThreshold]))传说(“训练数据”“测试数据”位置=“东南”)标题(单类支持向量机异常值直方图)举行

图中包含一个轴对象。标题为Histograms of Anomaly Scores for One-Class SVM的坐标轴对象包含3个直方图类型的对象,constantline。这些对象表示训练数据、测试数据。

显示试验数据中异常的观测指标。

idx_OCSVM = find(tfTest_OCSVM)
idx_OCSVM = 0x1空双列向量

测试数据的异常分分布与训练数据的异常分分布相似,因此isanomaly在测试数据中未检测到任何异常。

Mahalanobis距离

使用robustcov函数来计算训练数据的马氏距离,并使用pdist2函数来计算测试数据的马氏距离。

计算马氏距离XTrain的分布XTrain通过使用robustcov函数。指定异常值的百分比(OutlierFraction)为0。

[sigma,mu,s_mahal] = robustcov(XTrain,OutlierFraction=0);

robustcov还返回协方差矩阵的估计值(σ)和mean (μ),你可以用它来计算测试数据的距离。

的最大值s_mahal作为新颖性检测的得分阈值。

S_mahal_threshold = max(s_mahal);

计算马氏距离XTest的分布XTrain通过使用pdist2函数。

sTest_mahal = pdist2(XTest,mu,“mahalanobis”σ);

获取的异常指标XTest

tfTest_mahal = sTest_mahal > s_mahal_threshold;

得分值的直方图。

图直方图(s_mahal正常化=“概率”);持有直方图(sTest_mahal正常化=“概率”);参照线(s_mahal_threshold“k -”...加入([“阈值= "s_mahal_threshold]))传说(“训练数据”“测试数据”位置=“东南”)标题(马氏距离直方图)举行

图中包含一个轴对象。标题为Histograms of Mahalanobis距离的axis对象包含3个直方图类型的对象,constantline。这些对象表示训练数据、测试数据。

检查测试数据中检测到的异常的比例。

NF_mahal = sum(tfTest_mahal)/NTest
NF_mahal = 8.3077e-05

显示试验数据中异常的观测指标。

idx_mahal = find(tfTest_mahal)
Idx_mahal = 3654

另请参阅

|||||||

相关的话题