導航:首頁 > 源碼編譯 > python最優化演算法

python最優化演算法

發布時間:2023-02-10 18:28:25

1. 求解python四柱漢諾塔的最優演算法,要求寫一個函數表達每一步是怎麼移的,我已經寫好了move方法

漢諾塔
#include <stdio.h>
int yd(char a,char b,char c,int n)
{
static int t=0;
if (n==2)
{
printf("%c->%c\n%c->%c\n%c->%c\n",a,c,a,b,c,b);
t=t+3;
}
else
{
yd(a,c,b,n-1);
printf("%c->%c\n",a,b);
t++;
yd(c,b,a,n-1);
}
return t;
}
main()
{
int n;
scanf("%d",&n);
printf("%d",yd('a','b','c',n));
}
a.b.c是三個塔,運行後輸入a塔上初始的塊數。

2. 優化Python爬蟲速度的方法有哪些

很多爬蟲工作者都遇到過抓取非常慢的問題,尤其是需要採集大量數據的情況下。那麼如何提高爬蟲採集效率就十分關鍵,那一塊了解如何提高爬蟲採集效率問題。
1.盡可能減少網站訪問次數
單次爬蟲的主要把時間消耗在網路請求等待響應上面,所以能減少網站訪問就減少網站訪問,既減少自身的工作量,也減輕網站的壓力,還降低被封的風險。
第一步要做的就是流程優化,盡量精簡流程,避免在多個頁面重復獲取。
隨後去重,同樣是十分重要的手段,一般根據url或者id進行唯一性判別,爬過的就不再繼續爬了。
2.分布式爬蟲
即便把各種法子都用盡了,單機單位時間內能爬的網頁數仍是有限的,面對大量的網頁頁面隊列,可計算的時間仍是很長,這種情況下就必須要用機器換時間了,這就是分布式爬蟲。
第一步,分布式並不是爬蟲的本質,也並不是必須的,對於互相獨立、不存在通信的任務就可手動對任務分割,隨後在多個機器上各自執行,減少每台機器的工作量,費時就會成倍減少。
例如有200W個網頁頁面待爬,可以用5台機器各自爬互不重復的40W個網頁頁面,相對來說單機費時就縮短了5倍。
可是如果存在著需要通信的狀況,例如一個變動的待爬隊列,每爬一次這個隊列就會發生變化,即便分割任務也就有交叉重復,因為各個機器在程序運行時的待爬隊列都不一樣了——這種情況下只能用分布式,一個Master存儲隊列,其他多個Slave各自來取,這樣共享一個隊列,取的情況下互斥也不會重復爬取。IPIDEA提供高匿穩定的IP同時更注重用戶隱私的保護,保障用戶的信息安全。含有240+國家地區的ip,支持API批量使用,支持多線程高並發使用。

3. 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=03.全局優化anneal ---模擬退火演算法brute --強力法4.標量函數fminboundbrentgoldenbracket5.擬合curve_fit-- 使用非線性最小二乘法擬合6.標量函數求根brentq ---classic Brent (1973)brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出這個演算法的人名bisect ---二分法newton ---牛頓法fixed_point7.多維函數求根fsolve ---通用broyden1 ---Broyden』s first Jacobian approximation.broyden2 ---Broyden』s second Jacobian approximationnewton_krylov ---Krylov approximation for inverse Jacobiananderson ---extended Anderson mixingexcitingmixing ---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.000000Iterations: 16Function 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+8x0 = [1.3]xopt1 = fmin(myfunc, x0)print xopt1printxopt2 = fmin_powell(myfunc, x0)print xopt2printxopt3 = fmin_bfgs(myfunc, x0)print xopt3printxopt4 = fmin_cg(myfunc,x0)print xopt4給出的結果是:Optimization terminated successfully.Current function value: 4.000000Iterations: 16Function evaluations: 32[ 2.00001953]Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 531.99999999997Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 12Gradient evaluations: 4[ 2.00000001]Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 15Gradient evaluations: 5[ 2.]我們可以根據給出的消息直觀的判斷演算法的執行情況。每一種演算法數學上的問題,請自己看書學習。個人感覺,如果不是純研究數學的工作,沒必要搞清楚那些推導以及定理雲雲。不過,必須了解每一種演算法的優劣以及能力所及。在使用的時候,不妨多種演算法都使用一下,看看效果分別如何,同時,還可以互相印證演算法失效的問題。在from scipy.optimize import fmin之後,就可以使用help(fmin)來查看fmin的幫助信息了。幫助信息中沒有例子,但是給出了每一個參數的含義說明,這是調用函數時候的最有價值參考。有源碼研究癖好的,或者當你需要改進這些已經實現的演算法的時候,可能需要查看optimize中的每種演算法的源代碼。在這里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聰明的你肯定發現了,順著這個鏈接往上一級、再往上一級,你會找到scipy的幾乎所有源碼!

