Python60日基础学习打卡D12【虫豸版】

退火算法

物理现象:退火现象指物体逐渐降温的物理现象,温度愈低,物体的能量状态会低;温度足够低后,液体开始冷凝与结晶,在结晶状态时,系统的能量状态最低。大自然在缓慢降温(即退火)时,可找到最低能量状态:结晶。但是,如果过程过急过快,快速降温(亦称淬炼)时,会导致不是最低能态的非晶形。

算法概述

  • 目标函数 f 在第 i+1 步比第 i 步更优,即移动后比移动前更优,则总是向该方向移动
  • 目标函数 f 移动后比移动前要差,则以一定概率接受该移动,这个概率随着时间推移而降低(逐步降低则趋向稳定)

这个根据一定概率P是否选择差解的方法,叫做Metropolis准则(这个准则来源于模拟退火,故整个方法成为模拟退火)

# --- 2. 模拟退火算法优化随机森林 ---
print("\n--- 2. 模拟退火算法优化随机森林 (训练集 -> 测试集) ---")import random
import numpy as np
import time# 定义适应度函数
def fitness_function(params): n_estimators, max_depth, min_samples_split, min_samples_leaf = paramsmodel = RandomForestClassifier(n_estimators=int(n_estimators),max_depth=int(max_depth),min_samples_split=int(min_samples_split),min_samples_leaf=int(min_samples_leaf),random_state=42)model.fit(X_train, y_train)y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)return accuracy# 模拟退火算法实现(simulated_annealing函数的初始化阶段)
def simulated_annealing(initial_solution, bounds, initial_temp, final_temp, alpha):current_solution = initial_solution # 把你的当前位置设为起始点current_fitness = fitness_function(current_solution) # 给当前位置评分best_solution = current_solutionbest_fitness = current_fitnesstemp = initial_temp # 探索热情值,会随时间递减while temp > final_temp:# 只要温度高于最终值,必定生成邻域解neighbor_solution = []for i in range(len(current_solution)):new_val = current_solution[i] + random.uniform(-1, 1) * (bounds[i][1] - bounds[i][0]) * 0.1 # 随机生成一组邻域解/新参数new_val = max(bounds[i][0], min(bounds[i][1], new_val)) # 规范一组新参数,确保新值在边界范围内neighbor_solution.append(new_val)neighbor_fitness = fitness_function(neighbor_solution)delta_fitness = neighbor_fitness - current_fitness # 计算新解与当前解的适应度差,本质上就是在比较新旧参数(也就是新旧解)的好坏if delta_fitness > 0 or random.random() < np.exp(delta_fitness / temp):# 如果 delta_fitness > 0 ,意味着邻域解的适应度值高于当前解,也就是邻域解更优,此时会直接接受邻域解# 如果 delta_fitness < 0 ,意味着邻域解的适应度值低于当前解,也就是邻域解更差,此时会以一定概率接受邻域解,概率与 delta_fitness 的大小成正比,即 delta_fitness 越大,接受邻域解的概率越大。current_solution = neighbor_solutioncurrent_fitness = neighbor_fitnessif current_fitness > best_fitness:best_solution = current_solutionbest_fitness = current_fitnesstemp *= alphareturn best_solution, best_fitness # 新函数simulated_annealing输出最优解与最优解的适应度值# 超参数范围
bounds = [(50, 200), (10, 30), (2, 10), (1, 4)]  # n_estimators, max_depth, min_samples_split, min_samples_leaf# 模拟退火算法参数
initial_temp = 100 # 初始温度
final_temp = 0.1 # 终止温度
alpha = 0.95 # 温度衰减系数# 初始化初始解
initial_solution = [random.uniform(bounds[i][0], bounds[i][1]) for i in range(len(bounds))]start_time = time.time()
best_params, best_fitness = simulated_annealing(initial_solution, bounds, initial_temp, final_temp, alpha)
end_time = time.time()print(f"模拟退火算法优化耗时: {end_time - start_time:.4f} 秒")
print("最佳参数: ", {'n_estimators': int(best_params[0]),'max_depth': int(best_params[1]),'min_samples_split': int(best_params[2]),'min_samples_leaf': int(best_params[3])
})# 使用最佳参数的模型进行预测
best_model = RandomForestClassifier(n_estimators=int(best_params[0]),max_depth=int(best_params[1]),min_samples_split=int(best_params[2]),min_samples_leaf=int(best_params[3]),random_state=42)
best_model.fit(X_train, y_train)
best_pred = best_model.predict(X_test)print("\n模拟退火算法优化后的随机森林 在测试集上的分类报告:")
print(classification_report(y_test, best_pred))
print("模拟退火算法优化后的随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, best_pred))

粒子群算法

想象你在公园里和一群小伙伴的目标是找到全公园最甜的那棵苹果树。

初始状态:随机撒网

  • 1.你们所有人(粒子)一开始蒙着眼睛,被随机扔到公园各个角落(随机初始位置)
  • 2.每个人手里有个小本子,用来记录自己找到过的最甜苹果的位置(个体最优解)
  • 3.公园广播会实时播报当前所有人找到的最甜苹果的位置(群体最优解)。

找苹果的规则:边跑边交流,方向由三部分决定:

  • 1.惯性: 你本来跑的方向(比如你本来往东跑,会保持一点惯性继续往东)
  • 2.个体经验: 你记得自己之前找到过的好位置,会不自觉往那个方向偏。
  • 3.群体经验: 听说某个区域有人找到超甜的苹果,大家会一起往那个方向冲

调整速度: 每次移动时综合这三个因素调整速度和方向(如60%惯性+20%自己经验+20%群体经验)

边走边更新:

  • 1.如果你现在的位置苹果比以前记录的更甜,就更新自己小本子的位置。
  • 2.如果某人的苹果比广播里说的还甜,公园广播会立刻更新全群最优位置。
  • 3.最终结果:群体智慧爆发

经过几轮边跑边交流,所有人会逐渐聚集到公园里苹果最甜的那棵树附近。即使一开始有人走错路,但通过不断分享信息,最终大家都能找到最优解!

步骤类比

1.定义寻宝规则(初始化优化目标)

  1. 定义参数范围:# 告诉小伙伴要找什么样的苹果树
  2. 树的数量范围=(50,200)
  3. 最大深度范围 =(5,30)
  4. 叶子样本范围 =(1,10)

定义甜度检测函数(参数):验货员尝苹果流程

  1. 将参数转换为整数 ->(树的数量,深度,叶子样本)
  2. 用这些参数种一片苹果树
  3. 摘取苹果进行检测,计算甜度分数(F1值)
  4. 返回甜度的负值(因为要找更甜的)

2.组织小伙伴开始寻宝(初始化粒子群)设置寻宝队参数:

  1. 小伙伴数量=20
  2. 最大寻宝轮次=30
  3. 惯性权重=0.6 # 保持原方向跑的倾向
  4. 个体学习率=1.5 # 相信自己经验的强度
  5. 集体学习率=1.5 # 相信广播的强度

初始化所有小伙伴:

  1. 随机分配到公园各地 -> 初始位置
  2. 每人发空白小本子 -> 记录个人最佳
  3. 初始速度为0 -> 站在原地不动
  4. 收集所有初始位置甜度 -> 首次广播最佳位置

3. 开始多轮寻宝(优化循环)
for 每轮寻宝 in 总轮次:
for 每个小伙伴 in 队伍:
# 调整跑步方向(速度更新)

  1. 惯性方向 = 惯性权重 * 当前速度
  2. 个人倾向 = 个体学习率 * 随机数 * (小本子位置 - 当前位置)
  3. 集体倾向 = 集体学习率 * 随机数 * (广播位置 - 当前位置)
  4. 新速度 = 惯性方向 + 个人倾向 + 集体倾向

移动脚步(位置更新),新位置 = 当前位置 + 新速度

确保不跑出公园边界 -> 修正坐标

# 评估新位置苹果

当前甜度 = 甜度检测函数(新位置)

 # 更新记录(最优解更新)

if 当前甜度 > 小本子记录:更新小本子: 位置和甜度

if 当前甜度 > 广播甜度:更新全公园广播 -> 新最佳位置

4. 宣布最终发现(输出结果)

原文链接:https://blog.csdn.net/2503_91003121/article/details/147647065

# --- 2. 粒子群优化算法优化随机森林 ---
print("\n--- 2. 粒子群优化算法优化随机森林 (训练集 -> 测试集) ---")# 定义适应度函数,本质就是构建了一个函数实现 参数--> 评估指标的映射
def fitness_function(params): n_estimators, max_depth, min_samples_split, min_samples_leaf = params # 序列解包,允许你将一个可迭代对象(如列表、元组、字符串等)中的元素依次赋值给多个变量。model = RandomForestClassifier(n_estimators=int(n_estimators),max_depth=int(max_depth),min_samples_split=int(min_samples_split),min_samples_leaf=int(min_samples_leaf),random_state=42)model.fit(X_train, y_train)y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)return accuracy# 粒子群优化算法实现
def pso(num_particles, num_iterations, c1, c2, w, bounds): # 粒子群优化算法核心函数# num_particles:粒子的数量,每个粒子代表一组参数组合,即算法中用于搜索最优解的个体数量。# num_iterations:迭代次数,算法运行的最大循环次数。# c1:认知学习因子,用于控制粒子向自身历史最佳位置移动的程度。# c2:社会学习因子,用于控制粒子向全局最佳位置移动的程度。# w:惯性权重,控制粒子的惯性,影响粒子在搜索空间中的移动速度和方向。# bounds:超参数的取值范围,是一个包含多个元组的列表,每个元组表示一个超参数的最小值和最大值。num_params = len(bounds) particles = np.array([[random.uniform(bounds[i][0], bounds[i][1]) for i in range(num_params)] for _ inrange(num_particles)])velocities = np.array([[0] * num_params for _ in range(num_particles)])personal_best = particles.copy()personal_best_fitness = np.array([fitness_function(p) for p in particles]) # 可以理解为给每个粒子代表的超参数组合进行评分global_best_index = np.argmax(personal_best_fitness) # 找到评分最高的粒子的索引global_best = personal_best[global_best_index]global_best_fitness = personal_best_fitness[global_best_index]for _ in range(num_iterations):r1 = np.array([[random.random() for _ in range(num_params)] for _ in range(num_particles)]) # 生成一个与粒子数量和参数数量相同的随机数矩阵r2 = np.array([[random.random() for _ in range(num_params)] for _ in range(num_particles)])velocities = w * velocities + c1 * r1 * (personal_best - particles) + c2 * r2 * (global_best - particles) # particles = particles + velocities # 新位置 = 当前位置 + 新速度for i in range(num_particles): # 确保粒子的位置在超参数的取值范围内for j in range(num_params):if particles[i][j] < bounds[j][0]:particles[i][j] = bounds[j][0]elif particles[i][j] > bounds[j][1]:particles[i][j] = bounds[j][1]fitness_values = np.array([fitness_function(p) for p in particles]) # 对每个粒子代表的超参数组合进行评分improved_indices = fitness_values > personal_best_fitness # 只有当找到更好的解/参数组合时才会更新这个记录personal_best[improved_indices] = particles[improved_indices] # 更新个体最佳位置personal_best_fitness[improved_indices] = fitness_values[improved_indices] # 更新个体的最佳参数组合评分current_best_index = np.argmax(personal_best_fitness)if personal_best_fitness[current_best_index] > global_best_fitness: # 更新全局最佳位置和适应度值global_best = personal_best[current_best_index] # 个体找到更高评分对应的参数组合后,才会更新到全局最优位置global_best_fitness = personal_best_fitness[current_best_index]return global_best, global_best_fitness# 超参数范围
bounds = [(50, 200), (10, 30), (2, 10), (1, 4)]  # n_estimators, max_depth, min_samples_split, min_samples_leaf# 粒子群优化算法参数
num_particles = 20   # num_particles:粒子的数量,每个粒子代表一组参数组合,即算法中用于搜索最优解的个体数量。
num_iterations = 10  # num_iterations:迭代次数,算法运行的最大循环次数。
c1 = 1.5             # c1:认知学习因子,用于控制粒子向自身历史最佳位置移动的程度。
c2 = 1.5             # c2:社会学习因子,用于控制粒子向全局最佳位置移动的程度。
w = 0.5              # w:惯性权重,控制粒子的惯性,影响粒子在搜索空间中的移动速度和方向。start_time = time.time()
best_params, best_fitness = pso(num_particles, num_iterations, c1, c2, w, bounds)
end_time = time.time()print(f"粒子群优化算法优化耗时: {end_time - start_time:.4f} 秒")
print("最佳参数: ", {'n_estimators': int(best_params[0]),'max_depth': int(best_params[1]),'min_samples_split': int(best_params[2]),'min_samples_leaf': int(best_params[3])
})# 使用最佳参数的模型进行预测
best_model = RandomForestClassifier(n_estimators=int(best_params[0]),max_depth=int(best_params[1]),min_samples_split=int(best_params[2]),min_samples_leaf=int(best_params[3]),random_state=42)
best_model.fit(X_train, y_train)
best_pred = best_model.predict(X_test)print("\n粒子群优化算法优化后的随机森林 在测试集上的分类报告:")
print(classification_report(y_test, best_pred))
print("粒子群优化算法优化后的随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, best_pred))

 

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

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

相关文章

1.3.1 Linux音频框架alsa详细介绍

ALSA作为对旧OSS系统的替代方案&#xff0c;始于1998年。当时OSS还闭源商业化&#xff0c;因此社区开始开发开源的ALSA。经过多年的发展&#xff0c;ALSA成为Linux内核中音频架构的标准。 结构和架构 ALSA由以下几个主要部分组成&#xff1a; 内核模块&#xff1a; 这是ALSA的…

# 07_Elastic Stack 从入门到实践(七)---1

07_Elastic Stack 从入门到实践(七)—1 一、Filebeat入门之读取 Nginx 日志文件 1、首先启动 Elasticsearch 集群 和 Nginx 服务,打开GoogleChrome 浏览器,点击 elasticsearch-head 插件,连接Elasticsearch 集群 服务器。 # 查看网卡名 $ ip addr# 修改网卡配置,改为…

BUUCTF 大流量分析(三) 1

BUUCTF:https://buuoj.cn/challenges 文章目录 题目描述&#xff1a;密文&#xff1a;解题思路&#xff1a;flag&#xff1a; 相关阅读 CTF Wiki BUUCTF | 大流量分析 &#xff08;一&#xff09;&#xff08;二&#xff09;&#xff08;三&#xff09; 题目描述&#xff1a; …

数据库的进阶操作

目录 1、数据库的约束 2、查询操作的进阶 2.1 查询插入 2.2 聚合查询 2.3 运算查询 2.3 分组查询 2.4 联合查询 2.5 内外连接 2.6 子查询 2.7 合并查询 1、数据库的约束 数据库的约束是指&#xff1a;数据库会自动的对数据的合法性进行校验和检查的一系列操作的机制&a…

.Net HttpClient 使用请求数据

HttpClient 使用请求数据 0、初始化及全局设置 //初始化&#xff1a;必须先执行一次 #!import ./ini.ipynb1、使用url 传参 参数放在Url里&#xff0c;形如&#xff1a;http://www.baidu.com?namezhangsan&age18, GET、Head请求用的比较多。优点是简单、方便&#xff0…

Qt还有希望吗

&#x1f680;2025 年 Qt 框架价值大揭秘&#xff01;会持续闪耀吗&#xff1f; 宝子们&#xff0c;今天来聊聊 Qt 框架在 2025 年的价值走向&#xff0c;这可是跨平台应用开发的宝藏工具呀&#xff01; &#x1f31f;核心优势稳稳拿捏Qt 的跨平台能力绝了&#xff01; Windows…

Redis设计与实现——数据结构与对象

简单动态字符串&#xff08;SDS&#xff09; SDS 的结构定义 len&#xff1a;记录当前字符串的实际长度&#xff08;不包含 \0&#xff09;&#xff0c;获取长度的时间复杂度为 O(1)。free&#xff1a;记录未使用的空间大小&#xff0c;用于优化内存分配。buf[]&#xff1a;实…

NeurIPS 2025 截稿攻略

会议资讯 NeurIPS&#xff0c;全称神经信息处理系统大会&#xff0c;是一个关于机器学习和计算神经科学的国际会议。NeurIPS是CCF&#xff08;计算机学会&#xff09;推荐的A类会议&#xff01;是机器学习领域内最具难度、水平最高且影响力最强的会议之一。它与ICML&#xff0…

Java中堆栈

文章目录 Java中堆栈1. 栈&#xff08;Stack&#xff09;特点示例 2. 堆&#xff08;Heap&#xff09;特点示例 3. 核心区别4. 常见问题5. 内存可视化示例内存布局示意图&#xff1a; 总结 Java中堆栈 在 Java 中&#xff0c;“堆栈” 通常指的是堆&#xff08;Heap&#xff0…

【类拷贝文件的运用】

常用示例 当我们面临将文本文件分成最大大小块的时&#xff0c;我们可能会尝试编写如下代码: public class TestSplit {private static final long maxFileSizeBytes 10 * 1024 * 1024; // 默认10MBpublic void split(Path inputFile, Path outputDir) throws IOException {…

打破产品思维--被讨厌的勇气--实战5

课程&#xff1a;B站大学 记录产品经理实战项目系统性学习&#xff0c;从产品思维&#xff0c;用户画像&#xff0c;用户体验&#xff0c;增长数据驱动等不同方向理解产品&#xff0c;从0到1去理解产品从需求到落地的全过程&#xff0c;测试左移方向&#xff08;靠近需求、设计…

【Autosar SecOC 1.信息安全原理介绍】

这里写目录标题 1 背景2 了解黑客攻击原理3 SecOC实现数据的真实性与完整性校验3.1 数据身份验证完成真实性验证3.2 防止重放攻击 1 背景 在今天的车载网络中&#xff0c;大部分数据传输是在没有任何特殊安全措施的情况下进行的。因此&#xff0c;一旦能够直接访问车辆的总线&a…

基于SpringBoot的校园周边美食探索及分享平台【附源码+数据库+文档下载】

一、项目简介 本项目是一个基于 SpringBoot Vue 的校园周边美食探索与分享平台&#xff0c;专为在校大学生开发&#xff0c;集美食推荐、好友互动、收藏分享于一体。 通过平台&#xff0c;用户可以探索学校周边的美食店铺、发布美食鉴赏、添加好友进行交流分享。同时&#x…

无偿帮写毕业论文

以下教程教你如何利用相关网站和AI免费帮你写一个毕业论文。毕竟毕业论文只要过就行&#xff0c;脱产学习这么多年&#xff0c;终于熬出头了&#xff0c;完成毕设后有空就去多看看亲人好友&#xff0c;祝好&#xff01; 一、找一个论文模板(最好是overleaf) 废话不多说&#…

15 个 Azure DevOps 场景化面试问题及解答

问题 1. 解释 Azure DevOps YAML 管道的典型结构。 您可以从管道的整体结构开始&#xff0c;从触发器开始。您也可以选择解释它可能包含的不同类型的阶段&#xff1a;构建、测试、扫描、部署等。 Azure DevOps YAML 管道结构示例 触发器指示管道运行。它可以是持续集成 (CI) 或…

Java 大视界 -- Java 大数据机器学习模型在元宇宙虚拟场景智能交互中的关键技术(239)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

本地不安装oracle,还想连oracle

1.首先要用navicat,或者toad打开连接数据库 2.安装oracle客户端&#xff0c;有时候OCI.dll需要看数据库版本&#xff0c;我们Oracle数据库是12C&#xff0c;可以用这个版本 3. 4.配置环境变量 变量名&#xff1a;NLS_LANG变量值&#xff1a;SIMPLIFIED CHINESE_CHINA.ZHS16GBK …

LabVIEW车牌自动识别系统

在智能交通快速发展的时代&#xff0c;车牌自动识别系统成为提升交通管理效率的关键技术。本案例详细介绍了基于 LabVIEW 平台&#xff0c;搭配大恒品牌相机构建的车牌自动识别系统&#xff0c;该系统在多个场景中发挥着重要作用&#xff0c;为交通管理提供了高效、精准的解决方…

deque底层数据结构以及和queue的异同

文章目录 底层数据结构原理关键组成部分操作效率与其他容器的对比适用场景C STL中的实现细节总结 deque和queue的异同相同点不同点 deque&#xff08;双端队列&#xff09;是一种具有高效两端插入和删除操作的数据结构&#xff0c;常见于C标准库&#xff08;STL&#xff09;和其…

WordPress 网站上的 jpg、png 和 WebP 图片插件

核心功能 1. 转换 AVIF 并压缩 AVIF 将您 WordPress 网站上的 jpg、png 和 WebP 图片转换为 AVIF 格式&#xff0c;并根据您设置的压缩级别压缩 AVIF 图片。如果原始图片已经是 WordPress 6.5 以上支持的 AVIF 格式&#xff0c;则原始 AVIF 图片将仅被压缩。 2. 转换 WebP 并…