BP神经网络遗传算法寻优代码模型解析

bp神经网络遗传算法寻优代码模型,注释清楚,可以运行,

最近在研究优化算法,发现BP神经网络结合遗传算法来寻优真的超有趣!今天就来给大家分享一下相关的代码模型,并且穿插着讲讲其中的门道。

首先呢,我们来看一下整体的代码框架。这里用Python来实现,先导入必要的库:

import numpy as np import matplotlib.pyplot as plt import random

numpy用于数值计算,matplotlib用来绘图,random则是为了生成随机数,方便后续遗传算法中的一些操作。

接下来定义BP神经网络的结构和相关参数:

# 定义输入层、隐藏层和输出层的节点数 input_layer_size = 2 hidden_layer_size = 3 output_layer_size = 1 # 学习率 alpha = 0.1

这里我们设置输入层有2个节点,隐藏层有3个节点,输出层有1个节点,学习率为0.1。学习率控制着每次权重更新的幅度,太小会导致收敛慢,太大可能会错过最优解。

然后是BP神经网络的前向传播函数:

def sigmoid(z): return 1 / (1 + np.exp(-z)) def forward_propagation(X, theta1, theta2): a1 = np.hstack([np.ones((X.shape[0], 1)), X]) z2 = a1.dot(theta1.T) a2 = sigmoid(z2) a2 = np.hstack([np.ones((a2.shape[0], 1)), a2]) z3 = a2.dot(theta2.T) h = sigmoid(z3) return h, a1, z2, a2, z3

sigmoid函数是BP神经网络中常用的激活函数,它能将输入值映射到0到1之间。forward_propagation函数实现了前向传播的过程,从输入层经过隐藏层到输出层,依次计算每个节点的输出。

接着是计算代价函数(这里用均方误差):

def cost_function(X, y, theta1, theta2): m = X.shape[0] h, _, _, _, _ = forward_propagation(X, theta1, theta2) J = (1 / (2 * m)) * np.sum((h - y) ** 2) return J

代价函数衡量了预测值与真实值之间的误差,我们希望通过优化权重来使代价函数最小化。

再来看反向传播函数,这可是BP神经网络的核心:

def back_propagation(X, y, theta1, theta2, h, a1, z2, a2, z3): m = X.shape[0] delta3 = h - y delta2 = delta3.dot(theta2) * (a2 * (1 - a2)) delta2 = delta2[:, 1:] theta1_grad = (1 / m) * delta2.T.dot(a1) theta2_grad = (1 / m) * delta3.T.dot(a2) return theta1_grad, theta2_grad

反向传播通过计算误差的梯度,来更新权重。这里根据输出层和隐藏层的误差,逐步计算出对权重的梯度。

然后是更新权重的函数:

def update_weights(theta1, theta2, theta1_grad, theta2_grad): theta1 = theta1 - alpha * theta1_grad theta2 = theta2 - alpha * theta2_grad return theta1, theta2

根据梯度和学习率来更新权重。

现在进入遗传算法部分。首先初始化种群:

# 初始化种群 def initialize_population(population_size, theta1_size, theta2_size): population = [] for _ in range(population_size): theta1 = np.random.rand(hidden_layer_size, input_layer_size + 1) theta2 = np.random.rand(output_layer_size, hidden_layer_size + 1) population.append([theta1, theta2]) return population

随机生成一定数量的权重组合作为初始种群。

bp神经网络遗传算法寻优代码模型,注释清楚,可以运行,

然后是计算适应度函数,这里用代价函数来衡量:

def fitness_function(population, X, y): fitness = [] for individual in population: theta1, theta2 = individual J = cost_function(X, y, theta1, theta2) fitness.append(1 / J) # 因为要最大化适应度,所以用1/代价函数 return fitness

适应度越高表示个体越优。

接着是选择操作,这里用轮盘赌选择:

def roulette_wheel_selection(population, fitness): total_fitness = sum(fitness) selection_probabilities = [fit / total_fitness for fit in fitness] selected_index = np.random.choice(len(population), p=selection_probabilities) return population[selected_index]

轮盘赌选择根据个体的适应度比例来选择个体。

交叉操作:

def crossover(parent1, parent2): theta1_crossover_point = random.randint(0, parent1[0].shape[0] - 1) theta2_crossover_point = random.randint(0, parent1[1].shape[0] - 1) child1_theta1 = np.vstack([parent1[0][:theta1_crossover_point, :], parent2[0][theta1_crossover_point:, :]]) child1_theta2 = np.vstack([parent1[1][:theta2_crossover_point, :], parent2[1][theta2_crossover_point:, :]]) child2_theta1 = np.vstack([parent2[0][:theta1_crossover_point, :], parent1[0][theta1_crossover_point:, :]]) child2_theta2 = np.vstack([parent2[1][:theta2_crossover_point, :], parent1[1][theta2_crossover_point:, :]]) return [child1_theta1, child1_theta2], [child2_theta1, child2_theta2]

交叉操作交换父母个体的部分权重信息。

变异操作:

def mutation(individual, mutation_rate): theta1, theta2 = individual for i in range(theta1.shape[0]): for j in range(theta1.shape[1]): if random.random() < mutation_rate: theta1[i, j] = np.random.rand() for i in range(theta2.shape[0]): for j in range(theta2.shape[1]): if random.random() < mutation_rate: theta2[i, j] = np.random.rand() return [theta1, theta2]

变异操作以一定概率随机改变权重值,防止算法陷入局部最优。

最后是遗传算法的主循环:

# 遗传算法主循环 def genetic_algorithm(X, y, population_size, generations, mutation_rate): population = initialize_population(population_size, (hidden_layer_size, input_layer_size + 1), (output_layer_size, hidden_layer_size + 1)) best_fitness = -np.inf best_individual = None for gen in range(generations): fitness = fitness_function(population, X, y) for i in range(population_size // 2): parent1 = roulette_wheel_selection(population, fitness) parent2 = roulette_wheel_selection(population, fitness) child1, child2 = crossover(parent1, parent2) child1 = mutation(child1, mutation_rate) child2 = mutation(child2, mutation_rate) population[i * 2] = child1 population[i * 2 + 1] = child2 current_best_fitness = max(fitness) if current_best_fitness > best_fitness: best_fitness = current_best_fitness best_individual = population[np.argmax(fitness)] print(f"Generation {gen}: Best Fitness = {best_fitness}") return best_individual

在主循环中,不断进行选择、交叉和变异操作,更新种群,最终找到最优的权重组合。

完整的代码运行起来后,就能通过BP神经网络结合遗传算法来对给定的数据进行寻优啦!

通过这样的代码模型,我们可以看到BP神经网络和遗传算法是如何相互协作,一步步找到最优解的。是不是很神奇?希望这篇分享能让大家对这个有趣的优化算法组合有更清晰的了解!

以上就是今天的全部内容啦,代码中的每一步都是为了实现更好的寻优效果,大家可以根据实际需求调整参数,进一步探索这个模型的魅力!

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

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

相关文章

IndexTTS-2集成Sambert:批量合成功能实现

IndexTTS-2集成Sambert&#xff1a;批量合成功能实现 1. 引言 1.1 业务场景描述 在语音合成&#xff08;TTS&#xff09;的实际应用中&#xff0c;单一文本的实时合成为常见需求&#xff0c;但在大规模内容生成场景下——如有声书制作、AI配音、教育课件生成等——逐条合成效…

AI写作大师Qwen3-4B实战:技术博客自动写作系统

AI写作大师Qwen3-4B实战&#xff1a;技术博客自动写作系统 1. 引言 1.1 业务场景描述 在内容创作领域&#xff0c;尤其是技术类博客的撰写过程中&#xff0c;作者常常面临选题困难、结构混乱、表达不精准等问题。高质量的技术文章不仅要求逻辑严密、术语准确&#xff0c;还需具…

从开源到商用:Image-to-Video授权方案解析

从开源到商用&#xff1a;Image-to-Video授权方案解析 1. 背景与技术演进 随着生成式AI的快速发展&#xff0c;图像转视频&#xff08;Image-to-Video, I2V&#xff09;技术正逐步从研究实验室走向实际应用。基于扩散模型的I2V系统&#xff0c;如I2VGen-XL&#xff0c;能够将…

React学习之useContext