4. 優化Python編程的4個妙招

1. Pandas.apply() – 特徵工程瑰寶



Pandas 庫已經非常優化了,但是大部分人都沒有發揮它的最大作用。想想它一般會用於數據科學項目中的哪些地方。一般首先能想到的就是特徵工程,即用已有特徵創造新特徵。其中最高效的方法之一就是Pandas.apply(),即Pandas中的apply函數。



在Pandas.apply()中,可以傳遞用戶定義功能並將其應用到Pandas Series的所有數據點中。這個函數是Pandas庫最好的擴展功能之一,它能根據所需條件分隔數據。之後便能將其有效應用到數據處理任務中。



2. Pandas.DataFrame.loc – Python數據操作絕妙技巧



所有和數據處理打交道的數據科學家(差不多所有人了!)都應該學會這個方法。



很多時候,數據科學家需要根據一些條件更新數據集中某列的某些值。Pandas.DataFrame.loc就是此類問題最優的解決方法。



3. Python函數向量化



另一種解決緩慢循環的方法就是將函數向量化。這意味著新建函數會應用於輸入列表,並返回結果數組。在Python中使用向量化能至少迭代兩次,從而加速計算。



事實上,這樣不僅能加速代碼運算,還能讓代碼更加簡潔清晰。



4. Python多重處理



多重處理能使系統同時支持一個以上的處理器。



此處將數據處理分成多個任務,讓它們各自獨立運行。處理龐大的數據集時,即使是apply函數也顯得有些遲緩。



關於優化Python編程的4個妙招,青藤小編就和您分享到這里了。如果您對python編程有濃厚的興趣,希望這篇文章可以為您提供幫助。如果您還想了解更多關於python編程的技巧及素材等內容,可以點擊本站的其他文章進行學習。

5. Python怎麼做最優化

最優化
為什麼要做最優化呢?因為在生活中,人們總是希望幸福值或其它達到一個極值,比如做生意時希望成本最小,收入最大,所以在很多商業情境中,都會遇到求極值的情況。
函數求根
這里「函數的根」也稱「方程的根」,或「函數的零點」。
先把我們需要的包載入進來。import numpy as npimport scipy as spimport scipy.optimize as optimport matplotlib.pyplot as plt%matplotlib inline
函數求根和最優化的關系?什麼時候函數是最小值或最大值?
兩個問題一起回答:最優化就是求函數的最小值或最大值,同時也是極值,在求一個函數最小值或最大值時,它所在的位置肯定是導數為 0 的位置,所以要求一個函數的極值,必然要先求導,使其為 0,所以函數求根就是為了得到最大值最小值。
scipy.optimize 有什麼方法可以求根?
可以用 scipy.optimize 中的 bisect 或 brentq 求根。f = lambda x: np.cos(x) - x # 定義一個匿名函數x = np.linspace(-5, 5, 1000) # 先生成 1000 個 xy = f(x) # 對應生成 1000 個 f(x)plt.plot(x, y); # 看一下這個函數長什麼樣子plt.axhline(0, color='k'); # 畫一根橫線,位置在 y=0

opt.bisect(f, -5, 5) # 求取函數的根0.7390851332155535plt.plot(x, y)plt.axhline(0, color='k')plt.scatter([_], [0], c='r', s=100); # 這里的 [_] 表示上一個 Cell 中的結果,這里是 x 軸上的位置,0 是 y 上的位置

