无监督异常检测之卷积AE和卷积VAE

尝试用卷积AE和卷积VAE做无监督检测,思路如下:

1.先用正常样本训练AE或VAE

2.输入测试集给AE或VAE,获得重构的测试集数据。

3.计算重构的数据和原始数据的误差,如果误差大于某一个阈值,则此测试样本为一样。

对于数据集的描述如下:

本数据集一共有10100个样本,每个样本是1行48列的向量,为了让它变成矩阵,自己在末尾补了一个0,将其转变成7*7的矩阵。前8000个是正常样本。后2100个中,前300个是正常样本,之后的1800个中包括6种异常时间序列,每种异常时间序列包括300个样本。

VAE的代码如下:

#https://blog.csdn.net/wyx100/article/details/80647379
‘‘‘This script demonstrates how to build a variational autoencoder
with Keras and deconvolution layers.
使用Keras和反卷积层建立变分自编码器演示脚本
# Reference
- Auto-Encoding Variational Bayes
  自动编码变分贝叶斯
  https://arxiv.org/abs/1312.6114
‘‘‘
from __future__ import print_function

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
from pandas import read_csv
from keras.layers import Input, Dense, Lambda, Flatten, Reshape
from keras.layers import Conv2D, Conv2DTranspose
from keras.models import Model
from keras import backend as K
from keras import metrics
import xlwt
from keras.datasets import mnist
from matplotlib import pyplot
import numpy
# input image dimensions
# 输入图像维度
img_rows, img_cols, img_chns = 7, 7, 1
dimension_image=7
# number of convolutional filters to use
# 使用的卷积过滤器数量
filters = 64
# convolution kernel size
# 卷积核大小
num_conv = 3

batch_size = 50
if K.image_data_format() == ‘channels_first‘:
    original_img_size = (img_chns, img_rows, img_cols)
else:
    original_img_size = (img_rows, img_cols, img_chns)
latent_dim = 2
intermediate_dim = 128
epsilon_std = 1.0
epochs = 100

x = Input(shape=original_img_size)
conv_1 = Conv2D(img_chns,
                kernel_size=(2, 2),
                padding=‘same‘, activation=‘relu‘)(x)
conv_2 = Conv2D(filters,
                kernel_size=(2, 2),
                padding=‘same‘, activation=‘relu‘,
                strides=(2, 2))(conv_1)
conv_3 = Conv2D(filters,
                kernel_size=num_conv,
                padding=‘same‘, activation=‘relu‘,
                strides=1)(conv_2)
conv_4 = Conv2D(filters,
                kernel_size=num_conv,
                padding=‘same‘, activation=‘relu‘,
                strides=1)(conv_3)
flat = Flatten()(conv_4)
hidden = Dense(intermediate_dim, activation=‘relu‘)(flat)

z_mean = Dense(latent_dim)(hidden)
z_log_var = Dense(latent_dim)(hidden)

def sampling(args):
    z_mean, z_log_var = args
    epsilon = K.random_normal(shape=(K.shape(z_mean)[0], latent_dim),
                              mean=0., stddev=epsilon_std)
    return z_mean + K.exp(z_log_var) * epsilon

# note that "output_shape" isn‘t necessary with the TensorFlow backend
# so you could write `Lambda(sampling)([z_mean, z_log_var])`
# 注意,“output_shape”对于TensorFlow后端不是必需的。因此可以编写Lambda(sampling)([z_mean, z_log_var])`
z = Lambda(sampling, output_shape=(latent_dim,))([z_mean, z_log_var])

# we instantiate these layers separately so as to reuse them later
# 分别实例化这些层,以便在以后重用它们。
number=4
decoder_hid = Dense(intermediate_dim, activation=‘relu‘)
decoder_upsample = Dense(filters * number * number, activation=‘relu‘)

if K.image_data_format() == ‘channels_first‘:
    output_shape = (batch_size, filters, number, number)
else:
    output_shape = (batch_size, number, number, filters)

decoder_reshape = Reshape(output_shape[1:])
decoder_deconv_1 = Conv2DTranspose(filters,
                                   kernel_size=num_conv,
                                   padding=‘same‘,
                                   strides=1,
                                   activation=‘relu‘)
