A. 對於python 的科學計算有哪些提高運算速度的技
一:學會正確使用numpy scipy。 numpy scipy寫好的絕不自己寫,比如矩陣運算等操作,pylab的實現還算不錯。各種函數都有,盡量使用他們可以避免初學者大部分的速度不足問題。因為這些函數大部分都是預編譯好的。
根據我幾年前的測試,python的矩陣運算速度並不慢,(因為你運行的是動態鏈接庫裡面的函數而不是腳本)比mathematica快,和matlab持平。
大部分新手不擅長看文檔啥都自己造輪子是不好的。當然老手把效率寫的比開源庫高也不算啥新聞,畢竟有對特定程序的優化
二:減少for的使用,多使用向量化函數,np.vectorlize可以把函數變成對數組逐元素的操作,比for效率高幾個華萊士。
三:對內存友好,操作大矩陣的時候減少會引起整矩陣對此的操作
四:系統最慢的大部分時候是io,包括上面說的內存操作和頻繁的讀入讀出以及debug輸出。避免他們,在需要實時處理的時候引入類似於gpu的pipeline管線機制或者使用靈活的多線程編程可以起到奇效。
五:matplotlib的繪圖效率並不高明,在使用交互繪圖(plt.ion)的時候減少不必要的刷新率。
B. Python怎麼做最優化
一、概觀
scipy中的optimize子包中提供了常用的最優化演算法函數實現。我們可以直接調用這些函數完成我們的優化問題。optimize中函數最典型的特點就是能夠從函數名稱上看出是使用了什麼演算法。下面optimize包中函數的概覽:
1.非線性最優化
fmin -- 簡單Nelder-Mead演算法
fmin_powell -- 改進型Powell法
fmin_bfgs -- 擬Newton法
fmin_cg -- 非線性共軛梯度法
fmin_ncg -- 線性搜索Newton共軛梯度法
leastsq -- 最小二乘
2.有約束的多元函數問題
fmin_l_bfgs_b ---使用L-BFGS-B演算法
fmin_tnc ---梯度信息
fmin_cobyla ---線性逼近
fmin_slsqp ---序列最小二乘法
nnls ---解|| Ax - b ||_2 for x>=0
3.全局優化
anneal ---模擬退火演算法
brute --強力法
4.標量函數
fminbound
brent
golden
bracket
5.擬合
curve_fit-- 使用非線性最小二乘法擬合
6.標量函數求根
brentq ---classic Brent (1973)
brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出這個演算法的人名
bisect ---二分法
newton ---牛頓法
fixed_point
7.多維函數求根
fsolve ---通用
broyden1 ---Broyden』s first Jacobian approximation.
broyden2 ---Broyden』s second Jacobian approximationnewton_krylov ---Krylov approximation for inverse Jacobiananderson ---extended Anderson mixing
excitingmixing ---tuned diagonal Jacobian approximationlinearmixing ---scalar Jacobian approximationdiagbroyden ---diagonal Broyden Jacobian approximation8.實用函數
line_search ---找到滿足強Wolfe的alpha值
check_grad ---通過和前向有限差分逼近比較檢查梯度函數的正確性二、實戰非線性最優化
fmin完整的調用形式是:
fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)不過我們最常使用的就是前兩個參數。一個描述優化問題的函數以及初值。後面的那些參數我們也很容易理解。如果您能用到,請自己研究。下面研究一個最簡單的問題,來感受這個函數的使用方法:f(x)=x**2-4*x+8,我們知道,這個函數的最小值是4,在x=2的時候取到。
from scipy.optimize import fmin #引入優化包def myfunc(x):
return x**2-4*x+8 #定義函數
x0 = [1.3] #猜一個初值
xopt = fmin(myfunc, x0) #求解
print xopt #列印結果
運行之後,給出的結果是:
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 16
Function evaluations: 32
[ 2.00001953]
程序准確的計算得出了最小值,不過最小值點並不是嚴格的2,這應該是由二進制機器編碼誤差造成的。
除了fmin_ncg必須提供梯度信息外,其他幾個函數的調用大同小異,完全類似。我們不妨做一個對比:
from scipy.optimize import fmin,fmin_powell,fmin_bfgs,fmin_cgdef myfunc(x):
return x**2-4*x+8
x0 = [1.3]
xopt1 = fmin(myfunc, x0)
print xopt1
print
xopt2 = fmin_powell(myfunc, x0)
print xopt2
print
xopt3 = fmin_bfgs(myfunc, x0)
print xopt3
print
xopt4 = fmin_cg(myfunc,x0)
print xopt4
給出的結果是:
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 16
Function evaluations: 32
[ 2.00001953]
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 53
1.99999999997
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 12
Gradient evaluations: 4
[ 2.00000001]
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 15
Gradient evaluations: 5
[ 2.]
我們可以根據給出的消息直觀的判斷演算法的執行情況。每一種演算法數學上的問題,請自己看書學習。個人感覺,如果不是純研究數學的工作,沒必要搞清楚那些推導以及定理雲雲。不過,必須了解每一種演算法的優劣以及能力所及。在使用的時候,不妨多種演算法都使用一下,看看效果分別如何,同時,還可以互相印證演算法失效的問題。
在from scipy.optimize import fmin之後,就可以使用help(fmin)來查看fmin的幫助信息了。幫助信息中沒有例子,但是給出了每一個參數的含義說明,這是調用函數時候的最有價值參考。
有源碼研究癖好的,或者當你需要改進這些已經實現的演算法的時候,可能需要查看optimize中的每種演算法的源代碼。在這里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聰明的你肯定發現了,順著這個鏈接往上一級、再往上一級,你會找到scipy的幾乎所有源碼!
C. python人臉識別所用的優化演算法有什麼
python三步實現人臉識別
Face Recognition軟體包
這是世界上最簡單的人臉識別庫了。你可以通過Python引用或者命令行的形式使用它,來管理和識別人臉。
該軟體包使用dlib中最先進的人臉識別深度學習演算法,使得識別准確率在《Labled Faces in the world》測試基準下達到了99.38%。
它同時提供了一個叫face_recognition的命令行工具,以便你可以用命令行對一個文件夾中的圖片進行識別操作。
特性
在圖片中識別人臉
找到圖片中所有的人臉
這里是一個例子:
1D. python 循環內要處理大量數據時怎麼優化
先嘗試優化程序的時間復雜度,尋找更有效的演算法
確保了演算法復雜度在可接受范圍之內後,開始進行常數優化,以下是Python優化的幾個小技巧:
實測表明,for語句一般比while語句效率更高
同樣實測表明,xrange一般比range要高效
如果要存儲動態數據(即有可能頻繁變動的數據)少用list和str,多用dict
實測表明,
兩個str的連接效率從高到低+=,join,+
多個str的連接效率從高到低join,+=,+
盡可能使用列表解析表達式和生成器表達式代替循環一遍來構建list
避免使用global關鍵字,無論是從代碼效率還是可移植性的方面考慮
E. Python 中有哪些性能優化方法
合理使用與deep
對於dict和list等數據結構的對象,直接賦值使用的是引用的方式。
而有些情況下需要復制整個對象,這時可以使用包里的和deep,這兩個函數的不同之處在於後者是遞歸復制的。
F. Python科學計算常用的工具包有哪些
1、 NumPy
NumPy幾乎是一個無法迴避的科學計算工具包,最常用的也許是它的N維數組對象,其他還包括一些成熟的函數庫,用於整合C/C++和Fortran代碼的工具包,線性代數、傅里葉變換和隨機數生成函數等。NumPy提供了兩種基本的對象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray是存儲單一數據類型的多維數組,而ufunc則是能夠對數組進行處理的函數。
2、SciPy:Scientific Computing Tools for Python
“SciPy是一個開源的Python演算法庫和數學工具包,SciPy包含的模塊有最優化、線性代數、積分、插值、特殊函數、快速傅里葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算。其功能與軟體MATLAB、Scilab和GNU Octave類似。 Numpy和Scipy常常結合著使用,Python大多數機器學習庫都依賴於這兩個模塊。”—-引用自“Python機器學習庫”
3、 Matplotlib
matplotlib 是python最著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合互動式地進行制圖。而且也可以方便地將它作為繪圖控制項,嵌入GUI應用程序中。Matplotlib可以配合ipython shell使用,提供不亞於Matlab的繪圖體驗,總之用過了都說好。
關於Python科學計算常用的工具包有哪些,環球青藤小編就和大家分享到這里了,學習是永無止境的,學習一項技能更是受益終身,所以,只要肯努力學,什麼時候開始都不晚。如果您還想繼續了解關於python編程的學習方法及素材等內容,可以點擊本站其他文章學習。
G. 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)
其中genEncodeing是自定義的一個簡單隨機生成序列的函數,具體實現如下
[python]view plain
defgeneEncoding(pop_size,chrom_length):
pop=[[]]
foriinrange(pop_size):
temp=[]
forjinrange(chrom_length):
temp.append(random.randint(0,1))
pop.append(temp)
returnpop[1:]
編碼完成之後就是要進行個體評價,個體評價主要是計算各個編碼出來的list的值以及對應帶入目標式子的值。其實編碼出來的就是一堆2進制list。這些2進制list每個都代表了一個數。其值的計算方式為轉換為10進制,然後除以2的序列長度次方減一,也就是全一list的十進制減一。根據這個規則就能計算出所有list的值和帶入要計算式子中的值,代碼如下
[python]view plain
#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
有了具體的值和對應的基因序列,然後進行一次淘汰,目的是淘汰掉一些不可能的壞值。這里由於是計算最大值,於是就淘汰負值就好了
[python]view plain
#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
然後就是進行選擇,這是整個遺傳演算法最核心的部分。選擇實際上模擬生物遺傳進化的優勝劣汰,讓優秀的個體盡可能存活,讓差的個體盡可能的淘汰。個體的好壞是取決於個體適應度。個體適應度越高,越容易被留下,個體適應度越低越容易被淘汰。具體的代碼如下
[python]view plain
#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
選擇完後就是進行交配和變異,這個兩個步驟很好理解。就是對基因序列進行改變,只不過改變的方式不一樣
交配:
[python]view plain
#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
[python]view plain
#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
[python]view plain
#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()
完整代碼可以在github查看
歡迎訪問我的個人博客
閱讀全文
H. 使用流行的遺傳演算法python庫是哪個
建議使用由華南農業大學、暨南大學、華南理工大學高校碩博學生聯合團隊推出的Python高性能遺傳和進化演算法工具箱:Geatpy。它是目前進化計算領域與platemo、matlab遺傳演算法工具箱等有相當的權威和影響力的高性能實用型進化演算法工具箱,而其效率和易用性居於領先地位。
目前已得到多所高校研究生實驗室以及企業採用,為相關領域的研究和應用注入了全新的活力。
它支持GA、DE、ES等進化演算法,支持單目標、多目標進化優化、復雜約束優化等問題的求解,提供豐富的遺傳演算法和多目標進化優化演算法模板,採用高性能的C內核和mkl矩陣運算,提供功能強大的開源進化演算法框架,尤其適合數學建模和研究進化演算法的研究生們。
官網:Geatpy
多目標優化求解案例:
使用方法:
第一步:實例化一個問題類把待優化的問題寫在裡面。
第二步:編寫執行腳本調用遺傳或其他進化演算法模板,完成問題的求解。
官網教程:Geatpy教程
I. 有沒有可以並行計算的python科學計算庫
因為我的程序中需要並行的是優化計算的evaluation部分,所以如果能夠找到一些支持並行優化的庫就可以。
從python官網上,可以找到一個DEAP庫(git上有),利用map進行並行計算。
這個庫的優點是,documents和例子是非常詳細的。很多函數,用戶可以根據自己的需求修改,介面還是很好用的。
DEAP中是通過調用了一個scoop庫(git上有)中的map函數來進行並行計算的。
如果你的項目不是優化,可以直接用scoop來做並行計算,scoop的documents也是蠻詳細的。
J. 用python處理一個1G左右的數據集,運行速度非常慢,怎樣優化
給你幾點個人的建議哈:
考慮拿C或C++重寫.
考慮並行搞,找個hadoop集群,寫成maprece程序跑 放在hadoop上跑,更多數據都不怕.
考慮升級機器,多搞點內存,然後東西盡量放在內存里搞.
考慮程序優化.
希望可以幫助到你哦,這只是我的一個建議哈!