求根有兩種方法,除了上面介紹的 bisect,還有 brentq,後者比前者快很多。%timeit opt.bisect(f, -5, 5)%timeit opt.brentq(f, -5, 5)10000 loops, best of 3: 157 s per loopThe slowest run took 11.65 times longer than the fastest. This could mean that an intermediate result is being cached.10000 loops, best of 3: 35.9 s per loop
函數求最小化
求最小值就是一個最優化問題。求最大值時只需對函數做一個轉換,比如加一個負號,或者取倒數,就可轉成求最小值問題。所以兩者是同一問題。
初始值對最優化的影響是什麼?
舉例來說,先定義個函數。f = lambda x: 1-np.sin(x)/xx = np.linspace(-20., 20., 1000)y = f(x)
當初始值為 3 值,使用 minimize 函數找到最小值。minimize 函數是在新版的 scipy 里,取代了以前的很多最優化函數,是個通用的介面,背後是很多方法在支撐。x0 = 3xmin = opt.minimize(f, x0).x # x0 是起始點,起始點最好離真正的最小值點不要太遠plt.plot(x, y)plt.scatter(x0, f(x0), marker='o', s=300); # 起始點畫出來,用圓圈表示plt.scatter(xmin, f(xmin), marker='v', s=300); # 最小值點畫出來,用三角表示plt.xlim(-20, 20);

初始值為 3 時,成功找到最小值。
現在來看看初始值為 10 時,找到的最小值點。x0 = 10xmin = opt.minimize(f, x0).xplt.plot(x, y)plt.scatter(x0, f(x0), marker='o', s=300)plt.scatter(xmin, f(xmin), marker='v', s=300)plt.xlim(-20, 20);

由上圖可見,當初始值為 10 時,函數找到的是局部最小值點,可見 minimize 的默認演算法對起始點的依賴性。
那麼怎麼才能不管初始值在哪個位置,都能找到全局最小值點呢?
如何找到全局最優點?
可以使用 basinhopping 函數找到全局最優點,相關背後演算法,可以看幫助文件,有提供論文的索引和出處。
我們設初始值為 10 看是否能找到全局最小值點。x0 = 10from scipy.optimize import basinhoppingxmin = basinhopping(f,x0,stepsize = 5).xplt.plot(x, y);plt.scatter(x0, f(x0), marker='o', s=300);plt.scatter(xmin, f(xmin), marker='v', s=300);plt.xlim(-20, 20);

當起始點在比較遠的位置,依然成功找到了全局最小值點。
如何求多元函數最小值?
以二元函數為例,使用 minimize 求對應的最小值。def g(X): x,y = X return (x-1)**4 + 5 * (y-1)**2 - 2*x*yX_opt = opt.minimize(g, (8, 3)).x # (8,3) 是起始點print X_opt[ 1.88292611 1.37658521]fig, ax = plt.subplots(figsize=(6, 4)) # 定義畫布和圖形x_ = y_ = np.linspace(-1, 4, 100)X, Y = np.meshgrid(x_, y_)c = ax.contour(X, Y, g((X, Y)), 50) # 等高線圖ax.plot(X_opt[0], X_opt[1], 'r*', markersize=15) # 最小點的位置是個元組ax.set_xlabel(r"$x_1$", fontsize=18)ax.set_ylabel(r"$x_2$", fontsize=18)plt.colorbar(c, ax=ax) # colorbar 表示顏色越深,高度越高fig.tight_layout()

畫3D 圖。from mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import cmfig = plt.figure()ax = fig.gca(projection='3d')x_ = y_ = np.linspace(-1, 4, 100)X, Y = np.meshgrid(x_, y_)surf = ax.plot_surface(X, Y, g((X,Y)), rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)cset = ax.contour(X, Y, g((X,Y)), zdir='z',offset=-5, cmap=cm.coolwarm)fig.colorbar(surf, shrink=0.5, aspect=5);

曲線擬合
曲線擬合和最優化有什麼關系?
曲線擬合的問題是,給定一組數據,它可能是沿著一條線散布的,這時要找到一條最優的曲線來擬合這些數據,也就是要找到最好的線來代表這些點,這里的最優是指這些點和線之間的距離是最小的,這就是為什麼要用最優化問題來解決曲線擬合問題。
舉例說明,給一些點,找到一條線,來擬合這些點。
先給定一些點:N = 50 # 點的個數m_true = 2 # 斜率b_true = -1 # 截距dy = 2.0 # 誤差np.random.seed(0)xdata = 10 * np.random.random(N) # 50 個 x,服從均勻分布ydata = np.random.normal(b_true + m_true * xdata, dy) # dy 是標准差plt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');