decoder_deconv_2 = Conv2DTranspose(filters,
                                   kernel_size=num_conv,
                                   padding=‘same‘,
                                   strides=1,
                                   activation=‘relu‘)
if K.image_data_format() == ‘channels_first‘:
    output_shape = (batch_size, filters, 13, 13)
else:
    output_shape = (batch_size,13, 13, filters)
decoder_deconv_3_upsamp = Conv2DTranspose(filters,
                                          kernel_size=(3, 3),
                                          strides=(2, 2),
                                          padding=‘valid‘,
                                          activation=‘relu‘)
decoder_mean_squash = Conv2D(img_chns,
                             kernel_size=3,
                             padding=‘valid‘,
                             activation=‘sigmoid‘)

hid_decoded = decoder_hid(z)
up_decoded = decoder_upsample(hid_decoded)
reshape_decoded = decoder_reshape(up_decoded)
deconv_1_decoded = decoder_deconv_1(reshape_decoded)
deconv_2_decoded = decoder_deconv_2(deconv_1_decoded)
x_decoded_relu = decoder_deconv_3_upsamp(deconv_2_decoded)
x_decoded_mean_squash = decoder_mean_squash(x_decoded_relu)

# instantiate VAE model
# 实例化VAE模型
vae = Model(x, x_decoded_mean_squash)
# Compute VAE loss
# 计算VAE损失
xent_loss = img_rows * img_cols * metrics.binary_crossentropy(
    K.flatten(x),
    K.flatten(x_decoded_mean_squash))
kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
vae_loss = K.mean(xent_loss + kl_loss)
vae.add_loss(vae_loss)
vae.compile(optimizer=‘Adam‘)
vae.summary()

dataset = read_csv(‘randperm_zerone_Dataset.csv‘)
values = dataset.values
XY= values
n_train_hours1 =7000
n_train_hours3 =8000
x_train=XY[:n_train_hours1,:]
x_valid =XY[n_train_hours1:n_train_hours3, :]
x_test =XY[n_train_hours3:, :]
x_train=x_train.reshape(-1,dimension_image,dimension_image,1)
x_valid=x_valid.reshape(-1,dimension_image,dimension_image,1)
x_test=x_test.reshape(-1,dimension_image,dimension_image,1)

history=vae.fit(x_train,
                shuffle=True,
                epochs=epochs,
                batch_size=batch_size,
                validation_data=(x_valid, None))
pyplot.plot(history.history[‘loss‘], label=‘train‘)
pyplot.plot(history.history[‘val_loss‘], label=‘valid‘)
pyplot.legend()
pyplot.show()

# 建立一个潜在空间输入模型
encoder = Model(x, z_mean)
# 在潜在空间中显示数字类的2D图
x_test_encoded = encoder.predict(x_test, batch_size=batch_size)
plt.figure(figsize=(6, 6))
plt.scatter(x_test_encoded[:, 0], x_test_encoded[:, 1])
plt.show()

Reconstructed_train = vae.predict(x_train)
Reconstructed_valid = vae.predict(x_valid)
Reconstructed_test  = vae.predict(x_test)
ReconstructedData1=np.vstack((Reconstructed_train,Reconstructed_valid))
ReconstructedData2=np.vstack((ReconstructedData1,Reconstructed_test))
ReconstructedData3=ReconstructedData2.reshape((ReconstructedData2.shape[0], -1))

numpy.savetxt("ReconstructedData.csv", ReconstructedData3, delimiter=‘,‘)

AE代码如下

from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D
from keras.models import Model
from keras import backend as K
import numpy as np
from pandas import read_csv
from matplotlib import pyplot
import numpy

dimension_image=7
input_img = Input(shape=(dimension_image, dimension_image, 1))  # adapt this if using `channels_first` image data format
x = Conv2D(16, (3, 3), activation=‘relu‘, padding=‘same‘)(input_img)
x = MaxPooling2D((2, 2), padding=‘same‘)(x)
x = Conv2D(8, (3, 3), activation=‘relu‘, padding=‘same‘)(x)
x = MaxPooling2D((2, 2), padding=‘same‘)(x)
x = Conv2D(8, (3, 3), activation=‘relu‘, padding=‘same‘)(x)
encoded = MaxPooling2D((2, 2), padding=‘same‘)(x)

