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
英文地址,請注明出處:http://en.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 并…