上面的點整體上呈現一個線性關系,要找到一條斜線來代表這些點,這就是經典的一元線性回歸。目標就是找到最好的線,使點和線的距離最短。要優化的函數是點和線之間的距離,使其最小。點是確定的,而線是可變的,線是由參數值,斜率和截距決定的,這里就是要通過優化距離找到最優的斜率和截距。
點和線的距離定義如下:def chi2(theta, x, y): return np.sum(((y - theta[0] - theta[1] * x)) ** 2)
上式就是誤差平方和。
誤差平方和是什麼?有什麼作用?
誤差平方和公式為:
誤差平方和大,表示真實的點和預測的線之間距離太遠,說明擬合得不好,最好的線,應該是使誤差平方和最小,即最優的擬合線,這里是條直線。
誤差平方和就是要最小化的目標函數。
找到最優的函數,即斜率和截距。theta_guess = [0, 1] # 初始值theta_best = opt.minimize(chi2, theta_guess, args=(xdata, ydata)).xprint(theta_best)[-1.01442005 1.93854656]
上面兩個輸出即是預測的直線斜率和截距,我們是根據點來反推直線的斜率和截距,那麼真實的斜率和截距是多少呢?-1 和 2,很接近了,差的一點是因為有噪音的引入。xfit = np.linspace(0, 10)yfit = theta_best[0] + theta_best[1] * xfitplt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');plt.plot(xfit, yfit, '-k');

最小二乘(Least Square)是什麼?
上面用的是 minimize 方法,這個問題的目標函數是誤差平方和,這就又有一個特定的解法,即最小二乘。
最小二乘的思想就是要使得觀測點和估計點的距離的平方和達到最小,這里的「二乘」指的是用平方來度量觀測點與估計點的遠近(在古漢語中「平方」稱為「二乘」),「最小」指的是參數的估計值要保證各個觀測點與估計點的距離的平方和達到最小。
關於最小二乘估計的計算,涉及更多的數學知識,這里不想詳述,其一般的過程是用目標函數對各參數求偏導數,並令其等於 0,得到一個線性方程組。具體推導過程可參考斯坦福機器學習講義 第 7 頁。def deviations(theta, x, y): return (y - theta[0] - theta[1] * x)theta_best, ier = opt.leastsq(deviations, theta_guess, args=(xdata, ydata))print(theta_best)[-1.01442016 1.93854659]
最小二乘 leastsq 的結果跟 minimize 結果一樣。注意 leastsq 的第一個參數不再是誤差平方和 chi2,而是誤差本身 deviations,即沒有平方,也沒有和。yfit = theta_best[0] + theta_best[1] * xfitplt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');plt.plot(xfit, yfit, '-k');

非線性最小二乘
上面是給一些點,擬合一條直線,擬合一條曲線也是一樣的。def f(x, beta0, beta1, beta2): # 首先定義一個非線性函數,有 3 個參數 return beta0 + beta1 * np.exp(-beta2 * x**2)beta = (0.25, 0.75, 0.5) # 先猜 3 個 betaxdata = np.linspace(0, 5, 50)y = f(xdata, *beta)ydata = y + 0.05 * np.random.randn(len(xdata)) # 給 y 加噪音def g(beta): return ydata - f(xdata, *beta) # 真實 y 和 預測值的差,求最優曲線時要用到beta_start = (1, 1, 1)beta_opt, beta_cov = opt.leastsq(g, beta_start)print beta_opt # 求到的 3 個最優的 beta 值[ 0.25525709 0.74270226 0.54966466]
拿估計的 beta_opt 值跟真實的 beta = (0.25, 0.75, 0.5) 值比較,差不多。fig, ax = plt.subplots()ax.scatter(xdata, ydata) # 畫點ax.plot(xdata, y, 'r', lw=2) # 真實值的線ax.plot(xdata, f(xdata, *beta_opt), 'b', lw=2) # 擬合的線ax.set_xlim(0, 5)ax.set_xlabel(r"$x$", fontsize=18)ax.set_ylabel(r"$f(x, \beta)$", fontsize=18)fig.tight_layout()

