2016-12-07 15:15:03 chencheng12077 阅读数 6293
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40480 人正在学习 去看看 唐宇迪

我们看看dl4j用无预训练的自编码网络来识别异常手写数字,常规数字重构错误低,异常数字重构错误高

public class MNISTAnomalyExample {

    public static void main(String[] args) throws Exception {

        //Set up network. 784 in/out (as MNIST images are 28x28).//设置网络,老套路,图片是28*28
        //784 -> 250 -> 10 -> 250 -> 784自编码各层节点数量是784,250,10,250,784,最后肯定只用前3层
        MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
                .seed(12345)
                .iterations(1)
                .weightInit(WeightInit.XAVIER)
                .updater(Updater.ADAGRAD)//更新器采用自动更改学习速率,梯度越大,学习率衰减越快,梯度越小,学习率衰减越慢,与以往梯度模之和的开平方成反比
                .activation("relu")
                .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
                .learningRate(0.05)
                .regularization(true).l2(0.0001)
                .list()
                .layer(0, new DenseLayer.Builder().nIn(784).nOut(250)
                        .build())
                .layer(1, new DenseLayer.Builder().nIn(250).nOut(10)
                        .build())
                .layer(2, new DenseLayer.Builder().nIn(10).nOut(250)
                        .build())
                .layer(3, new OutputLayer.Builder().nIn(250).nOut(784)
                        .lossFunction(LossFunctions.LossFunction.MSE)
                        .build())
                .pretrain(false).backprop(true)
                .build();

        MultiLayerNetwork net = new MultiLayerNetwork(conf);
        net.setListeners(Collections.singletonList((IterationListener) new ScoreIterationListener(1)));

        //Load data and split into training and testing sets. 40000 train, 10000 test//装载数据划分训练测试集,4w训练,1w测试
        DataSetIterator iter = new MnistDataSetIterator(100,50000,false);//手写数据迭代器,批大小100,5w是数据量,是否二值化否

        List<INDArray> featuresTrain = new ArrayList<>();
        List<INDArray> featuresTest = new ArrayList<>();
        List<INDArray> labelsTest = new ArrayList<>();

        Random r = new Random(12345);
        while(iter.hasNext()){//遍历
            DataSet ds = iter.next();
            SplitTestAndTrain split = ds.splitTestAndTrain(80, r);  //80/20 split (from miniBatch = 100)//80训练,20测试,最小批100
            featuresTrain.add(split.getTrain().getFeatureMatrix());//把训练数据的属性加载到数组,元素是INDArray

            DataSet dsTest = split.getTest();
            featuresTest.add(dsTest.getFeatureMatrix());//把测试数据的属性加载到数组,元素是INDArray

            INDArray indexes = Nd4j.argMax(dsTest.getLabels(),1); //Convert from one-hot representation -> index//把测试类别转变成类别向量模式,即one-hot描述

            labelsTest.add(indexes);//加载,这里多说一句,split本身就是个数组, split.getTrain().getFeatureMatrix()又是一层数组,featuresTrain.add又放到数组里,所以会是3层数组,而indexes本身比split.getTrain()少一层数组,所以labelsTest是两层数组


        }

        //Train model:
        int nEpochs = 30;
        for( int epoch=0; epoch<nEpochs; epoch++ ){//遍历步数
            for(INDArray data : featuresTrain){
                net.fit(data,data);//自编码网络原来这么简单,第一个data是输入数据,第二个是标签即还原自身属性
            }
            System.out.println("Epoch " + epoch + " complete");
        }

        //Evaluate the model on test data//测试集评估模型,计算每个数字除以样本数的得分,然后得分,数字,数据组成list,按得分排序,这就获得每个类型的最高和最低n个数字
        //Score each digit/example in test set separately
        //Then add triple (score, digit, and INDArray data) to lists and sort by score
        //This allows us to get best N and worst N digits for each type
        Map<Integer,List<Triple<Double,Integer,INDArray>>> listsByDigit = new HashMap<>();//搞一个hashmap
        for( int i=0; i<10; i++ ) listsByDigit.put(i,new ArrayList<Triple<Double,Integer,INDArray>>());//弄10个进去,因为是0-9

        int count = 0;
        for( int i=0; i<featuresTest.size(); i++ ){//遍历测试集的批
            INDArray testData = featuresTest.get(i);//测试属性
            INDArray labels = labelsTest.get(i);//测试标签
            int nRows = testData.rows();//每批有多少数据
            for( int j=0; j<nRows; j++){//遍历
                INDArray example = testData.getRow(j);//每个样本的属性
                int label = (int)labels.getDouble(j);//每个样本的标签
                double score = net.score(new DataSet(example,example));//评估自编码的得分
                listsByDigit.get(label).add(new ImmutableTriple<>(score, count++, example));//通过标签和数字的对应关系,装载hashmap,第二个值是自增计数
            }
        }

        //Sort data by score, separately for each digit//复写比较器,按评分排序
        Comparator<Triple<Double, Integer, INDArray>> c = new Comparator<Triple<Double, Integer, INDArray>>() {
            @Override
            public int compare(Triple<Double, Integer, INDArray> o1, Triple<Double, Integer, INDArray> o2) {
                return Double.compare(o1.getLeft(),o2.getLeft());
            }
        };

        for(List<Triple<Double, Integer, INDArray>> list : listsByDigit.values()){//遍历每个数字的values
            Collections.sort(list, c);//升序排列
        }

        //Select the 5 best and 5 worst numbers (by reconstruction error) for each digit//对每个数字,找出最好和最坏的5个数字,即重构错误
        List<INDArray> best = new ArrayList<>(50);
        List<INDArray> worst = new ArrayList<>(50);
        for( int i=0; i<10; i++ ){//遍历10个数
            List<Triple<Double,Integer,INDArray>> list = listsByDigit.get(i);
            for( int j=0; j<5; j++ ){
                best.add(list.get(j).getRight());//把属性放入最好的组
                worst.add(list.get(list.size()-j-1).getRight());//把属性放入最坏的组
            }
        }

        //Visualize the best and worst digits//可视化
        MNISTVisualizer bestVisualizer = new MNISTVisualizer(2.0,best,"Best (Low Rec. Error)");//调用可视化类,传入参数图片缩放2,数组,描述
        bestVisualizer.visualize();

        MNISTVisualizer worstVisualizer = new MNISTVisualizer(2.0,worst,"Worst (High Rec. Error)");//调用可视化类,传入参数图片缩放2,数组,描述

        worstVisualizer.visualize();
    }

