无监督异常检测
本主题介绍了统计和机器学习工具箱™中用于多变量样本数据的无监督异常检测功能,并描述了该功能的工作流程异常值检测(检测训练数据中的异常)和新奇的检测(用未受污染的训练数据检测新数据中的异常)。
对于未标记的多元样本数据,可以使用隔离森林、局部离群因子、一类支持向量机(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]))标题(隔离林异常分值直方图)
检查数据中检测到的异常的比例。
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]))标题(局部离群因子异常值直方图)
检查数据中检测到的异常的比例。
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]))标题(“单类支持向量机异常得分直方图”)
检查数据中检测到的异常的比例。
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 (“健壮的距离”)传说(“正常点”,“局外人”位置=“西北”)标题(“距离是阴谋”)
放大坐标轴可以看到正点。
Xlim ([0 10]) ylim([0 10])
如果数据集遵循多元正态分布,则数据点紧密地聚集在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 =“北”;
四种方法识别的新奇之处在减少的维度上彼此靠近。计算四种方法返回相同标识符的数据的百分比。
意思是((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))))
新奇的检测
本例说明了四种无监督异常检测方法(隔离森林、局部离群因子、一类支持向量机和马氏距离)新颖性检测的工作流程。
加载数据
加载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]))传说(“训练数据”,“测试数据”位置=“东南”)标题(隔离林异常分值直方图)举行从
测试数据的异常分分布与训练数据的异常分分布相似,因此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]))传说(“训练数据”,“测试数据”位置=“东南”)标题(局部离群因子异常值直方图)举行从
测试数据的异常分分布与训练数据的异常分分布相似,因此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]))传说(“训练数据”,“测试数据”位置=“东南”)标题(单类支持向量机异常值直方图)举行从
显示试验数据中异常的观测指标。
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]))传说(“训练数据”,“测试数据”位置=“东南”)标题(马氏距离直方图)举行从
检查测试数据中检测到的异常的比例。
NF_mahal = sum(tfTest_mahal)/NTest
NF_mahal = 8.3077e-05
显示试验数据中异常的观测指标。
idx_mahal = find(tfTest_mahal)
Idx_mahal = 3654
另请参阅
iforest
|isanomaly (IsolationForest)
|lof
|isanomaly (LocalOutlierFactor)
|ocsvm
|isanomaly (OneClassSVM)
|robustcov
|pdist2
相关的话题
- 使用隔离林进行异常检测
- 模型特定的异常检测
- 基于三轴振动数据的工业机械异常检测(预测性维护工具箱)