群智优化:探索BP神经网络的最优配置

群智优化:探索BP神经网络的最优配置

一、数据集介绍

鸢尾花数据集最初由Edgar Anderson测量得到,而后在著名的统计学家和生物学家R.A Fisher于1936年发表的文章中被引入到统计和机器学习领域数据集特征:
鸢尾花数据集包含了150个样本,每个样本有4个特征,这些特征是从花朵的尺寸测量中得到的,具体包括:
花萼长度(sepal length):在厘米单位下的花朵萼片的长度。
花萼宽度(sepal width):花萼片的宽度。
花瓣长度(petal length):花瓣的长度。
花瓣宽度(petal width):花瓣的宽度。
在这里插入图片描述

二、实验工程

基于粒子群算法的BP神经网络优化

代码如下:

import numpy as np
from pyswarm import pso
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt # 导入matplotlib的库# 准备鸢尾花数据集
data = load_iris()
X, y = data.data, data.target# 数据预处理和划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 定义BP神经网络结构
def create_nn(hidden_layer_sizes, alpha, learning_rate_init):return MLPClassifier(hidden_layer_sizes=hidden_layer_sizes, activation='relu',alpha=alpha, learning_rate_init=learning_rate_init, max_iter=1000, random_state=42)# 定义PSO适应度函数
params_list=[]
accuracy_list=[]
def nn_accuracy(params):params_list.append(params)hidden_layer_sizes = (int(params[0]),)  # 隐藏层神经元数量,将参数转换为整数alpha = params[1]  # 正则化参数 alphalearning_rate_init = params[2]  # 初始学习率# 创建BP神经网络模型model = create_nn(hidden_layer_sizes, alpha, learning_rate_init)# 使用训练集来训练模型model.fit(X_train, y_train)# 使用模型对测试集进行预测y_pred = model.predict(X_test)# 计算模型的分类准确率accuracy = accuracy_score(y_test, y_pred)accuracy_list.append(accuracy)return -accuracy  # 使用负精度作为适应度函数,因为PSO最小化目标函数# 使用PSO来最大化精度
lb = [1, 0.001, 0.001]  # 参数下界,包括隐藏层神经元数量、正则化参数 alpha、初始学习率
ub = [100, 1.0, 1.0]  # 参数上界# 使用PSO算法来寻找最佳参数组合,以最大化分类准确率xopt, fopt = pso(nn_accuracy, lb, ub, swarmsize=10, maxiter=50)print(xopt, fopt)
# 训练最终的BP神经网络模型,使用PSO找到的最优参数
best_hidden_layer_sizes = (int(xopt[0]),)
best_alpha = xopt[1]
best_learning_rate_init = xopt[2]best_model = create_nn(best_hidden_layer_sizes, best_alpha, best_learning_rate_init)
best_model.fit(X_train, y_train)hidden_layer_sizes_list=[]
alpha_list=[]
learning_rate_init_list=[]for para in params_list:hidden_layer_sizes_list.append(int(para[0]))alpha_list.append(para[1])learning_rate_init_list.append(para[2])
# 评估性能,计算最终模型的分类准确率
y_pred = best_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)plt.scatter(hidden_layer_sizes_list, accuracy_list, c="red", marker='o', label='hidden_layer_size')#画label 0的散点图plt.xlabel('hidden_layer_size')# 设置X轴的标签为K-means
plt.ylabel(accuracy)
# plt.legend(loc=2)# 设置图标在左上角
plt.title("hidden_layer_size_accuracy")
plt.show()plt.scatter(learning_rate_init_list, accuracy_list, c="blue", marker='+', label='learning_rate')#画label 2的散点图
plt.xlabel('learning_rate')# 设置X轴的标签为K-means
# plt.legend(loc=2)# 设置图标在左上角
plt.title("learning_rate_accuracy")
plt.show()
plt.scatter(alpha_list, accuracy_list, c="green", marker='*', label='alpha')#画label 1的散点图
plt.xlabel('alpha')# 设置X轴的标签为K-means
# plt.legend(loc=2)# 设置图标在左上角
plt.title("alpha_accuracy")
plt.show()plt.scatter(range(0,len(accuracy_list)), accuracy_list, c="green", marker='*')#画label 1的散点图
plt.xlabel('iter_num')# 设置X轴的标签为K-means
# plt.legend(loc=2)# 设置图标在左上角
plt.title("iter_num_accuracy")
plt.show()print("最终模型的分类准确率:", accuracy)

运行结果:
在这里插入图片描述
在这里插入图片描述

