類似于求條件極值的拉格朗日法。不同的是:先讓約束條件用小于等于不等式表示,且右邊為0。用與朗格朗日法相同的方式構(gòu)造出函數(shù)F=目標(biāo)函數(shù)+lamda*約束條件左端。然對(duì)F的每個(gè)變量求偏導(dǎo)。再解方程組:lamda*Fi=0,其中Fi是F的各個(gè)一階偏導(dǎo)。

網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)介紹好的網(wǎng)站是理念、設(shè)計(jì)和技術(shù)的結(jié)合。成都創(chuàng)新互聯(lián)公司擁有的網(wǎng)站設(shè)計(jì)理念、多方位的設(shè)計(jì)風(fēng)格、經(jīng)驗(yàn)豐富的設(shè)計(jì)團(tuán)隊(duì)。提供PC端+手機(jī)端網(wǎng)站建設(shè),用營(yíng)銷思維進(jìn)行網(wǎng)站設(shè)計(jì)、采用先進(jìn)技術(shù)開(kāi)源代碼、注重用戶體驗(yàn)與SEO基礎(chǔ),將技術(shù)與創(chuàng)意整合到網(wǎng)站之中,以契合客戶的方式做到創(chuàng)意性的視覺(jué)化效果。
1. Pandas.apply() – 特征工程瑰寶
Pandas 庫(kù)已經(jīng)非常優(yōu)化了,但是大部分人都沒(méi)有發(fā)揮它的最大作用。想想它一般會(huì)用于數(shù)據(jù)科學(xué)項(xiàng)目中的哪些地方。一般首先能想到的就是特征工程,即用已有特征創(chuàng)造新特征。其中最高效的方法之一就是Pandas.apply(),即Pandas中的apply函數(shù)。
在Pandas.apply()中,可以傳遞用戶定義功能并將其應(yīng)用到Pandas Series的所有數(shù)據(jù)點(diǎn)中。這個(gè)函數(shù)是Pandas庫(kù)最好的擴(kuò)展功能之一,它能根據(jù)所需條件分隔數(shù)據(jù)。之后便能將其有效應(yīng)用到數(shù)據(jù)處理任務(wù)中。
2. Pandas.DataFrame.loc – Python數(shù)據(jù)操作絕妙技巧
所有和數(shù)據(jù)處理打交道的數(shù)據(jù)科學(xué)家(差不多所有人了!)都應(yīng)該學(xué)會(huì)這個(gè)方法。
很多時(shí)候,數(shù)據(jù)科學(xué)家需要根據(jù)一些條件更新數(shù)據(jù)集中某列的某些值。Pandas.DataFrame.loc就是此類問(wèn)題最優(yōu)的解決方法。
3. Python函數(shù)向量化
另一種解決緩慢循環(huán)的方法就是將函數(shù)向量化。這意味著新建函數(shù)會(huì)應(yīng)用于輸入列表,并返回結(jié)果數(shù)組。在Python中使用向量化能至少迭代兩次,從而加速計(jì)算。
事實(shí)上,這樣不僅能加速代碼運(yùn)算,還能讓代碼更加簡(jiǎn)潔清晰。
4. Python多重處理
多重處理能使系統(tǒng)同時(shí)支持一個(gè)以上的處理器。
此處將數(shù)據(jù)處理分成多個(gè)任務(wù),讓它們各自獨(dú)立運(yùn)行。處理龐大的數(shù)據(jù)集時(shí),即使是apply函數(shù)也顯得有些遲緩。
關(guān)于優(yōu)化Python編程的4個(gè)妙招,青藤小編就和您分享到這里了。如果您對(duì)python編程有濃厚的興趣,希望這篇文章可以為您提供幫助。如果您還想了解更多關(guān)于python編程的技巧及素材等內(nèi)容,可以點(diǎn)擊本站的其他文章進(jìn)行學(xué)習(xí)。
一、概觀scipy中的optimize子包中提供了常用的最優(yōu)化算法函數(shù)實(shí)現(xiàn)。我們可以直接調(diào)用這些函數(shù)完成我們的優(yōu)化問(wèn)題。optimize中函數(shù)最典型的特點(diǎn)就是能夠從函數(shù)名稱上看出是使用了什么算法。下面optimize包中函數(shù)的概覽:1.非線性最優(yōu)化fmin -- 簡(jiǎn)單Nelder-Mead算法fmin_powell -- 改進(jìn)型Powell法fmin_bfgs -- 擬Newton法fmin_cg -- 非線性共軛梯度法fmin_ncg -- 線性搜索Newton共軛梯度法leastsq -- 最小二乘2.有約束的多元函數(shù)問(wèn)題fmin_l_bfgs_b ---使用L-BFGS-B算法fmin_tnc ---梯度信息fmin_cobyla ---線性逼近fmin_slsqp ---序列最小二乘法nnls ---解|| Ax - b ||_2 for x=03.全局優(yōu)化anneal ---模擬退火算法brute --強(qiáng)力法4.標(biāo)量函數(shù)fminboundbrentgoldenbracket5.擬合curve_fit-- 使用非線性最小二乘法擬合6.標(biāo)量函數(shù)求根brentq ---classic Brent (1973)brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出這個(gè)算法的人名bisect ---二分法newton ---牛頓法fixed_point7.多維函數(shù)求根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.實(shí)用函數(shù)line_search ---找到滿足強(qiáng)Wolfe的alpha值check_grad ---通過(guò)和前向有限差分逼近比較檢查梯度函數(shù)的正確性二、實(shí)戰(zhàn)非線性最優(yōu)化fmin完整的調(diào)用形式是:fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)不過(guò)我們最常使用的就是前兩個(gè)參數(shù)。一個(gè)描述優(yōu)化問(wèn)題的函數(shù)以及初值。后面的那些參數(shù)我們也很容易理解。如果您能用到,請(qǐng)自己研究。下面研究一個(gè)最簡(jiǎn)單的問(wèn)題,來(lái)感受這個(gè)函數(shù)的使用方法:f(x)=x**2-4*x+8,我們知道,這個(gè)函數(shù)的最小值是4,在x=2的時(shí)候取到。from scipy.optimize import fmin #引入優(yōu)化包def myfunc(x):return x**2-4*x+8 #定義函數(shù)x0 = [1.3] #猜一個(gè)初值xopt = fmin(myfunc, x0) #求解print xopt #打印結(jié)果運(yùn)行之后,給出的結(jié)果是:Optimization terminated successfully.Current function value: 4.000000Iterations: 16Function evaluations: 32[ 2.00001953]程序準(zhǔn)確的計(jì)算得出了最小值,不過(guò)最小值點(diǎn)并不是嚴(yán)格的2,這應(yīng)該是由二進(jìn)制機(jī)器編碼誤差造成的。除了fmin_ncg必須提供梯度信息外,其他幾個(gè)函數(shù)的調(diào)用大同小異,完全類似。我們不妨做一個(gè)對(duì)比: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給出的結(jié)果是: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.]我們可以根據(jù)給出的消息直觀的判斷算法的執(zhí)行情況。每一種算法數(shù)學(xué)上的問(wèn)題,請(qǐng)自己看書學(xué)習(xí)。個(gè)人感覺(jué),如果不是純研究數(shù)學(xué)的工作,沒(méi)必要搞清楚那些推導(dǎo)以及定理云云。不過(guò),必須了解每一種算法的優(yōu)劣以及能力所及。在使用的時(shí)候,不妨多種算法都使用一下,看看效果分別如何,同時(shí),還可以互相印證算法失效的問(wèn)題。在from scipy.optimize import fmin之后,就可以使用help(fmin)來(lái)查看fmin的幫助信息了。幫助信息中沒(méi)有例子,但是給出了每一個(gè)參數(shù)的含義說(shuō)明,這是調(diào)用函數(shù)時(shí)候的最有價(jià)值參考。有源碼研究癖好的,或者當(dāng)你需要改進(jìn)這些已經(jīng)實(shí)現(xiàn)的算法的時(shí)候,可能需要查看optimize中的每種算法的源代碼。在這里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聰明的你肯定發(fā)現(xiàn)了,順著這個(gè)鏈接往上一級(jí)、再往上一級(jí),你會(huì)找到scipy的幾乎所有源碼!
第一:不需要定義main函數(shù),直接寫就好。
第二:代碼的邏輯也是有問(wèn)題的。一般來(lái)說(shuō),按這樣的框架去寫:
_size, _verbs, A, s = [int(_) for _ in imput().split(' ')], [], ''
for _ in range(_size): A.append(...) # 讀入矩陣所有行
def G:
....實(shí)現(xiàn)特征函數(shù)G
for _ in range(_verbs):
....verb = [int(_) for _ in imput().split(' ')]
.... if verb[0] = 1:
........行翻轉(zhuǎn)
....elif verb[0] = 2:
........列翻轉(zhuǎn)
....else:
........s += G()
print(s)
函數(shù)詳見(jiàn)rres,此代碼使該算法運(yùn)行了兩次
收獲:
這是我第一個(gè)實(shí)現(xiàn)的代碼。學(xué)習(xí)完該算法以后,邏輯框架基本上就有了,剩下需要明確的就是對(duì)應(yīng)的python的語(yǔ)言。于是我就開(kāi)始了查找“如何定義函數(shù)”(詳見(jiàn)mofan的優(yōu)酷),“循環(huán)體”和“if條件語(yǔ)句”的格式()“數(shù)學(xué)符號(hào)”(詳見(jiàn)mofan的優(yōu)酷),以及print的使用
1.def是python中指定義,一般用來(lái)定義函數(shù),如果需要深度學(xué)習(xí)搭建網(wǎng)絡(luò)可用來(lái)定義網(wǎng)絡(luò)。值得注意的一點(diǎn)是
我不清楚為什么,但是如果沒(méi)有加的話,那個(gè)函數(shù)公式就是一個(gè)花瓶,就像一個(gè)結(jié)果輸不出去。
2.最坑的就是邏輯。一開(kāi)始邏輯沒(méi)理清楚,或者說(shuō)在代碼上有疏漏,導(dǎo)致我將left和right放在了循環(huán)體里,結(jié)果可想而知。不過(guò)也是因?yàn)檫@個(gè)錯(cuò)誤,我知道pycharm中的debug怎么用,挺簡(jiǎn)單的,百度一下就出來(lái)了。
3.不知道什么原因,看的莫煩視頻中的print多個(gè)變量一起輸出是沒(méi)有辦法在我的pycharm中使用的,出來(lái)的結(jié)果很奇怪。可能是因?yàn)槲沂莣in10不是ios吧。print如果多個(gè)變量一起輸出必須是print("名字:%s,名字2:%s"%(a,b))結(jié)果輸出就是名字:a ,名字2:b
關(guān)于python中數(shù)據(jù)變量。第一遍運(yùn)行結(jié)果出現(xiàn)很明顯不對(duì),于是我采用了debug。結(jié)果發(fā)現(xiàn),mid1處一直為1而不是1.5,于是就開(kāi)始了解數(shù)據(jù)變量。起初我猜測(cè)python默認(rèn)所有變量為整型,但是根據(jù)二分法的結(jié)果我意識(shí)到此猜測(cè)不對(duì),所以要改整個(gè)file的變量格式?jīng)]有必要。所以我就在mid1式子前面加了一個(gè)float,結(jié)果就顯示為1.5了。但是如果我將整個(gè)式子用()括起來(lái),前面加float,結(jié)果還是1。我不太理解為什么。不過(guò)我知道了python的數(shù)據(jù)格式是根據(jù)輸入量決定的,也就是說(shuō)你的輸入量如果是整型,那么與其直接相關(guān)的計(jì)算輸出結(jié)果一定是整型,而且還是不采用進(jìn)位的整型。在我沒(méi)有采用+float/+.0這兩種方法之前,mid1~3全部是整型。
或者不再mid1前面加float,直接將輸入量后面點(diǎn)個(gè)點(diǎn)就行
真的很想吐槽一下print,好麻煩啊啊啊啊每次都得弄個(gè)%s,而且有時(shí)候還不能放一起!!!!
不要問(wèn)我掌握了什么,要問(wèn)我現(xiàn)在寫完這個(gè)代碼后有多么的愛(ài)python的精度表示 :-)我決定以后只要再編寫數(shù)學(xué)公式的代碼都將輸入量的小數(shù)學(xué)點(diǎn)后面補(bǔ)很多0
fibonacci函數(shù)定義,每次debug后我的手都是抖的O( _ )O~
不知道自己什么時(shí)候有的強(qiáng)迫癥,只要是代碼下面有“~”我就必須要消掉。笑哭。這個(gè)很簡(jiǎn)單,前四個(gè)除了費(fèi)波納茨,都很簡(jiǎn)單。
這個(gè)公式看起來(lái)很麻煩,便寫的時(shí)候更要謹(jǐn)慎。我上回把那個(gè)2擱在了分號(hào)下面,結(jié)果很大,所以還是換算成0.5更好(PS:勿忘那長(zhǎng)河般的0)。
雖然代碼很長(zhǎng),但是主要是因?yàn)閜rint太多。本打算在開(kāi)頭print,最后結(jié)果會(huì)漏掉最后一部分。懶得想其他辦法了,直接就這樣吧
一開(kāi)始while里面寫成了,導(dǎo)致run不出來(lái)。繼而,debug也沒(méi)法用。在網(wǎng)上一查才知道 “沒(méi)聯(lián)網(wǎng)”+“沒(méi)選斷點(diǎn)”。最后想嘗試將else里面的內(nèi)容輸出來(lái),結(jié)果發(fā)現(xiàn)run以后被刷屏了。于是改成i7以后還是不行,于是想著加一個(gè)break跳出循環(huán),結(jié)果成效了。
然后剛剛由debug了一下,才知道原來(lái)是i+1在if里面,因?yàn)闆](méi)有辦法+1,所以i=6一直存在,就不斷循環(huán)。因?yàn)榧觔reak也好,i+1也好,都可以。
這是我第一組自己實(shí)現(xiàn)的python代碼,就是數(shù)學(xué)公式用python語(yǔ)言組裝起來(lái)。剛開(kāi)始的時(shí)候知道大概需要在語(yǔ)言中體現(xiàn)什么,但不太清楚。于是我就在網(wǎng)上找了幾個(gè)二分法的,他們都各有不同,但框架都差不多,不過(guò)如果要用到我們的那個(gè)公式里還需要改變很多。然后我就開(kāi)始分析我們的題,我發(fā)現(xiàn)大體需要兩部分,一部分函數(shù)定義,一部分循環(huán)體。但我不知道如何定義函數(shù),如何寫數(shù)學(xué)公式,如何弄變量,也就是說(shuō)一些小點(diǎn)不太會(huì),所以我選擇直接百度。因?yàn)槲抑雷约洪喿x的能力不錯(cuò),相比于從視頻中提取要素,我更擅長(zhǎng)通過(guò)閱讀獲得要點(diǎn)。有目的性地找知識(shí)點(diǎn),掌握地更牢固。
于是我就開(kāi)始了第一個(gè)——二分法的編寫。我發(fā)現(xiàn),自己出現(xiàn)了很多錯(cuò)誤而且有很多地方都很基礎(chǔ)。但我依然沒(méi)選擇視頻,而是將這些問(wèn)題直接在百度上找,因?yàn)橐曨l講完或許你也沒(méi)找到點(diǎn)。當(dāng)然,這是一步一步走的,不是直接就將程序擺上去,一點(diǎn)一點(diǎn)改。
隨著前兩個(gè)的成功,我發(fā)現(xiàn)自己對(duì)于這些代碼有了自信,似乎看透了他們的偽裝,抓住了本質(zhì)。除此之外,我還意識(shí)到自己自從8月份以后,學(xué)習(xí)能力似乎提高了不少,而且有了更為有效的學(xué)習(xí)方法。各方面都有了一定的覺(jué)醒。除了第一個(gè)找了幾個(gè)牛頭不對(duì)馬嘴的代碼,其他都是根據(jù)自己的邏輯寫,邏輯通下來(lái)以后,對(duì)應(yīng)語(yǔ)言中某一部分不知道如何翻譯就去百度,其實(shí)這幾個(gè)套路都一樣或者說(shuō)數(shù)學(xué)公式轉(zhuǎn)化的套路都一樣。
我還意識(shí)到,匯編其實(shí)是最難的語(yǔ)言,目前為止所學(xué)到的,因?yàn)楹芏喽夹枰约喝ザx,去死摳,需要記住大量的指令且不能靈活變通。但是其他的卻只需要將一些對(duì)應(yīng)的記下來(lái)就好。python真的挺簡(jiǎn)單的。而且,我發(fā)現(xiàn)自己今天似乎打開(kāi)了新世界的大門,我愛(ài)上了這種充滿了靈性的東西,充滿了嚴(yán)謹(jǐn)?shù)拿利悾€有那未知的變化,我發(fā)現(xiàn)我似乎愛(ài)上了代碼。可能不僅僅局限于python,這些語(yǔ)言都充滿了挑戰(zhàn)性。我覺(jué)得當(dāng)你疑惑的時(shí)候,就需要相信直覺(jué),至少我發(fā)現(xiàn)它很準(zhǔn)
當(dāng)前標(biāo)題:python多元函數(shù)優(yōu)化,多元函數(shù)總結(jié)
瀏覽路徑:http://chinadenli.net/article0/dsgjcio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、虛擬主機(jī)、全網(wǎng)營(yíng)銷推廣、響應(yīng)式網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容