基于MATLAB编程的孤立森林异常数据检测(代码完整,数据齐全)

目录

摘要
简介
孤立森林定义
孤立森林基本思想
基于孤立森林异常数据检测的代码
结果分析
完整代码下载:基于孤立森林的异常数据检测,基于孤立森林的目标检测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88740408

摘要

孤立森林简介,孤立森林原理,孤立森林公式,基于孤立森林的异常数据检测,基于孤立森林的目标检测

简介:

孤立森林算法是一种适用于连续数据的无监督异常检测方法,由南京大学周志华教授等人于2008年首次提出,之后又于2012年提出了改进版本。与其他异常检测算法通过距离,密度等量化指标来刻画样本间的疏离程度不同,孤立森林算法通过对样本点的孤立来检测异常值。具体来说,该算法利用一种名为孤立树的二叉搜索树结构来孤立样本。由于异常值的数量较少且与大部分样本的疏离性,因此,异常值会被更早的孤立出来,也即异常值会距离的根节点更近,而正常值则会距离根节点有更远的距离。此外,相较于LOF,K-means等传统算法,孤立森林算法对高纬数据有较好的鲁棒性。

孤立森林定义:
我们先给出孤立树(Isolation Tree)和样本点在孤立树中的路径长度的定义

孤立树:若为孤立树的一个节点,存在两种情况:没有子节点的外部节点,有两个子节点和一个test的内部节点。在的test由一个属性和一个分割点组成,的点属于,反之属于。

样本点在孤立树中的路径长度:样本点从的根节点到叶子节点经过的边的数量

孤立森林基本思想:

从下图我们可以直观的看到,相对更异常的只需要4次切割就从整体中被分离出来,而更加正常的点经过了11次分割才从整体中分离出来。这也体现了孤立森林算法的基本思想。(ps:图片来自原论文)
Isolation_Forest_show.jpeg
算法介绍:
下面,我们来详细介绍孤立森林算法。该算法大致可以分为两个阶段,第一个阶段我们需要训练出颗孤立树,组成孤立森林。随后我们将每个样本点带入森林中的每棵孤立树,计算平均高度,之后再计算每个样本点的异常值分数。

Step1: 为给定数据集, ,从中随机抽取个样本点构成的子集放入根节点。
Step2:从个维度中随机指定一个维度,在当前数据中随机产生一个切割点,。
Step3:此切割点生成了一个超平面,将当前数据空间划分为两个子空间:指定维度小于p的样本点放入左子节点,大于或等于p的放入右子节点。
Step4:递归Step2和Step3,直至所有的叶子节点都只有一个样本点或者孤立树 已经达到指定的高度。
Step5:循环Step1至Step4,直至生成个孤立树

第二阶段:
Step1: 对于每一个数据点,令其遍历每一颗孤立树,计算点在森林中的平均高度,对所有点的平均高度做归一化处理。异常值分数的计算公式如下所示:

在这里插入图片描述

基于孤立森林异常数据检测的代码

clc
clear
close all
%% load data
data=xlsread(‘异常数据实例3.0.xlsx’);
output=data(:,end);
input0=data(:,1:end-1);
input = mapminmax(input0’,-1,1)‘;
% input = zeros(length(output),3);
% for ii = 1:length(output)
% input(ii,:) = input(ii:ii+2)’;
% end

% plot(input,‘k-’)
% hold on
% plot(output,‘r-’)
ite = 5; %
numtr = 100; %
numsub = 256; %
dim = size(input, 2); %
auc = zeros(ite, 1);
mtime = zeros(ite, 2);
rseed = zeros(ite, 1);
scorez = zeros(ite,length(output));
for r = 1:ite
disp(['rounds ', num2str®, ‘:’]);

rseed(r) = sum(100 * clock);
score0 = - mean(Mass, 2);
score = mapminmax(score0',0,1);
scorez(r,:) =score ;
auc(r) = Measure_AUC(score0, output);
disp(['auc = ', num2str(auc(r)), '.']);

% [,,~,AUClog®] = perfcurve(logical(ADLabels),Score,‘true’);
end
simout = mean(scorez);
auc_results = [mean(auc), std(auc)] % average AUC over 10 trials
figure
plot(output,‘k*’)
hold on
stem(score,‘ro’)
hold on
plot(input)
hold off
ylabel(‘异常值’)
legend(‘实际值’,‘孤立森林检测值’,‘输入值分布规律’)

jieguo = [];
for ii = 1:length(score)
if score(ii)>0.5
jieguo = [jieguo;ii data(ii,1)];
end
end
figure
stem(score,‘bo’)
hold on
plot(data(:,1),‘k-’)
hold on
plot(jieguo(:,1),jieguo(:,2),‘ro’)
hold off

legend(‘异常值得分’,‘输入值分布规律’,‘孤立森林检测异常值’)

scorez=round(score+0.14)';
zhunquevl = sum(scorezoutput)/length(output)
pan1 = scorez
output;
xx=0;
for ii = 1:length(pan1)
if output(ii)==1
if pan1(ii)==1
xx=xx+1;
end
end
end
zhunquelv2 = xx/sum(output)

%% Plot AUC based on last trial

[Xlog,Ylog,Tlog,AUClog] = perfcurve(logical(output),score,‘true’);
figure
plot(Xlog,Ylog)
xlabel(‘假阳性率’);
ylabel(‘真阳性率’);
title(‘AUC’)

结果分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

展望

孤立森林适合异常数据检测,在不均衡样本应用方面,有较强的优势

参考

百度

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神经网络机器学习智能算法画图绘图

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值