基于遗传算法的BP神经网络优化

代码如下:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt # 导入matplotlib的库# 鸢尾花数据集加载
iris = load_iris()
X, y = iris.data, iris.target# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 遗传算法参数
POPULATION_SIZE = 10
GENERATIONS = 50#迭代次数
MUTATION_RATE = 0.1#变异率# 初始化种群
def initialize_population(pop_size, layer_sizes):return [np.random.randint(1, 10, size=layer_sizes) for _ in range(pop_size)]# 适应度函数
params_list=[]
accuracy_list=[]
def fitness(network_params):params_list.append(network_params)print('network_params',network_params)clf = MLPClassifier(hidden_layer_sizes=network_params[0], activation='relu',alpha=network_params[1]/1000, learning_rate_init=network_params[1]/1000, max_iter=1000, random_state=42)clf.fit(X_train, y_train)predictions = clf.predict(X_test)accuracy_list.append(accuracy_score(y_test, predictions))return accuracy_score(y_test, predictions)# 选择
def selection(population, fitness_scores):return [population[i] for i in np.argsort(fitness_scores)[-POPULATION_SIZE:]]# 交叉
def crossover(parent1, parent2):print(parent1)child_size = len(parent1)print(child_size)crossover_point = np.random.randint(1, child_size - 1)child1 = np.concatenate((parent1[:crossover_point], parent2[crossover_point:]))child2 = np.concatenate((parent2[:crossover_point], parent1[crossover_point:]))return child1, child2# 变异
def mutate(child, mutation_rate, min_value=1, max_value=10):for i in range(len(child)):if np.random.rand() < mutation_rate:child[i] = np.random.randint(min_value, max_value)return child# 遗传算法主函数
def genetic_algorithm(X_train, y_train, X_test, y_test):layer_sizes = (3,)  # population = initialize_population(POPULATION_SIZE, layer_sizes)print(population)for generation in range(GENERATIONS):fitness_scores = [fitness(ind) for ind in population]selected_population = selection(population, fitness_scores)new_population = []for i in range(0, POPULATION_SIZE, 2):parent1, parent2 = selected_population[i], selected_population[i+1]child1, child2 = crossover(parent1, parent2)child1 = mutate(child1, MUTATION_RATE)child2 = mutate(child2, MUTATION_RATE)new_population.extend([child1, child2])population = new_population# 打印当前最佳适应度best_fitness = max(fitness_scores)print(f"Generation {generation}: Best Fitness = {best_fitness}")# 返回最佳个体best_individual = population[np.argmax(fitness_scores)]return best_individual# 运行遗传算法
best_params = genetic_algorithm(X_train, y_train, X_test, y_test)# 使用最佳参数训练BP神经网络
clf = MLPClassifier(hidden_layer_sizes=tuple(best_params), max_iter=100, random_state=42)
clf.fit(X_train, y_train)hidden_layer_sizes_list=[]
alpha_list=[]
learning_rate_init_list=[]for para in params_list:hidden_layer_sizes_list.append(int(para[0]))alpha_list.append(para[1])learning_rate_init_list.append(para[2])#plt.scatter(hidden_layer_sizes_list, accuracy_list, c="red", marker='o', label='hidden_layer_size')#画label 0的散点图plt.xlabel('hidden_layer_size')# 设置X轴的标签为K-means
plt.ylabel('accuracy')
# plt.legend(loc=2)# 设置图标在左上角
plt.title("hidden_layer_size_accuracy")
plt.show()plt.scatter(learning_rate_init_list, accuracy_list, c="blue", marker='+', label='learning_rate')#画label 2的散点图
plt.xlabel('learning_rate')# 设置X轴的标签为K-means
# plt.legend(loc=2)# 设置图标在左上角
plt.title("learning_rate_accuracy")
plt.ylabel('accuracy')
plt.show()
plt.scatter(alpha_list, accuracy_list, c="green", marker='*', label='alpha')#画label 1的散点图
plt.xlabel('alpha')# 设置X轴的标签为K-means
# plt.legend(loc=2)# 设置图标在左上角
plt.title("alpha_accuracy")
plt.ylabel('accuracy')
plt.show()plt.scatter(range(0,len(accuracy_list)), accuracy_list, c="green", marker='*')#画label 1的散点图
plt.xlabel('iter_num')# 设置X轴的标签为K-means
# plt.legend(loc=2)# 设置图标在左上角
plt.title("iter_num_accuracy")
plt.ylabel('accuracy')
plt.show()# 测试神经网络
predictions = clf.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
print(f"Test Accuracy: {accuracy}")

