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

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

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

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)
.activation("relu")
.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

DataSet dsTest = split.getTest();

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

}

//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));//评估自编码的得分
}
}

//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++ ){
}
}

//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){//遍历图片,并添加到底板
}

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);//新建绘制对象
}
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 人正在学习 去看看 唐宇迪

# 总结

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

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

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

# 二、研究背景

## 2.1 常用方法

### 2.1.1 RBM（受限玻尔兹曼机）

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

调整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最大的缺点是其计算复杂度很高。

# 三、研究现状

## 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。

# 参考文献

[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 人正在学习 去看看 唐宇迪

# 概述

（由于插入图片和公式不方便，本文没有图片和公式）

# 和监督学习的比较

### 适用异常检测的场景如下：

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

### 适用监督学习的场景如下：

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

# 多元高斯

- 往往需要手工增加一些特征值（使用其它特征组合而来）来捕捉异常
- 相对多元高斯，原始高斯计算量更小
- 即使训练集很小也能良好工作

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

# 代码实现

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