    private static class MNISTVisualizer {//可视化类,成员有图片缩放倍数,数字数组,标题
        private double imageScale;
        private List<INDArray> digits;  //Digits (as row vectors), one per INDArray
        private String title;

        private MNISTVisualizer(double imageScale, List<INDArray> digits, String title ){//构造函数
            this.imageScale = imageScale;
            this.digits = digits;
            this.title = title;
        }

        public void visualize(){//可视化函数
            JFrame frame = new JFrame();//jframe实例化,添加标签,设置结束方式
            frame.setTitle(title);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JPanel panel = new JPanel();//底板实例化,
            panel.setLayout(new GridLayout(0,5));//将等长0行,5列的梯度布局放入底板

            List<JLabel> list = getComponents();//调用获取组件方法
            for(JLabel image : list){//遍历图片,并添加到底板
                panel.add(image);
            }

            frame.add(panel);//把底板添加到frame,设置可视,自适应

            frame.setVisible(true);
            frame.pack();
        }

        private List<JLabel> getComponents(){//调用组件方法
            List<JLabel> images = new ArrayList<>();
            for( INDArray arr : digits ){//遍历每个数字的数组
                BufferedImage bi = new BufferedImage(28,28,BufferedImage.TYPE_BYTE_GRAY);//构造缓冲图片
                for( int i=0; i<768; i++ ){//填充像素值
                    bi.getRaster().setSample(i % 28, i / 28, 0, (int)(255*arr.getDouble(i)));
                }
                ImageIcon orig = new ImageIcon(bi);//创建绘制对象
                Image imageScaled = orig.getImage().getScaledInstance((int)(imageScale*28),(int)(imageScale*28),Image.SCALE_REPLICATE);//图片放大2倍
                ImageIcon scaled = new ImageIcon(imageScaled);//新建绘制对象
                images.add(new JLabel(scaled));//加载
            }
            return images;//返回图片
        }
    }
}

2019-08-09 16:41:17 baishuo8 阅读数 501
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40480 人正在学习 去看看 唐宇迪
2019-03-21 11:16:29 u013006675 阅读数 2192
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40480 人正在学习 去看看 唐宇迪

前言