运行结果:
在这里插入图片描述在这里插入图片描述

总结

1.优化效果显著:实验结果表明,通过粒子群优化和遗传算法相结合的方法对BP神经网络的隐藏层数量、神经元数量以及其他超参数进行调整后,网络在多个标准数据集上的表现得到了显著提升。

2.算法优势互补:粒子群优化在全局搜索能力上表现突出,而遗传算法在局部搜索上更为精细。两者的结合充分利用了各自的优势,提高了算法的搜索效率和精度。

3.适应度函数的重要性:在本研究中,适应度函数的设计对于算法的性能至关重要。通过精心设计的适应度函数,可以更有效地引导算法搜索到最优解。

4.计算成本与性能的平衡:虽然结合算法提高了优化精度,但同时也增加了计算成本。未来的工作需要在计算效率和优化精度之间找到更好的平衡点。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业软件的分类与选择策略:针对中小企业的实际应用考量

工业软件是现代工业体系的“大脑”&#xff0c;已经渗透到几乎所有工业领域的核心环节&#xff0c;是现代产业之“魂”&#xff0c;是制造强国之重器。工业软件通过优化生产流程、实时监控设备状态、实现自动化控制等功能&#xff0c;可以帮助企业显著提升生产效率和质量&#…

鸿蒙开发系统基础能力:【@ohos.hiTraceMeter (性能打点)】

性能打点 本模块提供了追踪进程轨迹&#xff0c;度量程序执行性能的打点能力。本模块打点的数据供hiTraceMeter工具分析使用。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 impor…

【宠粉赠书】SQLServer2022:从入门到精通

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套数据库学习的必备书籍——《SQL Server 2022从入门到精通》。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 图书介绍 《SQL Server 2022从入门到精通》系统全面地介绍SQL Server 2022数据库应用与开…

记录一个Xshell使用中Xmanager...X11转发的提示问题

希望文章能给到你启发和灵感&#xff5e; 如果觉得有帮助的话&#xff0c;点赞关注收藏支持一下博主哦&#xff5e; 阅读指南 一、环境说明1.1 硬件环境1.2 软件环境 二、问题和错误三、解决四、理解和延伸一下 一、环境说明 考虑环境因素&#xff0c;大家适当的对比自己的软硬…

黑马程序员——Spring框架——day08——maven高级

目录&#xff1a; 分模块开发与设计 分模块开发的意义 问题导入模块拆分原则分模块开发&#xff08;模块拆分&#xff09; 问题导入创建Maven模块书写模块代码通过maven指令安装模块到本地仓库&#xff08;install指令&#xff09;依赖管理 依赖传递 问题导入可选依赖 问题导入…