# at this point the representation is (4, 4, 8) i.e. 128-dimensional
x = Conv2D(8, (3, 3), activation=‘relu‘, padding=‘same‘)(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation=‘relu‘, padding=‘same‘)(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation=‘relu‘, padding=‘same‘)(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (2, 2), activation=‘sigmoid‘)(x)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer=‘adadelta‘, loss=‘binary_crossentropy‘)
autoencoder.summary()

dataset = read_csv(‘randperm_zerone_Dataset.csv‘)
values = dataset.values
XY= values
n_train_hours1 =7000
n_train_hours3 =8000
x_train=XY[:n_train_hours1,:]
x_valid =XY[n_train_hours1:n_train_hours3, :]
x_test =XY[n_train_hours3:, :]
x_train=x_train.reshape(-1,dimension_image,dimension_image,1)
x_valid=x_valid.reshape(-1,dimension_image,dimension_image,1)
x_test=x_test.reshape(-1,dimension_image,dimension_image,1)

history=autoencoder.fit(x_train, x_train,
                        epochs=200,
                        batch_size=32,
                        shuffle=True,
                        validation_data=(x_valid, x_valid))
pyplot.plot(history.history[‘loss‘], label=‘train‘)
pyplot.plot(history.history[‘val_loss‘], label=‘valid‘)
pyplot.legend()
pyplot.show()
Reconstructed_train = autoencoder.predict(x_train)
Reconstructed_valid = autoencoder.predict(x_valid)
Reconstructed_test  = autoencoder.predict(x_test)
ReconstructedData1=np.vstack((Reconstructed_train,Reconstructed_valid))
ReconstructedData2=np.vstack((ReconstructedData1,Reconstructed_test))
ReconstructedData3=ReconstructedData2.reshape((ReconstructedData2.shape[0], -1))

numpy.savetxt("ReconstructedData.csv", ReconstructedData3, delimiter=‘,‘)

至于数据集,正在上传到百度文库,以后更新

原文地址:https://www.cnblogs.com/nanhaijindiao/p/11566725.html

时间: 2024-10-12 14:13:25

无监督异常检测之卷积AE和卷积VAE的相关文章

无监督异常检测之LSTM组成的AE

我本来就是处理时间序列异常检测的,之前用了全连接层以及CNN层组成的AE去拟合原始时间序列,发现效果不佳.当利用LSTM组成AE去拟合时间序列时发现,拟合的效果很好.但是,利用重构误差去做异常检测这条路依旧不通,因为发现异常曲线的拟合效果也很好……算了,这次先不打算做时间序列异常检测了.在这里把“基于LSTM的auto-encoder”的代码分享出来. 代码参考了Jason Brownlee大佬修改的:具体链接我找不到了,当他的博客我还能找到,感兴趣自己翻一翻,记得在LSTM网络那一章 http

异常检测及欺诈

一.无监督异常检测模型   1.在线流数据异常检测(iforest隔离森林算法) 该方法的主要思想是,通过随机选定样本属性及其值将样本空间进行随机划分,分割的过程可以看成类似于随机森林中树建立的过程,对于新的样本,基于建立的隔离树求其分割深度,深度值越小,表明越容易被隔离,也就意味着异常的概率越大:反之则为正常样本.该方法是基于异常数据"少且不同"的特征,来采用随机隔离的思想设计异常检查. 该方法的主要优点是,在构建初始模型时不需要任何实际的数据,从而能快速构建初始探测模型,它符合数据

异常检测 | 使用孤立森林 sklearn.ensemble.IsolationForest 分析异常流量