除了使用最小二乘,還可以使用曲線擬合的方法,得到的結果是一樣的。beta_opt, beta_cov = opt.curve_fit(f, xdata, ydata)print beta_opt[ 0.25525709 0.74270226 0.54966466]
有約束的最小化
有約束的最小化是指,要求函數最小化之外,還要滿足約束條件,舉例說明。
邊界約束def f(X): x, y = X return (x-1)**2 + (y-1)**2 # 這是一個碗狀的函數x_opt = opt.minimize(f, (0, 0), method='BFGS').x # 無約束最優化
假設有約束條件,x 和 y 要在一定的范圍內,如 x 在 2 到 3 之間,y 在 0 和 2 之間。bnd_x1, bnd_x2 = (2, 3), (0, 2) # 對自變數的約束x_cons_opt = opt.minimize(f, np.array([0, 0]), method='L-BFGS-B', bounds=[bnd_x1, bnd_x2]).x # bounds 矩形約束fig, ax = plt.subplots(figsize=(6, 4))x_ = y_ = np.linspace(-1, 3, 100)X, Y = np.meshgrid(x_, y_)c = ax.contour(X, Y, f((X,Y)), 50)ax.plot(x_opt[0], x_opt[1], 'b*', markersize=15) # 沒有約束下的最小值,藍色五角星ax.plot(x_cons_opt[0], x_cons_opt[1], 'r*', markersize=15) # 有約束下的最小值,紅色星星bound_rect = plt.Rectangle((bnd_x1[0], bnd_x2[0]), bnd_x1[1] - bnd_x1[0], bnd_x2[1] - bnd_x2[0], facecolor="grey")ax.add_patch(bound_rect)ax.set_xlabel(r"$x_1$", fontsize=18)ax.set_ylabel(r"$x_2$", fontsize=18)plt.colorbar(c, ax=ax)fig.tight_layout()

不等式約束
介紹下相關理論,先來看下存在等式約束的極值問題求法,比如下面的優化問題。
目標函數是 f(w),下面是等式約束,通常解法是引入拉格朗日運算元,這里使用 ββ 來表示運算元,得到拉格朗日公式為
l 是等式約束的個數。
然後分別對 w 和ββ 求偏導,使得偏導數等於 0,然後解出 w 和βiβi,至於為什麼引入拉格朗日運算元可以求出極值,原因是 f(w) 的 dw 變化方向受其他不等式的約束,dw的變化方向與f(w)的梯度垂直時才能獲得極值,而且在極值處,f(w) 的梯度與其他等式梯度的線性組合平行,因此他們之間存在線性關系。(參考《最優化與KKT條件》)
對於不等式約束的極值問題
常常利用拉格朗日對偶性將原始問題轉換為對偶問題,通過解對偶問題而得到原始問題的解。該方法應用在許多統計學習方法中。有興趣的可以參閱相關資料,這里不再贅述。def f(X): return (X[0] - 1)**2 + (X[1] - 1)**2def g(X): return X[1] - 1.75 - (X[0] - 0.75)**4x_opt = opt.minimize(f, (0, 0), method='BFGS').xconstraints = [dict(type='ineq', fun=g)] # 約束採用字典定義,約束方式為不等式約束,邊界用 g 表示x_cons_opt = opt.minimize(f, (0, 0), method='SLSQP', constraints=constraints).xfig, ax = plt.subplots(figsize=(6, 4))x_ = y_ = np.linspace(-1, 3, 100)X, Y = np.meshgrid(x_, y_)c = ax.contour(X, Y, f((X, Y)), 50)ax.plot(x_opt[0], x_opt[1], 'b*', markersize=15) # 藍色星星,沒有約束下的最小值ax.plot(x_, 1.75 + (x_-0.75)**4, '', markersize=15)ax.fill_between(x_, 1.75 + (x_-0.75)**4, 3, color="grey")ax.plot(x_cons_opt[0], x_cons_opt[1], 'r*', markersize=15) # 在區域約束下的最小值ax.set_ylim(-1, 3)ax.set_xlabel(r"$x_0$", fontsize=18)ax.set_ylabel(r"$x_1$", fontsize=18)plt.colorbar(c, ax=ax)fig.tight_layout()