之前写的博客,一直没放出来,今天亮出来晒晒太阳。
深度学习时代的无监督异常行为检测,套路都非常单一,都是用生成式网络(包括自编码器,GAN等)来重构或简单地预测帧,然后通过比较重构误差和阈值来达到判断异常与否的目的。这一篇就是一个典型,不过工作做得蛮充足,效果也不错,值得学习。
本文出自上科大(上海科技大学)高盛华老师团队。code已放,写的很不错:https://github.com/stevenLiuWen/ano_pred_cvpr2018

Motivation

文章总有motivation,如果motivation不清晰,那么本文多半是个水文(狗头,狗头)。本文的Motivation很清晰,就是对于常见的AutoEncoder做异常行为检测,有个严重的潜在问题,就是AutoEncoder往往过完备(overcomplete),容易引起恒等映射,试想,在测试时候,正常样本本成功重构了,异常样本靠着恒等映射,也被成功“重构”(其实是成功复制)了,那还如何能把它们区分开呢?如果做一个很简单的改动,就是将重构当前帧改为预测后一帧或后几帧,是不是就能避免恒等映射的风险?这就是本文的出发点。那既然选择了预测,那GAN自然成了首选,作者为了保证GAN的生成质量,在优化函数上又下了一些功夫,下面来具体看看吧。

方法与网络框架:Future Frame Prediction Based Anomaly Detection Method

网络架构很清晰啦,输入是连续的tt帧(本文t=4t=4),送入一个生成器,生成第t+1t+1帧,为了保证生成质量,这里作者用了三个loss来约束,第一个loss就是简单的L2距离,保证对应像素之间尽可能相似:

第二个loss是梯度约束,就是保证生成图像的梯度和原图像梯度一致:
第三个loss是运动约束,就是保证生成图像能像真实图像一样,能和其前一帧图像之间产生一个正确的光流,这个还挺有新意,如下式,其中f代表光流生成算法,这里使用的是Flownet:

既然是GAN,那该判别器登场了,作者这里使用的是Least Square GAN。套路都差不多,即为了进一步使生成图像更逼真,引入判别器。对于判别器D,这里使用一个patch discriminator,训练D时,固定G参数,优化如下loss function,直白来说就是对真实图像II,让他分类为真,对生成图像I^\hat{I},让他分类为假,即通过训练,增加判别器的真假判别能力:

对于生成器,增加一个对抗loss,即想方设法骗过判别器,这里同样优化一个MSE loss,都没什么可说的:

那最后的loss function就明晰了,即交替训练以下两个loss function:

到这里网络框架的训练部分就介绍完了,下面说下怎么测试。前文也说了,就是比较预测误差,计算预测误差无非是比较生成(预测)的图像和真实图像之间的差别,作者这里采用的是图像处理领域常见的PSNR( Peak Signal to Noise Ratio,峰值信噪比),关于这一点,笔者也没有过多思考在异常行为检测领域究竟用哪个会比较好,如果你有想法,欢迎留言或发邮件交流。PSNR的具体表达式是:

最后,将每一个视频的PSNR归一化为0到1,方便计算整个数据集的AUC。

实验

作者在四个库上做了实验,CUHK Avenue,UCSD Ped1,UCSD Ped1以及ShanghaiTech。评价指标使用帧级别的AUC。

先比较SOTA,效果不错,如下表:

比较生成器部分,这里使用的gap指标指的是正常样本的平均得分(预测误差)和异常样本的平均得分之间的差,自然是越大越好,说明分的越开,如下表所示。

比较运动约束部分的效果,下表比较了有和没有之间的差异:

比较不同loss的效果,如下图所示,说明每个loss都起到了作用:

最后比较了和Autoencoder的效果提升,如下图所示,提升挺大:

最后的最后,呈现两个异常行为视频下的效果,感兴趣的话可以去作者GitHub上贴的那个youtube链接里看视频,这里我只贴图,不过多说明了,大家可以自己看。

总结

其实预测这个套路并不是本文第一个提出的,之前就有人这么做了,比如ACM MM里就有一篇:Spatio-Temporal AutoEncoder for Video Anomaly Detection,但时间间距特别短,作者在文中强调自己是第一篇,可能也是没问题的。但是深度学习下的异常行为检测这两年一直都停留在这种生成模型的套路中,小修小补,非常期待见到新的工作产生。

2019-05-20 22:45:51 qq_34439215 阅读数 906
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40480 人正在学习 去看看 唐宇迪

(持续更新中)

一、介绍

1.1 什么是网络入侵

