python遺傳演算法庫
㈠ 最受歡迎的 15 大 python 庫有哪些
1、Pandas:是一個Python包,旨在通過「標記」和「關系」數據進行工作,簡單直觀。它設計用於快速簡單的數據操作、聚合和可視化,是數據整理的完美工具。
2、Numpy:是專門為Python中科學計算而設計的軟體集合,它為Python中的n維數組和矩陣的操作提供了大量有用的功能。該庫提供了NumPy數組類型的數學運算向量化,可以改善性能,從而加快執行速度。
3、SciPy:是一個工程和科學軟體庫,包含線性代數,優化,集成和統計的模塊。SciPy庫的主要功能是建立在NumPy上,通過其特定子模塊提供有效的數值常式,並作為數字積分、優化和其他常式。
4、Matplotlib:為輕松生成簡單而強大的可視化而量身定製,它使Python成為像MatLab或Mathematica這樣的科學工具的競爭對手。
5、Seaborn:主要關注統計模型的可視化(包括熱圖),Seaborn高度依賴於Matplotlib。
6、Bokeh:獨立於Matplotlib,主要焦點是交互性,它通過現代瀏覽器以數據驅動文檔的風格呈現。
7、Plotly:是一個基於Web用於構建可視化的工具箱,提供API給一些編程語言(Python在內)。
8、Scikits:是Scikits
Stack額外的軟體包,專為像圖像處理和機器學習輔助等特定功能而設計。它建立在SciPy之上,中集成了有質量的代碼和良好的文檔、簡單易用並且十分高效,是使用Python進行機器學習的實際行業標准。
9、Theano:是一個Python軟體包,它定義了與NumPy類似的多維數組,以及數學運算和表達式。此庫是被編譯的,可實現在所有架構上的高效運行。
10、TensorFlow:是數據流圖計算的開源庫,旨在滿足谷歌對訓練神經網路的高需求,並且是基於神經網路的機器學習系統DistBelief的繼任者,可以在大型數據集上快速訓練神經網路。
11、Keras:是一個用Python編寫的開源的庫,用於在高層的介面上構建神經網路。它簡單易懂,具有高級可擴展性。
12、NLTK:主要用於符號學和統計學自然語言處理(NLP) 的常見任務,旨在促進NLP及相關領域(語言學,認知科學人工智慧等)的教學和研究。
13、Gensim:是一個用於Python的開源庫,為有向量空間模型和主題模型的工作提供了使用工具。這個庫是為了高效處理大量文本而設計,不僅可以進行內存處理,還可以通過廣泛使用NumPy數據結構和SciPy操作來獲得更高的效率。
㈡ python有沒有簡單的遺傳演算法庫
首先遺傳演算法是一種優化演算法,通過模擬基因的優勝劣汰,進行計算(具體的演算法思路什麼的就不贅述了)。大致過程分為初始化編碼、個體評價、選擇,交叉,變異。
以目標式子 y = 10 * sin(5x) + 7 * cos(4x)為例,計算其最大值
首先是初始化,包括具體要計算的式子、種群數量、染色體長度、交配概率、變異概率等。並且要對基因序列進行初始化
[python]view plain
pop_size=500#種群數量
max_value=10#基因中允許出現的最大值
chrom_length=10#染色體長度
pc=0.6#交配概率
pm=0.01#變異概率
results=[[]]#存儲每一代的最優解,N個二元組
fit_value=[]#個體適應度
fit_mean=[]#平均適應度
pop=geneEncoding(pop_size,chrom_length)
defgeneEncoding(pop_size,chrom_length):
pop=[[]]
foriinrange(pop_size):
temp=[]
forjinrange(chrom_length):
temp.append(random.randint(0,1))
pop.append(temp)
returnpop[1:]
#0.0coding:utf-80.0
#解碼並計算值
importmath
defdecodechrom(pop,chrom_length):
temp=[]
foriinrange(len(pop)):
t=0
forjinrange(chrom_length):
t+=pop[i][j]*(math.pow(2,j))
temp.append(t)
returntemp
defcalobjValue(pop,chrom_length,max_value):
temp1=[]
obj_value=[]
temp1=decodechrom(pop,chrom_length)
foriinrange(len(temp1)):
x=temp1[i]*max_value/(math.pow(2,chrom_length)-1)
obj_value.append(10*math.sin(5*x)+7*math.cos(4*x))
returnobj_value
#0.0coding:utf-80.0
#淘汰(去除負值)
defcalfitValue(obj_value):
fit_value=[]
c_min=0
foriinrange(len(obj_value)):
if(obj_value[i]+c_min>0):
temp=c_min+obj_value[i]
else:
temp=0.0
fit_value.append(temp)
returnfit_value
#0.0coding:utf-80.0
#選擇
importrandom
defsum(fit_value):
total=0
foriinrange(len(fit_value)):
total+=fit_value[i]
returntotal
defcumsum(fit_value):
foriinrange(len(fit_value)-2,-1,-1):
t=0
j=0
while(j<=i):
t+=fit_value[j]
j+=1
fit_value[i]=t
fit_value[len(fit_value)-1]=1
defselection(pop,fit_value):
newfit_value=[]
#適應度總和
total_fit=sum(fit_value)
foriinrange(len(fit_value)):
newfit_value.append(fit_value[i]/total_fit)
#計算累計概率
cumsum(newfit_value)
ms=[]
pop_len=len(pop)
foriinrange(pop_len):
ms.append(random.random())
ms.sort()
fitin=0
newin=0
newpop=pop
#轉輪盤選擇法
whilenewin<pop_len:
if(ms[newin]<newfit_value[fitin]):
newpop[newin]=pop[fitin]
newin=newin+1
else:
fitin=fitin+1
pop=newpop
- 以上代碼主要進行了3個操作,首先是計算個體適應度總和,然後在計算各自的累積適應度。這兩步都好理解,主要是第三步,轉輪盤選擇法。這一步首先是生成基因總數個0-1的小數,然後分別和各個基因的累積個體適應度進行比較。如果累積個體適應度大於隨機數則進行保留,否則就淘汰。這一塊的核心思想在於:一個基因的個體適應度越高,他所佔據的累計適應度空隙就越大,也就是說他越容易被保留下來。
#0.0coding:utf-80.0
#交配
importrandom
defcrossover(pop,pc):
pop_len=len(pop)
foriinrange(pop_len-1):
if(random.random()<pc):
cpoint=random.randint(0,len(pop[0]))
temp1=[]
temp2=[]
temp1.extend(pop[i][0:cpoint])
temp1.extend(pop[i+1][cpoint:len(pop[i])])
temp2.extend(pop[i+1][0:cpoint])
temp2.extend(pop[i][cpoint:len(pop[i])])
pop[i]=temp1
pop[i+1]=temp2
- 變異:
#0.0coding:utf-80.0
#基因突變
importrandom
defmutation(pop,pm):
px=len(pop)
py=len(pop[0])
foriinrange(px):
if(random.random()<pm):
mpoint=random.randint(0,py-1)
if(pop[i][mpoint]==1):
pop[i][mpoint]=0
else:
pop[i][mpoint]=1
- 整個遺傳演算法的實現完成了,總的調用入口代碼如下
#0.0coding:utf-80.0
importmatplotlib.pyplotasplt
importmath
fromselectionimportselection
fromcrossoverimportcrossover
frommutationimportmutation
frombestimportbest
print'y=10*math.sin(5*x)+7*math.cos(4*x)'
#計算2進制序列代表的數值
defb2d(b,max_value,chrom_length):
t=0
forjinrange(len(b)):
t+=b[j]*(math.pow(2,j))
t=t*max_value/(math.pow(2,chrom_length)-1)
returnt
pop_size=500#種群數量
max_value=10#基因中允許出現的最大值
chrom_length=10#染色體長度
pc=0.6#交配概率
pm=0.01#變異概率
results=[[]]#存儲每一代的最優解,N個二元組
fit_value=[]#個體適應度
fit_mean=[]#平均適應度
#pop=[[0,1,0,1,0,1,0,1,0,1]foriinrange(pop_size)]
pop=geneEncoding(pop_size,chrom_length)
foriinrange(pop_size):
obj_value=calobjValue(pop,chrom_length,max_value)#個體評價
fit_value=calfitValue(obj_value)#淘汰
best_indivial,best_fit=best(pop,fit_value)#第一個存儲最優的解,第二個存儲最優基因
results.append([best_fit,b2d(best_indivial,max_value,chrom_length)])
selection(pop,fit_value)#新種群復制
crossover(pop,pc)#交配
mutation(pop,pm)#變異
results=results[1:]
results.sort()
X=[]
Y=[]
foriinrange(500):
X.append(i)
t=results[i][0]
Y.append(t)
plt.plot(X,Y)
plt.show()
- 最後調用了一下matplotlib包,把500代最優解的變化趨勢表現出來。
其中genEncodeing是自定義的一個簡單隨機生成序列的函數,具體實現如下
[python]view plain
編碼完成之後就是要進行個體評價,個體評價主要是計算各個編碼出來的list的值以及對應帶入目標式子的值。其實編碼出來的就是一堆2進制list。這些2進制list每個都代表了一個數。其值的計算方式為轉換為10進制,然後除以2的序列長度次方減一,也就是全一list的十進制減一。根據這個規則就能計算出所有list的值和帶入要計算式子中的值,代碼如下
[python]view plain
有了具體的值和對應的基因序列,然後進行一次淘汰,目的是淘汰掉一些不可能的壞值。這里由於是計算最大值,於是就淘汰負值就好了
[python]view plain
然後就是進行選擇,這是整個遺傳演算法最核心的部分。選擇實際上模擬生物遺傳進化的優勝劣汰,讓優秀的個體盡可能存活,讓差的個體盡可能的淘汰。個體的好壞是取決於個體適應度。個體適應度越高,越容易被留下,個體適應度越低越容易被淘汰。具體的代碼如下
[python]view plain
選擇完後就是進行交配和變異,這個兩個步驟很好理解。就是對基因序列進行改變,只不過改變的方式不一樣
交配:
[python]view plain
[python]view plain
[python]view plain
完整代碼可以在github查看
歡迎訪問我的個人博客
閱讀全文
㈢ 常用的python庫,有哪些
pyqt, tkinter, pygame
scipy numpy graphviz nltk
看你要做什麼用咯
㈣ python遺傳演算法目標函數怎麼編
一、遺傳演算法介紹
遺傳演算法是通過模擬大自然中生物進化的歷程,來解決問題的。大自然中一個種群經歷過若干代的自然選擇後,剩下的種群必定是適應環境的。把一個問題所有的解看做一個種群,經歷過若干次的自然選擇以後,剩下的解中是有問題的最優解的。當然,只能說有最優解的概率很大。這里,我們用遺傳演算法求一個函數的最大值。
f(x) = 10 * sin( 5x ) + 7 * cos( 4x ), 0 <= x <= 10
1、將自變數x進行編碼
取基因片段的長度為10, 則10位二進制位可以表示的范圍是0到1023。基因與自變數轉變的公式是x = b2d(indivial) * 10 / 1023。構造初始的種群pop。每個個體的基因初始值是[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
2、計算目標函數值
根據自變數與基因的轉化關系式,求出每個個體的基因對應的自變數,然後將自變數代入函數f(x),求出每個個體的目標函數值。
3、適應度函數
適應度函數是用來評估個體適應環境的能力,是進行自然選擇的依據。本題的適應度函數直接將目標函數值中的負值變成0. 因為我們求的是最大值,所以要使目標函數值是負數的個體不適應環境,使其繁殖後代的能力為0.適應度函數的作用將在自然選擇中體現。
4、自然選擇
自然選擇的思想不再贅述,操作使用輪盤賭演算法。其具體步驟:
假設種群中共5個個體,適應度函數計算出來的個體適應性列表是fitvalue = [1 ,3, 0, 2, 4] ,totalvalue = 10 , 如果將fitvalue畫到圓盤上,值的大小表示在圓盤上的面積。在轉動輪盤的過程中,單個模塊的面積越大則被選中的概率越大。選擇的方法是將fitvalue轉化為[1 , 4 ,4 , 6 ,10], fitvalue / totalvalue = [0.1 , 0.4 , 0.4 , 0.6 , 1.0] . 然後產生5個0-1之間的隨機數,將隨機數從小到大排序,假如是[0.05 , 0.2 , 0.7 , 0.8 ,0.9],則將0號個體、1號個體、4號個體、4號個體、4號個體拷貝到新種群中。自然選擇的結果使種群更符合條件了。
5、繁殖
假設個體a、b的基因是
a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]
b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]
這兩個個體發生基因交換的概率pc = 0.6.如果要發生基因交換,則產生一個隨機數point表示基因交換的位置,假設point = 4,則:
a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]
b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]
交換後為:
a = [1, 0, 0, 0, 1, 0, 1, 1, 1, 1]
b = [0, 0, 0, 1, 0, 1, 1, 1, 0, 0]
6、突變
遍歷每一個個體,基因的每一位發生突變(0變為1,1變為0)的概率為0.001.突變可以增加解空間
二、代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def b2d(b): #將二進制轉化為十進制 x∈[0,10] t = 0 for j in range(len(b)): t += b[j] * (math.pow(2, j)) t = t * 10 / 1023 return tpopsize = 50 #種群的大小#用遺傳演算法求函數最大值:#f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]chromlength = 10 #基因片段的長度pc = 0.6 #兩個個體交叉的概率pm = 0.001; #基因突變的概率results = [[]]bestindivial = []bestfit = 0fitvalue = []tempop = [[]]pop = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] for i in range(popsize)]for i in range(100): #繁殖100代 objvalue = calobjvalue(pop) #計算目標函數值 fitvalue = calfitvalue(objvalue); #計算個體的適應值 [bestindivial, bestfit] = best(pop, fitvalue) #選出最好的個體和最好的函數值 results.append([bestfit,b2d(bestindivial)]) #每次繁殖,將最好的結果記錄下來 selection(pop, fitvalue) #自然選擇,淘汰掉一部分適應性低的個體 crossover(pop, pc) #交叉繁殖 mutation(pop, pc) #基因突變 results.sort() print(results[-1]) #列印函數最大值和對應的
來自CODE的代碼片
GA.py
1
2
3
4
5
6
7
8
9
def best(pop, fitvalue): #找出適應函數值中最大值,和對應的個體 px = len(pop) bestindivial = [] bestfit = fitvalue[0] for i in range(1,px): if(fitvalue[i] > bestfit): bestfit = fitvalue[i] bestindivial = pop[i] return [bestindivial, bestfit]
來自CODE的代碼片
best.py
1
2
3
4
5
6
7
8
9
10
11
def calfitvalue(objvalue):#轉化為適應值,目標函數值越大越好,負值淘汰。 fitvalue = [] temp = 0.0 Cmin = 0; for i in range(len(objvalue)): if(objvalue[i] + Cmin > 0): temp = Cmin + objvalue[i] else: temp = 0.0 fitvalue.append(temp) return fitvalue
來自CODE的代碼片
calfitvalue.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import mathdef decodechrom(pop): #將種群的二進制基因轉化為十進制(0,1023) temp = []; for i in range(len(pop)): t = 0; for j in range(10): t += pop[i][j] * (math.pow(2, j)) temp.append(t) return tempdef calobjvalue(pop): #計算目標函數值 temp1 = []; objvalue = []; temp1 = decodechrom(pop) for i in range(len(temp1)): x = temp1[i] * 10 / 1023 #(0,1023)轉化為 (0,10) objvalue.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x)) return objvalue #目標函數值objvalue[m] 與個體基因 pop[m] 對應
來自CODE的代碼片
calobjvalue.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import randomdef crossover(pop, pc): #個體間交叉,實現基因交換 poplen = len(pop) for i in range(poplen - 1): if(random.random() < pc): cpoint = random.randint(0,len(pop[0])) temp1 = [] temp2 = [] temp1.extend(pop[i][0 : cpoint]) temp1.extend(pop[i+1][cpoint : len(pop[i])]) temp2.extend(pop[i+1][0 : cpoint]) temp2.extend(pop[i][cpoint : len(pop[i])]) pop[i] = temp1 pop[i+1] = temp2
來自CODE的代碼片
crossover.py
1
2
3
4
5
6
7
8
9
10
11
12
13
import randomdef mutation(pop, pm): #基因突變 px = len(pop) py = len(pop[0]) for i in range(px): if(random.random() < pm): mpoint = random.randint(0,py-1) if(pop[i][mpoint] == 1): pop[i][mpoint] = 0 else: pop[i][mpoint] = 1
來自CODE的代碼片
mutation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import randomdef sum(fitvalue): total = 0 for i in range(len(fitvalue)): total += fitvalue[i] return totaldef cumsum(fitvalue): for i in range(len(fitvalue)): t = 0; j = 0; while(j <= i): t += fitvalue[j] j = j + 1 fitvalue[i] = t;def selection(pop, fitvalue): #自然選擇(輪盤賭演算法) newfitvalue = [] totalfit = sum(fitvalue) for i in range(len(fitvalue)): newfitvalue.append(fitvalue[i] / totalfit) cumsum(newfitvalue) ms = []; poplen = len(pop) for i in range(poplen): ms.append(random.random()) #random float list ms ms.sort() fitin = 0 newin = 0 newpop = pop while newin < poplen: if(ms[newin] < newfitvalue[fitin]): newpop[newin] = pop[fitin] newin = newin + 1 else: fitin = fitin + 1 pop = newpop
㈤ 使用流行的遺傳演算法python庫是哪個
剛從github上面安裝了兩個遺傳演算法的庫,tpot和gplearn。才剛接觸遺傳演算法,不敢多講
㈥ Python 常用的標准庫以及第三方庫有哪些
5個常用的Python標准庫:
1、os:提供了不少與操作系統相關聯的函數庫
os包是Python與操作系統的介面。我們可以用os包來實現操作系統的許多功能,比如管理系統進程,改變當前路徑,改變文件許可權等。但要注意,os包是建立在操作系統的平台上的,許多功能在Windows系統上是無法實現的。另外,在使用os包中,要注意其中的有些功能已經被其他的包取代。
我們通過文件系統來管理磁碟上儲存的文件。查找、刪除、復制文件以及列出文件列表等都是常見的文件操作。這些功能通常可以在操作系統中看到,但現在可以通過Python標准庫中的glob包、shutil包、os.path包以及os包的一些函數等,在Python內部實現。
2、sys:通常用於命令行參數的庫
sys包被用於管理Python自身的運行環境。Python是一個解釋器,也是一個運行在操作系統上的程序。我們可以用sys包來控制這一程序運行的許多參數,比如說Python運行所能占據的內存和CPU,Python所要掃描的路徑等。另一個重要功能是和Python自己的命令行互動,從命令行讀取命令和參數。
3、random:用於生成隨機數的庫
Python標准庫中的random函數,可以生成隨機浮點數、整數、字元串,甚至幫助你隨機選擇列表序列中的一個元素,打亂一組數據等。
4、math:提供了數學常數和數學函數
標准庫中,Python定義了一些新的數字類型,以彌補之前的數字類型可能的不足。標准庫還包含了random包,用於處理隨機數相關的功能。math包補充了一些重要的數學常數和數學函數,比如pi、三角函數等等。
5、datetime:日期和時間的操作庫
日期和時間的管理並不復雜,但容易犯錯。Python的標准庫中對日期和時間的管理頗為完善,你不僅可以進行日期時間的查詢和變換,還可以對日期時間進行運算。通過這些標准庫,還可以根據需要控制日期時間輸出的文本格式。
除此之外,Python還有很多第三方庫,了解更多可移步:oldboye
㈦ Python常用的標准庫以及第三方庫有哪些
Python常用的標准庫有http庫。第三方庫有scrapy,pillow和wxPython.以下有介紹:
Requests.Kenneth Reitz寫的最富盛名的http庫,每個Python程序員都應該有它。
Scrapy.如果你從事爬蟲相關的工作,那麼這個庫也是必不可少的。用過它之後你就不會再想用別的同類庫了。
wxPython.Python的一個GUI(圖形用戶界面)工具。我主要用它替代tkinter。
Pillow.它是PIL的一個友好分支。對於用戶比PIL更加友好,對於任何在圖形領域工作的人是必備的庫。
㈧ python 遺傳演算法問題
遺傳演算法(GA)是最早由美國Holland教授提出的一種基於自然界的「適者生存,優勝劣汰」基本法則的智能搜索演算法。
遺傳演算法也是借鑒該基本法則,通過基於種群的思想,將問題的解通過編碼的方式轉化為種群中的個體,並讓這些個體不斷地通過選擇、交叉和變異運算元模擬生物的進化過程,然後利用「優勝劣汰」法則選擇種群中適應性較強的個體構成子種群,然後讓子種群重復類似的進化過程,直到找到問題的最優解或者到達一定的進化(運算)時間。
㈨ 老師要求用python做遺傳演算法,原理明白,可是不會代碼,哪位老哥幫講講,價錢可以商量
還是蠻簡單的,而且 python 中有現成的遺傳演算法工具箱可用。
實現的關鍵則是如何進行編碼,這個碼就是函數的參數,參數的個數就是染色體中基因的個數, 選擇交叉變異,無非就是改變基因的值而不改變染色體的長度,然後產生新的染色體,將新的染色體重的值以參數的形式帶入到函數中求得新的函數值
㈩ python 哪個包里有 遺傳演算法
scikit-opt調研過很多遺傳演算法庫,這個挺好用的。
#目標函數
defdemo_func(x):
x1,x2,x3=x
returnx1**2+(x2-0.05)**2+x3**2
fromgaimportGA
調用遺傳演算法求解:
ga=GA(func=demo_func,lb=[-1,-10,-5],ub=[2,10,2],max_iter=500)
best_x,best_y=ga.fit()