python的deap庫使用記錄

  • 主要是在遺傳符號回歸的代碼中添加了注釋和根據一部分源碼做了一點改動
import operator
import random
import numpy as np
import matplotlib.pyplot as plt
from deap import algorithms, base, creator, tools, gp
from operator import attrgetter##生成數據
def generate_data():X = np.random.uniform(-10, 10, 100).reshape(-1, 1)y = X**3 - 2*X**2 + 3*X - 5 + np.random.normal(0, 5, 100).reshape(-1, 1)return X, y##population:群體
##toolbox:工具箱
##cxpb:交配概率
##mutpb:變異概率
def varAnd(population, toolbox, cxpb, mutpb):offspring = [toolbox.clone(ind) for ind in population]# Apply crossover and mutation on the offspringfor i in range(1, len(offspring), 2):if random.random() < cxpb:offspring[i - 1], offspring[i] = toolbox.mate(offspring[i - 1],offspring[i])del offspring[i - 1].fitness.values, offspring[i].fitness.valuesfor i in range(len(offspring)):if random.random() < mutpb:offspring[i], = toolbox.mutate(offspring[i])del offspring[i].fitness.valuesreturn offspringdef if_then_else(input, output1, output2):return np.where(input, output1, output2)# 定義評價函數
def evalSymbReg(individual, points):func = toolbox.compile(expr=individual)           #編譯表達式sqerrors = ((func(points) - y)**2).flatten()      #誤差計算return np.sqrt(np.sum(sqerrors)),# 挑選好的若干個體
def selTournament(individuals, k, tournsize, fit_attr="fitness"):chosen = []for i in range(k):aspirants = [random.choice(individuals) for i in range(tournsize)]chosen.append(max(aspirants, key=attrgetter(fit_attr)))return chosendef eaSimple2(population, toolbox, cxpb, mutpb, ngen, stats=None,halloffame=None, verbose=__debug__):#用適應度評價群體,對還沒有進行過評價的個體進行評價(主要是存在很多評價過的個體)invalid_ind = []   for ind in population:if not ind.fitness.valid:invalid_ind.append(ind)fitnesses = toolbox.map(toolbox.evaluate, invalid_ind)for ind, fit in zip(invalid_ind, fitnesses):ind.fitness.values = fitif halloffame is not None:    #名人堂halloffame.update(population)#開始迭代過程for gen in range(1, ngen + 1):#1、選擇下一代繁殖個體offspring = toolbox.select(population, len(population))#2、交叉變異offspring = toolbox.varAnd(offspring, toolbox, cxpb, mutpb)#3、對適應度無效的個體進行評價invalid_ind = []for ind in offspring:if not ind.fitness.valid:invalid_ind.append(ind)fitnesses = toolbox.map(toolbox.evaluate, invalid_ind)for ind, fit in zip(invalid_ind, fitnesses):ind.fitness.values = fit#4、更新名人堂if halloffame is not None:halloffame.update(offspring)#5、用后代代替當前的群體population = offspring   #用這種方法可以使用原來的地址return population#################################################################################################
# 1、創建遺傳符號回歸語義集合
pset = gp.PrimitiveSet("MAIN", 1)
pset.addPrimitive(operator.add, 2)
pset.addPrimitive(operator.sub, 2)
pset.addPrimitive(operator.mul, 2)
pset.addPrimitive(operator.neg, 1)
pset.addPrimitive(np.square, 1)
pset.addPrimitive(np.sqrt, 1)
pset.addPrimitive(if_then_else, 3)
pset.addEphemeralConstant("rand101", lambda: random.uniform(-10, 10))# 2、頂級適應度和個體類
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMin)
# 4、定義工具函數,這里可以引入自定義函數
toolbox = base.Toolbox()
## 4.1 定義個體和種群
toolbox.register("expr", gp.genFull, pset=pset, min_=1, max_=2)                      #在兩個子葉之間生成1-2深度表達式
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.expr)  #定義個體
toolbox.register("population", tools.initRepeat, list, toolbox.individual)            #生成群體
## 4.2 公式編碼
toolbox.register("compile", gp.compile, pset=pset)                                    #表達式編譯
## 4.3 評價和挑選
X, y = generate_data()
toolbox.register("evaluate", evalSymbReg, points=X)                                #用生成的這些數據進行評價 
toolbox.register("select", selTournament, tournsize=3)                           #個體篩選
## 4.4 交叉變異和下一代繁殖
toolbox.register("mate", gp.cxOnePoint)                                                   #交叉toolbox.register("expr_mut", gp.genFull, min_=0, max_=2)
toolbox.register("mutate", gp.mutUniform, expr=toolbox.expr_mut, pset=pset)               #變異
toolbox.register("select", selTournament, tournsize=3)   toolbox.register("varAnd", varAnd)   #繁殖########################################################################
# 1、定義種群和名人堂
pop = toolbox.population(n=300)        #種群
hof = tools.HallOfFame(10)              #名人堂
# 2、擬合公式
pop = eaSimple2(pop, toolbox, 0.5, 0.1, 40,halloffame=hof, verbose=True)
best_ind = hof[0]
print("擬合公式:",best_ind)
# 3、畫出圖像
func = toolbox.compile(expr=best_ind)
y_pred = func(X)
plt.figure()
plt.scatter(X, y, color='blue', label='Actual data')
plt.scatter(X, y_pred, color='red', label='Predicted data')
plt.legend()
plt.show()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10358.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10358.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10358.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python系列】字節串與字典字節串

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