网络入侵是指计算机网络上的任何未经授权的活动,例如,后面会讲到的KDDCup 1999数据集包含四类网络入侵行为:拒绝服务攻击(DoS)、用户到根用户攻击(U2R)、远程到本地攻击(R2L)和探测(Probing)。

1.2 网络入侵检测的方法

网络入侵检测采用的技术可分为特征检测异常检测两种。

特征检测方法基于对已有入侵方法的了解,用一系列特征或模式来表示入侵者活动,并通过检测主体活动是否满足这些特征来判断其是否在实施网络入侵行为。这种检测方法只能检测已知的攻击,而不能检测新型攻击,比如0-day攻击,但是这种方法在商用入侵检测系统中应用比较广泛。

异常检测方法将未知活动与正常活动进行对比,如果其超出正常活动的范围,即当其违反网络管理者设定的统计规律时,将其归类于网络入侵行为。

1.3 为什么要使用深度学习方法

机器学习在面部识别、语音识别等计算机科学领域有较为成功的应用,但是在入侵检测方面表现效果欠佳。深度学习的出现改变了这一局面,深度学习可以自动提取数据的高维特征并且发现数据间的关联。目前已经有了部分深度学习在入侵检测方面的成功应用。

二、研究背景

2.1 常用方法

2.1.1 RBM(受限玻尔兹曼机)

受限玻尔兹曼机(restricted Boltzmann machine, RBM)是一种可通过输入数据集学习概率分布的随机生成神经网络。RBM主要用来对BP神经网络进行预训练或对数据进行编码(重构,reconstruction)。受限玻尔兹曼机是玻尔兹曼机(Boltzman machine,BM)的一种特殊拓扑结构。玻尔兹曼机中可见单元和隐藏单元之间是连接的,因此学习速度缓慢,受限玻尔兹曼机中,只有可见单元和隐藏单元之间存在连接。权重矩阵 W=(w_i_,_j) 中的每个元素指定了隐层单元 h_j 和可见层单元 v_i 之间边的权重。此外对于每个可见层单元 v_i 有偏置 a_i ,对每个隐层单元  h_j 有偏置 b_j 。可见单元和隐藏单元之间的能量公式定义为(其中 v_ih_j 表示可见单元和隐藏单元的二元状态,nm 表示可见单元和隐藏单元的个数):

 可见层和隐藏层的联合分布为:

其中Z为:

条件概率的计算公式(其中 \sigma 是sigmoid函数):

 调整RBM参数的目标是最大化观测数据的似然函数 P(v)

2.1.2 DBN(深度置信网络)

DBN是RBM堆叠的深度神经网络。 DBN 在训练模型的过程分为两步,先分别单独无监督地训练每一层 RBM,然后BP 网络接收 RBM 的输出特征向量作为它的输入特征向量,有监督地训练BP网络,最后BP网络还将错误信息传播至每一层 RBM,微调整个 DBN 网络。

 

2.1.3 DNN(深度神经网络)

DNN基于MLP(深层感知机),DNN的权重是全连接的,并且通过无监督学习或预训练提前训练网络参数。DNN最大的缺点是其计算复杂度很高。

2.1.4 AutoEncoder(自编码器)

自编码器是神经网络的一种,包含编码器、隐藏层和解码器,用来将输入数据编码成一种新的形式再将其解码。自编码器是一种无监督学习,使用反向传播算法来训练网络使得输出等于输入。自编码器传统上通常被用来进行数据降维和特征学习。

2.1.5 RNN(循环神经网络)

这种网络的本质特征是在处理单元之间既有前馈连接又有后馈连接,可以用来处理序列数据,比如时间序列数据、空间序列数据、文字序列数据等,这些序列数据是传统的前馈神经网络(DNN、CNN等)所难以处理的。

2.2 基准数据集(benchmark)

在网络入侵检测等网络流量分析工作中,用的最多的数据集是KDDCup 1999和NSL-KDD,NSL-KDD是KDDCup 1999的改进版,解决了其大量数据冗余等问题。KDD数据集存在一定的问题,例如攻击类型的分布存在可疑性,是在基于Solaris的操作系统收集数据的。但是这两个数据集在研究中还是被广泛使用,因为已经有许多前人的工作都是基于这两个数据集,使用这两个数据集可以方便的与他人的工作进行对比。除了这两个数据集外,还有PREDICT(未标注)、CAIDA(未标注)、DEFCON(大部分是入侵流)等数据集。下面是NSL-KDD数据集包含的文件:

三、研究现状

3.1 RBM

