LSTM神经网络结合PSO粒子群优化对管网优化调度及网络安全入侵检测模型|附数据代码

news/2024/10/15 21:38:30

 全文链接:https://tecdat.cn/?p=37878

原文出处:拓端数据部落公众号 

分析师:Fan Qiao

在当今科技飞速发展的时代,无论是工业生产中的管网系统,还是信息领域的网络安全,都面临着日益复杂的挑战😕。管网系统作为能源输送和分配的关键基础设施,其优化调度对于提高能源利用效率、降低运行成本以及保障系统稳定运行具有至关重要的意义🎯。与此同时,随着网络技术的广泛应用,网络安全问题愈发凸显,入侵检测成为保护网络系统安全的重要防线🛡️。

在管网优化调度方面,选择合适的优化算法并将其与在线仿真计算相结合是实现高效调度的核心🧐。粒子群优化算法(PSO)因其在处理复杂优化问题时的良好性能和适应性,成为解决管网优化调度问题的有力工具💪。通过与在线仿真计算的紧密结合,能够实时获取管网系统的运行状态,并据此进行优化调整,从而实现优化目标🎉。

在网络安全领域,网络攻击手段的多样化和复杂化对入侵检测模型提出了更高的要求😱。长短期记忆网络(LSTM)在处理时间序列数据方面的独特优势,使其能够有效地捕捉网络流量数据中的长期依赖关系📈。而粒子群优化算法(PSO)可以用于优化神经网络的超参数,进一步提高模型的性能和泛化能力💯。

本研究使用Python将 LSTM 与 PSO 相结合,为客户构建新型的网络安全入侵检测模型(附代码数据),旨在提高对网络攻击的检测准确率和效率,为网络安全防护提供更强大的支持😎。

粒子群优化PSO管网优化调度

一、优化算法的选取与优化算法和在线仿真计算的结合

在管网优化调度中,优化算法的选取以及其与在线仿真计算的结合是实现优化目标的关键步骤🧐。

首先,通过广泛的文献阅读以及实际的模拟试验操作,对多种优化算法进行了深入研究和比较🎯。经过仔细的筛选和评估,最终确定采用粒子群优化算法。这一算法在处理复杂的管网优化问题时,展现出了良好的性能和适应性💪。

其次,为了将优化算法有效地应用于实际的管网系统中,与开发技术人员进行了多次深入的沟通与协作🤝。通过共同努力,成功地将优化算法与在线仿真计算相结合。这种结合使得在优化过程中,能够实时获取管网系统的运行状态,并根据优化算法的要求进行调整和优化🎓。

二、优化过程及结果

通过质量流量调节后的优化过程如图所示:

在优化过程中,随着迭代次数的增加,各热源的全局最优解逐渐趋于稳定📈。当迭代到一定次数时,各热源的全局最优解达到稳定状态,这意味着优化目标得以完成🎉。

通过以上的研究和实践,成功地实现了管网优化调度的目标,为提高管网系统的运行效率和经济性提供了有力的支持💯。同时,这一研究也为进一步深入研究管网优化调度问题提供了有益的参考和借鉴📚。

Python基于 LSTM 与 PSO的网络安全入侵检测模型|附数据代码

一、引言

在当今高度数字化和网络化的时代,网络安全已成为至关重要的议题😃。随着网络技术的飞速发展,网络攻击手段日益多样化和复杂化,给个人、企业乃至整个社会都带来了巨大的威胁😱。入侵检测作为网络安全防护体系中的关键环节,其作用愈发凸显。有效的入侵检测系统能够及时发现并识别潜在的网络攻击,为采取相应的防御措施争取宝贵的时间🕙。

长短期记忆网络(LSTM)作为一种深度学习模型,在处理时间序列数据方面具有独特的优势🎯。它能够捕捉数据中的长期依赖关系,非常适合用于分析网络流量等具有时间序列特征的数据📈。而粒子群优化算法(PSO)则可以用于优化神经网络的超参数,提高模型的性能和泛化能力💪。本研究将 LSTM 与 PSO 相结合,构建一种新型的网络安全入侵检测模型,旨在提高对网络攻击的检测准确率和效率,为网络安全防护提供更有力的支持🛡️。