scipy.optimize.minimize 中包括了多種最優化演算法,每種演算法使用范圍不同,詳細參考官方文檔。

6. 學習多目標優化需要掌握哪些python知識

多目標優化

目標優化問題一般地就是指通過一定的優化演算法獲得目標函數的最優化解。當優化的目標函數為一個時稱之為單目標優化(Single-
objective Optimization Problem,
SOP)。當優化的目標函數有兩個或兩個以上時稱為多目標優化(Multi-objective Optimization Problem,
MOP)。不同於單目標優化的解為有限解,多目標優化的解通常是一組均衡解。

多目標優化演算法歸結起來有傳統優化演算法和智能優化演算法兩大類。
1. 傳統優化演算法包括加權法、約束法和線性規劃法等,實質上就是將多目標函數轉化為單目標函數,通過採用單目標優化的方法達到對多目標函數的求解。
2. 智能優化演算法包括進化演算法(Evolutionary Algorithm, 簡稱EA)、粒子群演算法(Particle Swarm Optimization, PSO)等。

Pareto最優解:

若x*∈C*,且在C中不存在比x更優越的解x,則稱x*是多目標最優化模型式的Pareto最優解,又稱為有效解。
一般來說,多目標優化問題並不存在一個最優解,所有可能的解都稱為非劣解,也稱為Pareto解。傳統優化技術一般每次能得到Pareo解集中的一個,而
用智能演算法來求解,可以得到更多的Pareto解,這些解構成了一個最優解集,稱為Pareto最優解。它是由那些任一個目標函數值的提高都必須以犧牲其
他目標函數值為代價的解組成的集合,稱為Pareto最優域,簡稱Pareto集。

Pareto有效(最優)解非劣解集是指由這樣一些解組成的集合:與集合之外的任何解相比它們至少有一個目標函數比集合之外的解好。

求解多目標優化問題最有名的就是NSGA-II了,是多目標遺傳演算法,但其對解的選擇過程可以用在其他優化演算法上,例如粒子群,蜂群等等。這里簡單介紹一下NSGA-II的選擇演算法。主要包含三個部分:
1. 快速非支配排序
要先講一下支配的概念,對於解X1和X2,如果X1對應的所有目標函數都不比X2大(最小問題),且存在一個目標值比X2小,則X2被X1支配。
快速非支配排序是一個循環分級過程:首先找出群體中的非支配解集,記為第一非支配層,irank=1(irank是個體i的非支配值),將其從群體中除去,繼續尋找群體中的非支配解集,然後irank=2。
2. 個體擁擠距離
為了使計算結果在目標空間比較均勻的分布,維持種群多樣性,對每個個體計算擁擠距離,選擇擁擠距離大的個體,擁擠距離的定義為:
L[i]d=L[i]d+(L[i+1]m−L[i−1]m)/(fmaxm−fminm)
L[i+1]m是第i+1個個體的第m目標函數值,fmaxm 和 fminm是集合中第m個目標函數的最大和最小值。
3. 精英策略選擇
精英策略就是保留父代中的優良個體直接進入子代,防止獲得的Pareto最優解丟失。將第t次產生的子代種群和父代種群合並,然後對合並後的新種群進行非支配排序,然後按照非支配順序添加到規模為N的種群中作為新的父代。

7. python 循環內要處理大量數據時怎麼優化

先嘗試優化程序的時間復雜度,尋找更有效的演算法

確保了演算法復雜度在可接受范圍之內後,開始進行常數優化,以下是Python優化的幾個小技巧:

  1. 實測表明,for語句一般比while語句效率更高

  2. 同樣實測表明,xrange一般比range要高效

  3. 如果要存儲動態數據(即有可能頻繁變動的數據)少用list和str,多用dict

  4. 實測表明,

    兩個str的連接效率從高到低+=,join,+

    多個str的連接效率從高到低join,+=,+

  5. 盡可能使用列表解析表達式和生成器表達式代替循環一遍來構建list

  6. 避免使用global關鍵字,無論是從代碼效率還是可移植性的方面考慮