ALRAWASHDEH等[1]使用单隐藏层RBM来进行无监督的特征减少, RBM权重被传递给另一个RBM,产生深度信念网络。预训练的权重被传递到一个多类soft-max的Logistic回归(LR)分类器。作者称其检测率为97.90%,假阴性率为2.47%。

3.2 DBN

SALAMA等[2]介绍了一种结合了深度信念网络和支持向量机的优点的混合方案,该方案首先用DBN对数据特征进行降维,再使用SVM对数据进行分类。KANG和KANG[3]利用DBN与训练和DNN模型实现了车载网络的入侵检测系统,其数据集是自行模拟生成的,作者称平均检测率达到98%。

3.3 DNN

TANG等[4]利用DNN进行基于流的异常检测,使用的是NSL-KDD六个最基本的在SDN网络中最容易获取的特征,因此其检测准确度较低,但实验结果表明它比传统的朴素贝叶斯、支持向量机、决策树方法的准确度更高。KIM等[5]使用10%的KDDCup 99数据集进行预处理并创建DNN模型。然后使用整个KDD数据集来验证该DNN模型,作者称平均准确率达到了99%,并指出更好地应对DDoS攻击需要使用RNN和LSTM模型。

3.4 AutoEncoder

JAVAID 等[6]提出了一种基于稀疏自编码器和soft-max回归模型的自学习NIDS,使用的是NSL-KDD数据集。其被证明在整体检测效果上比SML(soft-max regression)好。NIYAZ等[7]使用堆叠的自编码器(SAE)实现了一个面向SDN网络的DDoS检测系统,其二分类准确率为99.82%,检测具体攻击类型时8分类准确度为95.65%。作者提出在未来将使用数据包头的原始字节来提取特征。SHONE 等[8]提出了非对称深度自动编码器(NDAE),用于无监督特征学习。作者使用堆叠的NDAE和随机森林算法,称所提出的模型可将精度提高5%,训练时间缩短98.81%。

3.5 RNN

TANG等[9]提出了一种用于SDN的门控循环单元递归神经网络(GRU-RNN)入侵检测系统,使用六个基本的特征实现了89%的准确度,被证明由于DNN 和VanilaRNN。KIM等[10]将长短期记忆(LSTM)架构应用于递归神经网络(RNN),并从KDD Cup 99数据集提取生成训练集训练IDS模型,准确度为96.93%,误报率为10.04%。KHAN 等[11]介绍了一种基于Spark ML和Conv-LSTM网络的IDS,使用的是ISCX-UNB数据集,预测准确度为97.29%,误报率为0.71。

四、研究趋势

4.1 现有研究方法的不足

 

4.2 未来研究方向

 

参考文献

[1]ALRAWASHDEH K, PURDY C. Toward an Online Anomaly Intrusion Detection System Based on Deep Learning[C]//2016 15th IEEE International Conference on Machine Learning and Applications (ICMLA). Anaheim, CA, USA: IEEE, 2016: 195–200.

[2]SALAMA M A, EID H F, RAMADAN R A, 等. Hybrid Intelligent Intrusion Detection Scheme[G]//GASPAR-CUNHA A, TAKAHASHI R, SCHAEFER G, 等. Soft Computing in Industrial Applications. Berlin, Heidelberg: Springer Berlin Heidelberg, 2011, 96: 293–303.

[3]KANG M-J, KANG J-W. Intrusion Detection System Using Deep Neural Network for In-Vehicle Network Security[J]. TANG T. PLOS ONE, 2016, 11(6): e0155781.

[4]TANG T A, MHAMDI L, MCLERNON D, 等. Deep learning approach for Network Intrusion Detection in Software Defined Networking[C]//2016 International Conference on Wireless Networks and Mobile Communications (WINCOM). 2016: 258–263.

[5] JIN KIM, NARA SHIN, JO S Y, 等. Method of intrusion detection using deep neural network[C]//2017 IEEE International Conference on Big Data and Smart Computing (BigComp). 2017: 313–316.

[6] JAVAID A, NIYAZ Q, SUN W, 等. A Deep Learning Approach for Network Intrusion Detection System[C]//Proceedings of the 9th EAI International Conference on Bio-inspired Information and Communications Technologies (formerly BIONETICS). New York City, United States: ACM, 2016.

[7]NIYAZ Q, SUN W, JAVAID A Y. A Deep Learning Based DDoS Detection System in Software-Defined Networking (SDN)[J]. ICST Transactions on Security and Safety, 2017, 4(12): 153515.