孤立森林 Isolation Forest(sklearn.ensemble.IsolationForest):一种适用于 连续数据 的 无监督 异常检测方法.与随机森林类似,都是高效的集成算法,相较于LOF,K-means等传统算法,该算法鲁棒性高且对数据集的分布无假设. Isolation Forest算法做非监督式的异常点检测分析,对数据特征的要求宽松: 该算法对特征的要求低,不需要做离散化,不需要数值标准化 不需要考虑特征间的关系(例如共线性)等,不需要额外做特征过滤和筛选 附:SKle

基于机器学习的web异常检测

基于机器学习的web异常检测 Web防火墙是信息安全的第一道防线.随着网络技术的快速更新,新的黑客技术也层出不穷,为传统规则防火墙带来了挑战.传统web入侵检测技术通过维护规则集对入侵访问进行拦截.一方面,硬规则在灵活的黑客面前,很容易被绕过,且基于以往知识的规则集难以应对0day攻击:另一方面,攻防对抗水涨船高,防守方规则的构造和维护门槛高.成本大. 基于机器学习技术的新一代web入侵检测技术有望弥补传统规则集方法的不足,为web对抗的防守端带来新的发展和突破.机器学习方法能够基于大量数据进行

Andrew Ng-ML-第十六章-异常检测

1.问题动机 图1.飞机发动机检测例子 对飞机引擎的例子,如果选取了两个特征x1热量产生度,x2震动强度.并得到如下的图,如果有一个新的引擎来检测其是否正常,x_test,那么此时如果点落在和其他点正常内,那么就显示是正常,不需要进一步的检测,但是如果在右下角绿色的,那么就是异常的,需要进一步地检测. 图1.密度检测 更一般地建立模型,当x_test输入时,若概率<阈值ε,那么就被设置为异常:否则设置为正常.如图来看,中心部分的概率大,四周部分概率小. 图2.异常检测的应用 异常检测最常见的应用

Auto Encoder用于异常检测

对基于深度神经网络的Auto Encoder用于异常检测的一些思考 from:https://my.oschina.net/u/1778239/blog/1861724 一.前言 现实中,大部分数据都是无标签的,人和动物多数情况下都是通过无监督学习获取概念,故而无监督学习拥有广阔的业务场景.举几个场景:网络流量是正常流量还是攻击流量.视频中的人的行为是否正常.运维中服务器状态是否异常等等.有监督学习的做法是给样本标出label,那么标label的过程肯定是基于某一些规则(图片除外),既然有了规则

异常检测综述

原文地址:http://www.cs.umn.edu/sites/cs.umn.edu/files/tech_reports/07-017.pdf 摘要 这篇文章对常见的异常检测算法进行了分类,在每一类中,给出了这一类问题的基本假设(什么是正常,什么是异常),针对该类问题的基础方法,以及对基础方法的扩展.最后给出了关于计算复杂度的讨论. 1. 引言 异常检测应用广泛.本文给出的方法,有些只适用于某些场景,但有些方法有很强的普适性.本文的目标是给出一个结构性的关于异常检测方法的介绍. 1.1 异常

无监督算法

无监督算法: KMeans算法: 1. 随机初始化数据集簇的中心,一般从数据集中选择 2. 外循环: 内循环:计算各个数值点到中心的距离,进行聚类 计算每个聚类的平局值,移动聚类中心 PCA算法: 目标:数据压缩和可视化 1. 对样本数据进行去均值和归一化 2. 组建sigma矩阵,然后进行奇异值分解,求的压缩和的结果Z 异常检测算法: 1. 选择可能适应于异常样本的特征 2. 根据样本得到高斯分布的均值和方差 3. 对给定的样本计算其是否为异常样本 异常检测与监督学习: 异常检测:正样本数量较

# URL异常检测

(Isolation Forest无监督)这个算法是随机森林的推广. iTree树构造:随机选一个属性,再随机选该特征的一个值,对样本进行二叉划分,重复以上操作. iTree构建好了后,就可以对数据进行预测啦,预测的过程就是把测试记录在iTree上走一下,看测试记录落在哪个叶子节点.iTree能有效检测异常的假设是:异常点一般都是非常稀有的,在iTree中会很快被划分到叶子节点,因此可以用叶子节点到根节点的路径h(x)长度来判断一条记录x是否是异常点. 越接近1表示是异常点的可能性高: 越接近0