数据读取

 
  1.  
    ### 读取数据集
  2.  
    cols = ['duration', 'protocol_type','service', 'flag','src_bytes', 'dst_bytes', 'land', 'wrong_fragment', 'urgent', 'hot', 'num_failed_logins', 'logged_in', 'num_compromised',
  3.  
    # 训练集数据展示
  4.  
    print(f"训练集数据维度: {train.shape}")
  5.  
    train.head()
  6.  
     
  7.  
    # 测试集数据展示
  8.  
    print(f"测试集数据维度: {test.shape}")
  9.  
    test.head()
  10.  
     
  11.  
    train.describe()
 
 
 

数据是机器学习和深度学习模型的基础,高质量的数据能够显著提高模型的性能和准确性🎯。在本部分,我们首先定义了数据集的列名cols,然后使用pandas库的read_csv函数读取训练集KDDTrain.csv和测试集KDDTest.csv文件,并将列名应用于数据集📄。

通过打印训练集和测试集的形状,我们可以了解数据集的规模大小。接着,使用describe函数可以获取训练集数据的统计信息,如均值、标准差、最小值、最大值等,这些信息有助于我们对数据的分布和特征有一个初步的了解🧐。

在数据预处理阶段,我们根据实际需求丢弃了difficulty_level列,因为它可能对模型的训练和预测没有太大的帮助😉。然后,使用LabelEncoder对分类特征进行编码。LabelEncoder可以将类别型数据转换为数值型数据,以便模型能够处理🧮。

我们对attack_typeprotocol_typeserviceflag等特征进行了编码。这样做的目的是将文本或类别型数据转换为数值形式,使模型能够理解和处理这些特征🎓。编码后的数据集更适合作为模型的输入,有助于提高模型的训练效率和准确性💯。

 
train.head()

 

接下来,我们将数据集划分为特征X和目标变量y。特征X包含了除attack_type之外的所有列,目标变量y则是attack_type列的值🎯。通过打印train["attack_type"].unique(),我们可以查看攻击类型的类别情况🧐。

然后,使用train_test_split函数将数据集划分为训练集和测试集,其中测试集占比为 20%。这样可以在训练模型后,使用独立的测试集来评估模型的性能,避免过拟合🎓。

为了使不同特征在数值上具有可比性,我们使用StandardScaler进行数据标准化。标准化可以将数据转换为均值为 0,标准差为 1 的分布,有助于模型更快地收敛🧮。

最后,将训练集和测试集的数据进行维度调整,将其转换为适合 LSTM 模型输入的格式。LSTM 模型通常需要三维的数据输入,即(样本数, 时间步长, 特征数)。通过np.reshape函数进行维度转换,为模型训练做好准备💪。

模型设计

 
  1.  
    # 早停回调函数(当模型不再改进时停止训练)
  2.  
    # patience:在没有改进的情况下训练停止的轮数,monitor:要监测的指标,以发现训练停止的轮次,“verbose”参数可设置为 1
  3.  
    EarlyStopper = EarlyStopping(patience = 4, monitor = 'val_loss', mode = 'min')
  4.  
     
  5.  
    model = Sequential()
  6.  
    model.add(layers.LSTM(50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
  7.  
    model.add(layers.Flatten())
  8.  
    model.add(layers.Dense(23, activation ='softmax'))
  9.  
    model.compile(loss ='sparse_categorical_crossentropy', optimizer = opt, metrics = ["accuracy"])
  10.  
    model.summary()
 

在模型设计部分,我们首先定义了一个早停回调函数EarlyStopping🎯。这个回调函数的作用是在模型训练过程中,如果在指定的轮数(patience = 4)内验证损失val_loss不再改善,就停止训练。这样可以避免模型过拟合,节省训练时间⏱️。

然后,我们使用Sequential模型构建了一个神经网络🧠。首先添加了一个LSTM层,神经元数量为 50,return_sequences = True表示返回每个时间步的输出。输入形状根据训练集的特征形状(X_train.shape[1], 1)进行设置。LSTM层能够捕捉时间序列数据中的长期依赖关系,非常适合处理网络流量数据这种具有时间序列特征的数据📈。

接着,添加了一个Flatten层,将LSTM层的输出展平,以便后续连接全连接层🎓。最后,添加了一个具有 23 个神经元的全连接层Dense,并使用softmax激活函数进行多分类输出。

模型使用sparse_categorical_crossentropy作为损失函数,这适用于多分类问题,其中目标标签是整数形式🎯。优化器opt将在后续代码中进行定义,metrics = ["accuracy"]表示我们关注模型的准确率作为评估指标📊。通过model.summary()可以查看模型的结构和参数数量等信息🧐。

 
  1.  
    # 绘制模型结构
  2.  
    keras.utils.plot_model(model, show_shapes = True, show_layer_names = True)
 
 

使用keras.utils.plot_model函数可以绘制出模型的结构示意图,这有助于我们更直观地理解模型的架构🎨。从图中可以清晰地看到各个层的连接关系和输入输出形状,方便我们进行模型的分析和调试🧐。

 
  1.  
    history = model.fit(X_train, y_train, epochs = 20, batch_size = 32, verbose = 1,
  2.  
    validation_data = (X_test, y_test), callbacks = [EarlyStopper])
 

接下来,使用model.fit函数对模型进行训练🎓。将训练集数据X_trainy_train作为输入,设置训练轮数epochs = 20和批次大小batch_size = 32verbose = 1表示在训练过程中显示训练进度信息。同时,将验证集(X_test, y_test)作为验证数据,并使用之前定义的早停回调函数EarlyStopper。训练过程中,模型会根据训练数据不断调整参数,以最小化损失函数并提高准确率💪。

 
  1.  
    train_loss, train_acc = model.evaluate(X_train, y_train, verbose = 0)
  2.  
    print(f"训练准确率: {train_acc} 训练损失: {train_loss}")
  3.  
    test_loss, test_acc = model.evaluate(X_test, y_test, verbose = 0)
  4.  
    print(f"测试准确率: {test_acc} 测试损失: {test_loss}")
  5.  
    y_pred = np.argmax(model.predict(X_test, verbose = 0), axis = 1)
 

训练完成后,使用model.evaluate函数分别计算训练集和测试集的损失和准确率📋。通过比较训练集和测试集的准确率和损失,我们可以评估模型的性能和泛化能力🧐。np.argmax(model.predict(X_test, verbose = 0), axis = 1)用于获取模型对测试集的预测结果y_pred

 

 
 

 

打印出预测结果y_pred和真实标签y_test,以便直观地比较模型的预测效果🧐。然后,绘制准确率和损失曲线,通过观察曲线的变化趋势,我们可以了解模型在训练过程中的性能变化情况🎨。

在曲线中,训练集的准确率和损失随着轮次的增加而变化,验证集的准确率和损失则用于评估模型的泛化能力。如果训练集准确率不断提高,而验证集准确率在一定轮次后开始下降,可能表明模型出现了过拟合现象😕。

接着,打印出分类报告classification_report,它提供了关于模型在每个类别上的精确率、召回率、F1 - 分数等详细信息,帮助我们更全面地评估模型的性能📋。

最后,绘制混淆矩阵confusion_matrix,混淆矩阵可以直观地展示模型在不同类别上的预测情况。矩阵的对角线上的值表示模型正确预测的样本数量,非对角线上的值表示模型误判的样本数量🎯。通过观察混淆矩阵,我们可以发现模型在哪些类别上容易出现混淆,从而进一步改进模型🧐。

Confusion Matrix:

PSO 与神经网络结合

在这部分内容中,我们将粒子群优化算法(PSO)与神经网络相结合,以进一步优化模型的性能😎。首先,我们定义了模型设计函数model_design,该函数根据输入的参数x(包含单元数和学习率)来构建神经网络模型🧠。

在函数内部,我们使用K.clear_session来清除之前的会话,避免内存占用过高🧹。然后,根据输入的单元数创建LSTM层,并设置return_sequences=True以获取每个时间步的输出。接着,通过Flatten层将LSTM层的输出展平,再连接一个具有 23 个神经元的全连接层,并使用softmax激活函数进行多分类输出🎯。

根据学习率的不同取值范围,我们设置了不同的学习率值。然后,使用compile方法编译模型,指定损失函数、优化器和评估指标📊。

接下来,定义了best_model函数,该函数首先调用model_design函数构建模型,然后使用训练集进行训练,并使用验证集进行评估🧐。如果测试准确率大于 0.987,我们将绘制准确率和损失曲线、预测测试集、打印分类报告和绘制混淆矩阵🎨。同时,保存模型和相应的参数,并返回测试损失值。

最后,使用pso函数进行粒子群优化,将best_model作为目标函数,lbub分别作为参数的下限和上限。通过优化,找到最优的单元数和学习率组合,从而得到性能更优的模型💪。

打印出的 “最佳位置”xopt表示最优的单元数和学习率组合,“损失”fopt表示在最优参数下的测试损失值📋。这为我们提供了模型优化的方向和结果,有助于我们进一步改进和应用模型🛠️。

特征重要性绘图

 
  1.  
    # 定义绘制特征重要性的函数
  2.  
    # def plot_importance(importances):
  3.  
    # indices = np.argsort(importances)
  4.  
    # plt.title('特征重要性')
  5.  
    # plt.barh(range(len(indices)), importances[indices], color = 'b', align = 'center')
  6.  
    # plt.yticks(range(len(indices)), [features[i] for i in indices])
  7.  
    # plt.xlabel('相对重要性')
  8.  
    # plt.show()
 

特征重要性分析对于理解模型的决策过程和数据的内在结构具有重要意义🎯。虽然在本研究中我们尚未实际绘制特征重要性图,但这个函数为我们提供了一种分析特征重要性的方法🧐。

通过计算特征的重要性得分(importances),我们可以对特征进行排序,并使用barh函数绘制水平柱状图来展示特征的重要性程度📊。plt.title用于设置图形的标题,plt.yticks用于设置纵坐标的刻度标签,plt.xlabel用于设置横坐标的标签🎨。

这样的分析可以帮助我们识别出对模型预测结果影响较大的特征,从而更好地理解数据和模型的行为🧠。在实际应用中,我们可以根据特征重要性的结果进行特征选择、特征工程等操作,进一步提高模型的性能和可解释性💯。

 

另一种模型设计

 
  1.  
    # 早停回调函数(当模型不再改进时停止训练)
  2.  
    # patience:在没有改进的情况下训练停止的轮数,monitor:要监测的指标,以发现训练停止的轮次,“verbose”参数可设置为 1
  3.  
    EarlyStopper = EarlyStopping(patience = 4, monitor = 'val_loss', mode = 'min')
  4.  
     
  5.  
    input_dim = X_train.shape[1]
  6.  
    model = Sequential()
  7.  
    # 输入层 = 41,隐藏层 = 128, 64,输出层 = 23
  8.  
    # relu:处理非线性数据,softmax:获取概率
  9.  
    model.add(layers.Dense(128, input_dim = input_dim, activation ='relu'))
  10.  
    model.add(layers.Dense(64, activation ='relu'))
  11.  
    model.add(layers.Dense(23, activation ='softmax'))
  12.  
    # 为提高性能。Adam 优化是一种基于一阶和二阶矩自适应估计的随机梯度下降方法
  13.  
    opt = keras.optimizers.Adam(learning_rate = 0.001)
  14.  
    model.compile(loss ='sparse_categorical_crossentropy', optimizer = opt, metrics = ["accuracy"])
  15.  
    print(model.summary())
 

在这个部分,我们设计了另一种神经网络结构🧠。同样,我们先定义了早停回调函数EarlyStopper,以防止模型过拟合🎯。

然后,构建了一个Sequential模型。首先添加了一个具有 128 个神经元的全连接层Dense,并使用relu激活函数来处理非线性数据。input_dim根据训练集的特征维度进行设置🎓。接着,添加了另一个具有 64 个神经元的全连接层,同样使用relu激活函数。最后,添加了一个具有 23 个神经元的全连接层,并使用softmax激活函数进行多分类输出💪。

使用Adam优化器来优化模型,它是一种高效的随机梯度下降方法,能够自适应地调整学习率,提高模型的训练效率和性能📈。通过compile方法编译模型,指定损失函数、优化器和评估指标。最后,使用model.summary打印出模型的结构和参数信息,以便我们更好地理解模型的组成🧐。

 
  1.  
    # 绘制模型结构
  2.  
    keras.utils.plot_model(model, show_shapes = True, show_layer_names = True)
 
 

通过keras.utils.plot_model函数绘制出这个模型的结构示意图🎨。从图中可以清晰地看到各个层的连接关系、输入输出形状以及参数数量等信息,这有助于我们直观地理解模型的架构,发现可能存在的问题,并进行进一步的优化和调整🧐。 

 

使用model.fit函数对这个模型进行训练🎓。设置训练轮数为 5,批次大小为 32,并使用验证集进行验证,同时应用早停回调函数。训练过程中,模型会根据数据不断调整参数,以提高预测准确率💯。

 
  1.  
    train_loss, train_acc = model.evaluate(X_train, y_train, verbose = 0)
  2.  
    print(f"训练准确率: {train_acc} 训练损失: {train_loss}")
  3.  
    test_loss, test_acc = model.evaluate(X_test, y_test, verbose = 0)
  4.  
    print(f"测试准确率: {test_acc} 测试损失: {test_loss}")
  5.  
    y_pred = np.argmax(model.predict(X_test, verbose = 0), axis = 1)
 

训练完成后,使用model.evaluate函数计算训练集和测试集的准确率和损失📋。通过比较这两个指标,我们可以评估模型在不同数据集上的性能表现🧐。然后,使用np.argmax函数获取模型对测试集的预测结果y_pred

 

 
 

 
  1.  
    print(y_pred)
  2.  
    print(y_test.values)
  3.  
    # print('Sigmoid + Loss')
  4.  
    # plot_importance(feature_importance)
 

打印出预测结果y_pred和真实标签y_test.values,以便直观地比较模型的预测效果🧐。虽然这里没有实际绘制特征重要性图,但我们预留了相应的代码位置和函数定义,以便在需要时进行特征重要性分析🎯。

 

 

最后,绘制准确率和损失曲线🎨。通过观察曲线的变化趋势,我们可以直观地了解模型在训练过程中的性能变化情况。训练集的准确率和损失随着轮次的增加而变化,验证集的准确率和损失则用于评估模型的泛化能力🧐。如果训练集准确率不断提高,而验证集准确率在一定轮次后开始下降,可能表明模型出现了过拟合现象😕。通过分析这些曲线,我们可以进一步调整模型的超参数或结构,以提高模型的性能和泛化能力💪。

 

综上所述,本研究通过构建不同的神经网络模型,并结合粒子群优化算法和数据预处理技术,对网络安全入侵检测问题进行了深入研究🎓。实验结果表明,我们提出的模型在检测网络攻击方面具有较好的性能和准确性,为网络安全防护提供了一种有效的方法和思路🛡️。未来,我们可以进一步探索更复杂的模型结构和优化算法,以提高模型的性能和适应性,更好地应对日益复杂的网络安全威胁😎。

 

 关于分析师

 

在此对 Fan Qiao 对本文所作的贡献表示诚挚感谢,她在同济大学完成了热能工程专业的研究生学业,专注于热能工程领域。擅长 Python、SQL,在数据采集和数据处理方面有着丰富的经验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71997.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【专题】2024年经销商车后用户研究:洞察车主变化制胜售后未来报告合集PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=37875 在汽车行业快速变革的时代,“互联网原住民”成为车主群体的重要组成部分。2023 - 2024 年,车后用户线上渠道使用比例不断上升,App/小程序备受青睐,各线上渠道各具优势。同时,购车关注点也在不断变化,价格成为关键因素,本土品牌崛…

线程,进程,协程

线程,进程,协程 进程 是什么: ​ 最小的资源分配单位。 进程上下文切换 ​ 指 cpu 保持原有的进程的状态的同时去切换到下一个进程 ​ 包含两个主要过程:进程地址空间切换和处理器状态切换 线程 是什么 ​ 线程是操作系统中最小的调度单位。 ​ 线程是进程的子集,也称为轻…

Project Euler 638 题解

trivalq-analog,老玩家集体起立!这也就是说: \[\binom{n+m}{n}_q=\sum_{\pi\in L_{n,m}}q^{area(\pi)} \]结束! #include<bits/stdc++.h> using namespace std; #define int long long const int mod=1e9+7,maxn=2e7+5; int qp(int a,int b,int p=mod){int res=1;whi…

【bypass】bash绕过waf 的小技巧

原创 良辰 红队笔记录无意中看到推特上面有个老外分享的一条命令 $0<<<$\\\$(($((1<<1))#10011010))\\$(($((1<<1))#10100011))\其实这个命令就是ls 搜了一下原来是这个意思 $((1<<1)) 将 1 左移 1 位,得到 2。 2#10011010 将二进制数 10011010 转…

Windows刷机-记录UltraSO工具安装错误

安装镜像刻录U盘工具UltralSO:UltraISO - ISO CD/DVD image creator, editor, burner, converter and virtual CD/DVD emulator - UltraISO download page 下载后使用注册码激活: UltralSO多国语言版注册码 用户名:Steve Olson 注册码:2BEC-ED28-82BB-95D7 UltralSO简体中文版…

ElasticSearch的倒排索引和相关概念与MySQL的对比

ElasticSearch的倒排索引和相关概念 在用关系型数据库时,一些频繁用作查询条件的字段我们都会去建立索引来提升查询效率。在关系型数据库中,我们一般都采用 B 树索引进行存储,所以 B 树索引也是我们接触比较多的一种索引数据结构,但是在使用过程中,我们发现无法使用关系型…

VS新建文件时在头部附加版权信息

用记事本打开“C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\ItemTemplates\CSharp\Code\2052\Class\Class.cs”文件 //---------------------------------------------------------------- // Copyright (C) 2017 xx公司 // 文件名:$safeitem…

SaaS架构:应用服务、应用结构设计

大家好,我是汤师爷~ 应用架构设计通常包括以下步骤:根据业务架构,将业务需求转化为IT系统,识别核心应用服务。 划分应用结构,设计应用结构与业务流程、数据之间的关系。 设计应用结构之间的交互和集成关系。本文主要分享一下应用服务、应用结构设计设计。 应用服务设计 应…