ASP.NET WebApi 如何使用 OAuth2.0 認證

前言 OAuth 2.0 是一種開放標準的授權框架&#xff0c;用于授權第三方應用程序訪問受保護資源的流程。 OAuth 2.0 認證是指在這個框架下進行的身份驗證和授權過程。 在 OAuth 2.0 認證中&#xff0c;涉及以下主要參與方&#xff1a; 資源所有者&#xff08;Resource Owner&…

【.NET Cote】你真的了解HttpRuntime類嗎

【.NET Cote】你真的了解HttpRuntime類嗎 文章目錄 【.NET Cote】你真的了解HttpRuntime類嗎一、HttpRuntime概述二、HttpRuntime是什么包三、HttpRuntime屬性四、HttpRuntime方法五、HttpRuntime.Cache方法六、HttpRuntime.Cache應用 一、HttpRuntime概述 C# HttpRuntime是一…

JAVA基礎之下載,socket實現網絡聊天

目錄 一、如何利用正則表達式找到img標簽 compile編譯編制 二、下載圖片的方法 三、socket實現網絡聊天 1.inputStreamReader 字節的讀取流--->字符的讀取流 2.outputStreamWriter 字節的寫入流--->字符的寫入流 一、如何利用正則表達式找到img標簽 compile編譯編制…

antd組件狀態變換為啥要使用剪頭函數