数据结构与算法—空间复杂度详解与示例(C#,C++)

文章目录 1. 数据结构概述2. 空间复杂度的定义及影响因素3. 空间复杂度的区分常数空间复杂度&#xff08;O(1)&#xff09;线性空间复杂度&#xff08;O(n)&#xff09;其他空间复杂度 4. 几种典型数据结构的优缺点分析数组&#xff08;Array&#xff09;链表&#xff08;Linke…

10 种最佳编程字体

1.Commit Mono 这是我目前最喜欢的字体。这是我用来输入这篇文章的字体。作者 Eigil Nikolajsen 于 2023 年使用Fira Code和JetBrains Mono作为灵感开发了它。 Commit Mono 清晰易读&#xff0c;可配置性强。您可以根据粗细&#xff08;我更喜欢最细的 300&#xff09;、连字、…

联发科MT6775(Helio P70)_MTK6775处理器规格参数_处理器资料

联发科MT6775(Helio P70)采用了台积电12nm工艺制程八核处理器&#xff0c;由4颗 Arm Cortex-A73 2.1GHz 4颗Arm Cortex-A53 2.0GHz组成。其GPU为ARM Mali-G72 MP3&#xff0c;运行时高达900MHz&#xff0c;比上一代Helio P60效能提升了13%。 值得注意的是&#xff0c;联发科MT…

Charles抓包工具系列文章(四)-- Rewrite 重写工具

一、背景 这是一款比Map Local/Remote 还强大的工具&#xff0c;更加灵活&#xff0c;体现在以下几点&#xff1a; 重写request报文重写response报文header 字段的增删改query param 字段的增删改重写 body 字段改写http 响应状态status重写host/url/path 从这也可以看出其强…

R语言——数据与运算

练习基本运算&#xff1a; v <- c(2,4,6,9)t <- c(1,4,7,9)print(v>t)print(v < t)print(v t)print(v!t)print(v>t)print(v<t) v <- c(3,1,TRUE,23i)t <- c(4,1,FALSE,23i)print(v&t)print(v|t)print(!v)v <- c(3,0,TRUE,22i)t <- c(1,3,T…

ITIL发展之路:从v3到v4的演变与应用

在当今瞬息万变的技术环境中&#xff0c;IT服务管理&#xff08;ITSM&#xff09;已成为企业运营的关键支柱。ITIL&#xff08;Information Technology Infrastructure Library&#xff0c;信息技术基础设施库&#xff09;作为全球公认的ITSM最佳实践框架&#xff0c;帮助组织在…

【linux基础awk】如何基于强大的awk打印列、计算

打印列 awk {print $1} test.txt#-F参数去指定分隔的字符 awk -F "," {print $1,$2} file 匹配打印列 awk /a/ {print $4 "\t" $3} test.txt筛选数值 仅打印那些含有多于18个字符的行。awk length($0) > 18 test.txt 统计数目 #统计行数 less num…

高考填报志愿,找准自己的真兴趣来选择专业

又是一年一度的高考填报志愿的时间了&#xff0c;毕业生们要根据自己的分数&#xff0c;在很短的时间内确定自己的专业。专业千万条&#xff0c;兴趣第一条。专业的选择很大程度上决定着大学的学习生活是否顺利&#xff0c;甚至决定着以后的职业生涯。在纷繁复杂的专业中&#…

Python深度学习技术

原文链接&#xff1a;Python深度学习技术 近年来&#xff0c;伴随着以卷积神经网络&#xff08;CNN&#xff09;为代表的深度学习的快速发展&#xff0c;人工智能迈入了第三次发展浪潮&#xff0c;AI技术在各个领域中的应用越来越广泛。Transformer模型&#xff08;BERT、GPT-…

写一个坏越的个人天地(三)

昨天卡巴卡巴还是投出了学习代码以来的第一份简历,遇到好的岗位还是想争取下的吧,虽然我觉得大概率还是gg了。 昨天完成了首页的上半部分 下半部分我的构思是左右栏,左侧为菜单栏,右侧为业务栏,左侧调整右侧router进行切换内容 可以用来展示js css的小demo 稍微调整下ro…

Vue3 国际化i18n

国际化i18n方案 1. 什么是i18n2. i18n安装、配置及使用2.1 安装2.2 配置2.3 挂载到实例2.4 组件中使用2.5 语言切换 1. 什么是i18n i18n 是“国际化”的简称。在资讯领域&#xff0c;国际化(i18n)指让产品&#xff08;出版物&#xff0c;软件&#xff0c;硬件等&#xff09;无…

[UE虚幻引擎] DTSpeechVoice 文字转语音播放 插件说明

本插件可以在UE中使用蓝图把文本转成语音播放&#xff0c;播放的声音引擎是使用Windows自带的语音引擎&#xff0c;支持Win10&#xff0c;Win11。 系统设置 首先确认电脑是否有语音系统&#xff0c;一般正常安装的电脑都是自带的。 如果要播放多语言的&#xff0c;请自己下载其…

Python光束三维二维标量场和算法

&#x1f3af;要点 &#x1f3af;矢量计算和绘图&#xff1a;&#x1f58a;二维&#xff0c;三维 | &#x1f58a;转换矢量图 | &#x1f58a;矢量和矩阵计算 | &#x1f58a;矢量空间变换和计算 | &#x1f58a;解矢量线性方程 | &#x1f3af;数学和物理矢量计算&#xff1a…

无中心化崛起:Web3对传统互联网的冲击与重构

随着Web3技术的兴起&#xff0c;传统互联网面临着前所未有的挑战和重构。本文将深入探讨Web3的无中心化特性如何对传统互联网产生冲击&#xff0c;以及其可能带来的重大影响和未来发展趋势。 1. 传统互联网的局限与问题 传统互联网&#xff0c;通常称为Web2&#xff0c;主要依…

kafka--发布-订阅消息系统

1. Kafka概述 1. kafka是什么 kafka是分布式的、高并发的、基于发布/订阅模式的消息队列软件系统。 kafka中的重要组件 Producer&#xff1a;消息生产者&#xff0c;发布消息到Kafka集群的终端或服务Consume&#xff1a;消费者&#xff0c;从Kafka集群中消费消息的终端或服…