8. 用python處理一個1G左右的數據集,運行速度非常慢,怎樣優化

第一個辦法,降低數據集的大小。python處理數據,如果數據結構中的數據超過2GB,通常都會很慢。如何降低數據集大小,需要修改演算法。

第二個辦法,將數據結構採用數組array或者是numarray存貯。這樣內存數量與查找效率都會提高。盡量不要使用大的dict。使用一個省內存的blist代替list

第三個辦法,將數據通過共享內存,讓C++擴展模塊來處理。

常用的是第二種辦法。就是換個數據結構就可以提高效率。

9. python人臉識別所用的優化演算法有什麼

python三步實現人臉識別

Face Recognition軟體包

這是世界上最簡單的人臉識別庫了。你可以通過Python引用或者命令行的形式使用它,來管理和識別人臉。

該軟體包使用dlib中最先進的人臉識別深度學習演算法,使得識別准確率在《Labled Faces in the world》測試基準下達到了99.38%。

它同時提供了一個叫face_recognition的命令行工具,以便你可以用命令行對一個文件夾中的圖片進行識別操作。

特性

在圖片中識別人臉

找到圖片中所有的人臉

這里是一個例子:

1
  • https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_picture
  • 10. #Python干貨#python實現——最優化演算法

    函數詳見rres,此代碼使該演算法運行了兩次

    收獲:
    這是我第一個實現的代碼。學習完該演算法以後,邏輯框架基本上就有了,剩下需要明確的就是對應的python的語言。於是我就開始了查找「如何定義函數」(詳見mofan的優酷),「循環體」和「if條件語句」的格式(https://blog.csdn.net/qq_39407518/article/details/79822498)「數學符號」(詳見mofan的優酷),以及print的使用

    1.def是python中指定義,一般用來定義函數,如果需要深度學習搭建網路可用來定義網路。值得注意的一點是

    我不清楚為什麼,但是如果沒有加的話,那個函數公式就是一個花瓶,就像一個結果輸不出去。

    2.最坑的就是邏輯。一開始邏輯沒理清楚,或者說在代碼上有疏漏,導致我將left和right放在了循環體里,結果可想而知。不過也是因為這個錯誤,我知道pycharm中的debug怎麼用,挺簡單的,網路一下就出來了。

    3.不知道什麼原因,看的莫煩視頻中的print多個變數一起輸出是沒有辦法在我的pycharm中使用的,出來的結果很奇怪。可能是因為我是win10不是ios吧。print如果多個變數一起輸出必須是print("名字:%s,名字2:%s"%(a,b))結果輸出就是名字:a ,名字2:b

    關於python中數據變數。第一遍運行結果出現很明顯不對,於是我採用了debug。結果發現,mid1處一直為1而不是1.5,於是就開始了解數據變數。起初我猜測python默認所有變數為整型,但是根據二分法的結果我意識到此猜測不對,所以要改整個file的變數格式沒有必要。所以我就在mid1式子前面加了一個float,結果就顯示為1.5了。但是如果我將整個式子用()括起來,前面加float,結果還是1。我不太理解為什麼。不過我知道了python的數據格式是根據輸入量決定的,也就是說你的輸入量如果是整型,那麼與其直接相關的計算輸出結果一定是整型,而且還是不採用進位的整型。在我沒有採用+float/+.0這兩種方法之前,mid1~3全部是整型。

    或者不再mid1前面加float,直接將輸入量後面點個點就行
    真的很想吐槽一下print,好麻煩啊啊啊啊每次都得弄個%s,而且有時候還不能放一起!!!!

    不要問我掌握了什麼,要問我現在寫完這個代碼後有多麼的愛python的精度表示 :-)我決定以後只要再編寫數學公式的代碼都將輸入量的小數學點後面補很多0
    fibonacci函數定義,每次debug後我的手都是抖的O( _ )O~

    不知道自己什麼時候有的強迫症,只要是代碼下面有「~」我就必須要消掉。笑哭。這個很簡單,前四個除了費波納茨,都很簡單。

    這個公式看起來很麻煩,便寫的時候更要謹慎。我上回把那個2擱在了分號下面,結果很大,所以還是換算成0.5更好(PS:勿忘那長河般的0)。
    雖然代碼很長,但是主要是因為print太多。本打算在開頭print,最後結果會漏掉最後一部分。懶得想其他辦法了,直接就這樣吧

    一開始while裡面寫成了>,導致run不出來。繼而,debug也沒法用。在網上一查才知道 「沒聯網」+「沒選斷點」。最後想嘗試將else裡面的內容輸出來,結果發現run以後被刷屏了。於是改成i<7以後還是不行,於是想著加一個break跳出循環,結果成效了。
    然後剛剛由debug了一下,才知道原來是i+1在if裡面,因為沒有辦法+1,所以i=6一直存在,就不斷循環。因為加break也好,i+1也好,都可以。

    這是我第一組自己實現的python代碼,就是數學公式用python語言組裝起來。剛開始的時候知道大概需要在語言中體現什麼,但不太清楚。於是我就在網上找了幾個二分法的,他們都各有不同,但框架都差不多,不過如果要用到我們的那個公式里還需要改變很多。然後我就開始分析我們的題,我發現大體需要兩部分,一部分函數定義,一部分循環體。但我不知道如何定義函數,如何寫數學公式,如何弄變數,也就是說一些小點不太會,所以我選擇直接網路。因為我知道自己閱讀的能力不錯,相比於從視頻中提取要素,我更擅長通過閱讀獲得要點。有目的性地找知識點,掌握地更牢固。
    於是我就開始了第一個——二分法的編寫。我發現,自己出現了很多錯誤而且有很多地方都很基礎。但我依然沒選擇視頻,而是將這些問題直接在網路上找,因為視頻講完或許你也沒找到點。當然,這是一步一步走的,不是直接就將程序擺上去,一點一點改。
    隨著前兩個的成功,我發現自己對於這些代碼有了自信,似乎看透了他們的偽裝,抓住了本質。除此之外,我還意識到自己自從8月份以後,學習能力似乎提高了不少,而且有了更為有效的學習方法。各方面都有了一定的覺醒。除了第一個找了幾個牛頭不對馬嘴的代碼,其他都是根據自己的邏輯寫,邏輯通下來以後,對應語言中某一部分不知道如何翻譯就去網路,其實這幾個套路都一樣或者說數學公式轉化的套路都一樣。
    我還意識到,匯編其實是最難的語言,目前為止所學到的,因為很多都需要自己去定義,去死摳,需要記住大量的指令且不能靈活變通。但是其他的卻只需要將一些對應的記下來就好。python真的挺簡單的。而且,我發現自己今天似乎打開了新世界的大門,我愛上了這種充滿了靈性的東西,充滿了嚴謹的美麗,還有那未知的變化,我發現我似乎愛上了代碼。可能不僅僅局限於python,這些語言都充滿了挑戰性。我覺得當你疑惑的時候,就需要相信直覺,至少我發現它很准

    閱讀全文

    與python最優化演算法相關的資料

    熱點內容
    批處理編譯qt 瀏覽:65
    鐵友app怎麼查詢機票訂單 瀏覽:197
    myeclipselinux破解版 瀏覽:417
    批處理命令語法不正確 瀏覽:889
    pdf合並成一個pdf在線 瀏覽:383
    柱加密區構造要求 瀏覽:514
    地板木龍骨標准跟加密區別 瀏覽:150
    解壓放鬆的好地方河南 瀏覽:965
    搜狗怎麼移動到文件夾 瀏覽:617
    文件自動選擇到文件夾 瀏覽:794
    贈送的app怎麼在ipad下載 瀏覽:508
    頸椎解壓後神經恢復 瀏覽:849
    怎麼看app訂閱扣費 瀏覽:314
    linux系統的負載均衡 瀏覽:419
    遇到挫折解壓視頻 瀏覽:778
    什麼指令看伺服器運行負載 瀏覽:84
    因碩智能門鎖卡片是加密的么 瀏覽:336
    為什麼會伺服器不可用 瀏覽:290
    wow宏命令設置 瀏覽:264
    解壓神器一張紙折疊魔術球 瀏覽:23