具有树状结构关系组件之间传参可使用useContext进行跨组件之间进行传参1、parent组件import { useState } from "react"; import { Child } from "./Child"; import { ThemeContext } from "./UseContext";export const UseContext () > {//…

4位量化压缩Qwen3-0.6B,模型体积缩小75%仍可用

4位量化压缩Qwen3-0.6B&#xff0c;模型体积缩小75%仍可用 1. 引言&#xff1a;小模型的轻量化革命 在大语言模型&#xff08;LLM&#xff09;快速演进的背景下&#xff0c;模型参数规模不断攀升&#xff0c;但随之而来的部署成本和资源消耗也日益成为实际应用中的瓶颈。Qwen…

Dify开发实战:从零基础到项目实战

目录第一部分&#xff1a;思想与基石——万法归宗&#xff0c;筑基问道第1章&#xff1a;AI 应用的哲学——从“调用模型”到“构建系统”1.1 思维范式转换&#xff1a;为什么说 LLM 是新型 CPU&#xff0c;而 Dify 是操作系统&#xff1f;1.2 架构的演进&#xff1a;从简单的 …

USB-Serial Controller D驱动下载前的设备识别方法

如何精准识别并解决“USB-Serial Controller D”驱动难题 你有没有遇到过这样的情况&#xff1a;把一条看似普通的USB转TTL线插到电脑上&#xff0c;设备管理器却只显示一个孤零零的“ USB-Serial Controller D ”&#xff0c;既没有COM口&#xff0c;也无法通信&#xff1f…

别把希望交给魔法:一份清醒的健康指南

别把希望交给“魔法”&#xff1a;一个普通人该如何做出清醒的健康选择一、 饭桌上的“灵魂拷问”国庆回老家&#xff0c;饭桌上我爸突然神神秘秘地掏出一个宣传单&#xff0c;问我&#xff1a;“儿子&#xff0c;你搞技术的懂得多&#xff0c;你帮我看看这个‘量子能量袜’&am…

三菱FX3U 16仓位配方程序开发记录

三菱FX3U&#xff0c;用ST语言与梯形图&#xff0c;混合编写的16仓位的配方程序&#xff0c;程序大小约12984步&#xff0c;可以配1到16种不同的产品&#xff0c;16种配方可以根据自己的需求随意设置配方数量与产品数量&#xff0c;可以用条形码设置配方数据与生产数量&#xf…

Scarab模组管理器:新手玩家如何3步解决空洞骑士模组安装难题

Scarab模组管理器&#xff1a;新手玩家如何3步解决空洞骑士模组安装难题 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否曾经为安装空洞骑士模组而头疼&#xff1f;手动…

实战Java微信小程序商城:一套代码玩转多端SaaS架构

Java微信小程序商城源码&#xff0c;Java微信开发框架源码&#xff0c;saas模式&#xff0c;前后端分离小程序商城源码 需要看演示的&#xff0c;咨询客服。 使用高性能的Java语言开发&#xff0c;采用目前流行的微服务前后端分离框架&#xff0c;拥有完整的后台&#xff0c;小…

Qwen All-in-One实战:情感分析与智能对话一体化解决方案

Qwen All-in-One实战&#xff1a;情感分析与智能对话一体化解决方案 1. 引言 1.1 业务场景描述 在当前AI应用快速落地的背景下&#xff0c;越来越多的轻量级服务需要部署在资源受限的边缘设备或仅配备CPU的服务器上。典型的应用如客服机器人、用户反馈分析系统等&#xff0c…

Unity游戏多语言本地化终极指南:XUnity.AutoTranslator完全解析

Unity游戏多语言本地化终极指南&#xff1a;XUnity.AutoTranslator完全解析 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为Unity游戏出海的语言障碍而烦恼吗&#xff1f;XUnity.AutoTranslator作为…

基于形态学的权重自适应图像去噪:MATLAB数字图像处理探索

基于形态学的权重自适应图像去噪 MATLAB数字图像处理 基于形态学的权重自适应图像去噪 代码工程目录及运行截图如下在数字图像处理的领域中&#xff0c;图像去噪是一项至关重要的任务&#xff0c;它能帮助我们从被噪声污染的图像中恢复出清晰的原始信息。今天咱们就来聊聊基于形…

组态王条件触发数据记录,记录数据后,条件触发存储到excel表格,存储文件名为出发时的年月日时分秒

组态王条件触发数据记录&#xff0c;记录数据后&#xff0c;条件触发存储到excel表格&#xff0c;存储文件名为出发时的年月日时分秒&#xff0c;存储位置调用excel表格到报表控件展示&#xff0c;全脚本自动实现在工业自动化监控场景中&#xff0c;组态王的触发式数据记录经常…

Modbus TCP转RTU串口通讯:基于Arduino的源码及资料包

Modbus TCP协议转RTU串口通讯 TCP转RTU 程序里包含了常用命令的处理&#xff0c;源码采用arduino 开发环境。 资料里有开发环境&#xff0c;说明文件 最好有一定的8266基础。 一键智能配网&#xff0c;永久记忆&#xff0c;断电重启自动连接wifi。 只提供源代码&#xff0c;相…

电动汽车Simulink仿真模型的奇妙世界

电动汽车 simulink仿真模型&#xff0c; 可进行整车动力性仿真测试&#xff08;最高车速&#xff0c;最大爬坡&#xff0c;加入时间)和NEDC工况能耗测试&#xff08;电耗)。 由驾驶员模型、VCU控制制模型、电机 电池系统模型(电机系统和电池系统已根据供应商提供的方案数据进行…

想让AI声音更像人?试试这个基于CosyVoice2的二次开发项目

想让AI声音更像人&#xff1f;试试这个基于CosyVoice2的二次开发项目 1. 引言&#xff1a;语音合成的下一个突破点 在人工智能技术快速发展的今天&#xff0c;语音合成&#xff08;Text-to-Speech, TTS&#xff09;已经从简单的“能说”走向了“说得像人”。传统的TTS系统往往…

Elasticsearch客户端工具自动化运维脚本应用实例

用代码管好你的Elasticsearch&#xff1a;一个Python脚本的运维实战 凌晨三点&#xff0c;你被一条告警惊醒&#xff1a;“集群状态变红&#xff0c;大量分片未分配。” 登上Kibana查看&#xff0c;发现是某台节点磁盘爆了&#xff0c;几十个索引的主分片无法恢复。而更糟的是…

基于卡尔曼滤波的语音处理:让语音重归纯净

matlab&#xff0c;基于卡尔曼滤波的语音处理程序&#xff0c;针对现有语音信号&#xff0c;人为添加噪声&#xff0c;使用卡尔曼滤波器对其噪声进行滤波&#xff0c;达到语音去噪的目的在语音处理的领域中&#xff0c;噪声就像是一个令人头疼的“小怪兽”&#xff0c;常常破坏…