[8]SHONE N, NGOC T N, PHAI V D, 等. A Deep Learning Approach to Network Intrusion Detection[J]. IEEE Transactions on Emerging Topics in Computational Intelligence, 2018, 2(1): 41–50.

[9]TANG T A, MHAMDI L, MCLERNON D, 等. Deep Recurrent Neural Network for Intrusion Detection in SDN-based Networks[C]//2018 4th IEEE Conference on Network Softwarization and Workshops (NetSoft). Montreal, QC: IEEE, 2018: 202–206.

[10]KIM J, KIM J, THU H L T, 等. Long Short Term Memory Recurrent Neural Network Classifier for Intrusion Detection[C]//2016 International Conference on Platform Technology and Service (PlatCon). 2016: 1–5.

[11]KHAN M A, KARIM Md R, KIM Y. A Scalable and Hybrid Intrusion Detection System Based on the Convolutional-LSTM Network[J]. Symmetry, 2019, 11(4): 583.

2018-08-06 23:12:21 yuanlulu 阅读数 1004
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40480 人正在学习 去看看 唐宇迪

概述

本笔记整理自网易云课堂吴恩达的《机器学习》。

吴恩达所讲的异常检测属于无监督学习。即利用已有的无标签数据求取样本的分布模型参数(正太分布参数),然后对新来的数据计算属于这个分布的概率,当概率大于一个阈值时认为测数据是正常的,否则认为是异常数据。

(由于插入图片和公式不方便,本文没有图片和公式)

异常检测的一些场景

工程诊断(发动机异常检测)、异常行为检测、数据中心硬件监控等。

和监督学习的比较

上面说了,异常检测属于无监督学习。意味着样本没有标注,或者是有噪音的。在选择是否采用监督学习算法还是异常检测时,有些原则可以参考。

适用异常检测的场景如下:

  • 当正样本很少、负样本很多时
  • 异常的种类太多,算法无法从样本中学习正样本的规律,或者以后的异常和当前的异常样本有较大差异
适用异常检测的一些领域:
  • 欺诈检测、发动机异常检测和数据中心设备监控

适用监督学习的场景如下:

  • 当正负样本都很多
  • 有足够的正样本用于学习,并且后续的异常和当前的异常样本很像
适用监督学习的一些领域:
  • 垃圾邮件筛选、天气预报、癌症筛查

异常检检测的错误分析

特征映射

当数据不是严格的高斯分布时,使用异常检测算法也不会有太大问题。

当数据和高斯分布差别比较大时,可以转化为接近高斯分布。转换的方式就是对特征值适用一个公式进行映射,比如log或者其他公式。

错误分析

我们期望:正常样本的p(X)很大,异常样本的p(X)很小。

但是更一般的情况是,正负样本的p(X)都很大。这时我们可能要试着增加一些特征,把正负样本分开。

多元高斯

普通高斯在二维上定义的区域是一个椭圆,而且每个维度上都轴对称,这并不符合很多样本的分布规律,因此引入多元高斯。多元高斯分布不再独立的处理每个特征的概率,而是把这些特征放到一个公式里来。

可以改变多元高斯的参数(协方差矩阵),使得在某些维度上变宽和变窄。

也可以调整参数,使多元高斯分布的走向改变(变倾斜)。

但是,原始高斯模型比多元高斯模型更常用(吴恩达说的,我也每用过)。

原始高斯模型具有以下特点:
- 往往需要手工增加一些特征值(使用其它特征组合而来)来捕捉异常
- 相对多元高斯,原始高斯计算量更小
- 即使训练集很小也能良好工作

多元高斯的特点:
- 能自动捕捉特征之间的关系(不用人工合成新特征)
- 计算量相对原始高斯比较大(协方差矩阵是nXn的)
- 样本数量必须大于特征数量,并且sigam必须可逆(如果sigma不可逆,可能是m小于n了,或者有一些冗余特征,当然这种情况很小)。吴恩达建议n>10m时使用多元高斯

代码实现

sklearn中提供了一种基于正太分布的异常检测算法:Fitting an elliptic envelope(椭圆模型拟合)。具体代码可以参考前面的一篇文章。

这种算法和吴恩达讲的多元高斯比较接近。但是算法对于后续样本输出的不是概率,而是布尔类型,因为政府样本的分界在训练样本的时候就决定了。

行为识别模型探索

阅读数 331

没有更多推荐了,返回首页