先看下代碼 import React, {useState} from react; import {Switch, Typography} from antd;const {Paragraph, Text} Typography;const App: React.FC () > { const [ellipsis, setEllipsis] useState(true);return (<>//正確的<Switch checked{ellipsis}onCh…

掌握SQL的時間序列分析利器:LEAD與LAG函數詳解

在SQL中&#xff0c;處理時間序列數據時&#xff0c;經常需要查看當前行與相鄰行之間的關系。這時&#xff0c;LEAD和LAG兩個窗口函數就顯得尤為重要。它們允許我們訪問結果集中的前一行或后一行的數據&#xff0c;為數據分析和處理提供了極大的便利。本文將詳細介紹LEAD和LAG函…

steam_api64.dll是什么東西?steam_api64.dll缺失的多個詳細解決方法

在現代PC游戲領域&#xff0c;Steam無疑是最具影響力的游戲分發和社交平臺之一。它不僅提供了一個龐大的游戲市場&#xff0c;還集成了好友系統、成就系統、云存儲等多種功能&#xff0c;為數百萬玩家提供了便捷的游戲體驗。在這龐大的生態系統中&#xff0c;steam_api64.dll作…

Windows10環境搭建http服務器

我 的 個 人 主 頁&#xff1a;&#x1f449;&#x1f449; 失心瘋的個人主頁 &#x1f448;&#x1f448; 入 門 教 程 推 薦 &#xff1a;&#x1f449;&#x1f449; Python零基礎入門教程合集 &#x1f448;&#x1f448; 虛 擬 環 境 搭 建 &#xff1a;&#x1f449;&…

基于 Wireshark 分析 IP 協議

一、IP 協議 IP&#xff08;Internet Protocol&#xff09;協議是一種網絡層協議&#xff0c;它用于在計算機網絡中實現數據包的傳輸和路由。 IP協議的主要功能有&#xff1a; 1. 數據報格式&#xff1a;IP協議將待傳輸的數據分割成一個個數據包&#xff0c;每個數據包包含有…

[Markdown]是時候該學學使用markdown寫文章了

&#x1f495;&#x1f495;&#x1f495;歡迎各位來到我的博客&#xff0c;今天我們的主題是markdown&#xff0c;你將在這里學習到最全的markdown知識&#x1f495;&#x1f495;&#x1f495; 你還在使用富文本編輯器寫文檔或文章嗎&#xff1f; 你還在用word一點一點地進行…

算法訓練營day29

一、組合 參考鏈接77. 組合 - 力扣&#xff08;LeetCode&#xff09; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List;public class Solution {public List<List<Integer>> combine (int n, int k) …

C語言----斐波那契數列

各位看官們好&#xff0c;當我寫了上一篇博客楊輝三角后&#xff0c;有一些看官叫我講一下斐波那契數列。對于這個大家應該是有了解的。最簡單的規律就是f(n)f(n-2)f(n-1)。就是當前是前兩項之和&#xff0c;然后下標1和0都是1.從第三項開始計算的。那么我們知道規律&#xff0…

選購洗地機有哪些技巧?2024洗地機全面解析,618洗地機綜合對比

洗地機作為人們生活中智能清潔工具的代表&#xff0c;它自帶清/污水箱&#xff0c;不用手洗滾刷&#xff0c;既可以吸塵也可以自動識別并清洗地板上的干濕垃圾和頑固污漬&#xff0c;它以多功能一體化的設計改善了家務清潔的效率和體驗。那么如何在眾多洗地機品牌中&#xff0c…

C#實現簡單音樂文件解析播放——Windows程序設計作業2

1. 作業內容 編寫一個C#程序&#xff0c;要求實現常見音樂文件的播放功能&#xff0c;具體要求如下&#xff1a; ????1). 播放MP3文件&#xff1a; 程序應能夠讀取MP3文件&#xff0c;并播放其中的音頻。 ????2). 播放OGG文件&#xff1a; 應能夠播放ogg文件。 ????…

阿里云Redis創建使用

說明&#xff1a;本文介紹如何使用阿里云Redis&#xff0c;包括開通、連接、使用&#xff1b; 開通 進入官網Redis產品頁&#xff0c;點擊免費試用&#xff08;白嫖&#xff09;&#xff1b; 選擇中間這個&#xff0c;云數據庫Redis版&#xff1b; 開通完成后&#xff0c;可在…

如何在Java項目中使用Spring Boot快速連接達夢數據庫(DM)

前言 在Java開發領域&#xff0c;Spring Boot憑借其簡潔快速的特性成為現代應用開發的首選框架。本文將詳細介紹如何在Spring Boot項目中整合JDBC以快速連接達夢數據庫(DM)&#xff0c;并提供一個簡單的示例來驗證連接是否成功。 一、環境準備與依賴配置 在開始之前&#xf…

零代碼平臺助力中國石化江蘇油田實現高效評價體系

概述&#xff1a; 中國石化集團江蘇石油勘探局有限公司面臨著評價體系依賴人工處理數據、計算繁瑣且容易出錯的挑戰。為解決這一問題&#xff0c;他們決定借助零代碼平臺明道云開發江蘇油田高質量發展經濟指標評價系統。該系統旨在實現原始數據批量導入與在線管理、權重及評分…

QT設計模式:建造者模式

基本概念 建造者模式是一種創建型設計模式&#xff0c;它允許你創建復雜對象的過程獨立于該對象的組成部分以及它們的組裝方式。這樣可以構造出不同的對象表示。 在建造者模式中&#xff0c;將創建對象的過程和對象的表示分離&#xff0c;通過一步步的構建&#xff0c;可以得…

FFmpeg常用API與示例(四)——過濾器實戰

1.filter 在多媒體處理中&#xff0c;filter 的意思是被編碼到輸出文件之前用來修改輸入文件內容的一個軟件工具。如&#xff1a;視頻翻轉&#xff0c;旋轉&#xff0c;縮放等。 語法&#xff1a;[input_link_label1]… filter_nameparameters [output_link_label1]… 1、視…

C++中調用python函數(VS2017+WIN10+Anaconda虛擬環境)

1.利用VS創建C空項目 step1 文件——新建——項目 step2 Visual C—— Windows桌面——Windows桌面向導 step3 選擇空項目 step4 源文件——新建項——添加 step5 Visual C——C文件&#xff08;.cpp&#xff09; 2.配置環境 Step1. 更換成Release與X64 Step2. 打開項目屬性&…