開(kāi)發(fā)人工智能為什么要用Python?
現(xiàn)在Python很熱,熱到什么地步?
我經(jīng)常在App里看到有一條視頻廣告,形式略有不同,但總的來(lái)說(shuō)角色就兩個(gè),一個(gè)很兇的主管和一個(gè)很困擾的下屬,很兇的主管布置了一個(gè)很急的活,困擾的下屬撓耳撓腮,委屈說(shuō)用電子表格根本不可能趕得出來(lái),很兇的主管這時(shí)更兇了,啪啪啪一通操作,說(shuō)用Python只要5分鐘就出來(lái)了,還不快去學(xué)!
我覺(jué)得這條廣告最有意思的地方,在于兩個(gè)角色都西裝革履,一看就很不程序員,更像是習(xí)慣一臉嚴(yán)肅坐在CBD里吹冷氣的商務(wù)人士,以前我以為這是廣告策劃的一個(gè)Bug,每次看到這里都被這反差萌逗樂(lè),直到有一天,有位做金融的朋友問(wèn)我說(shuō)Python好不好學(xué),我才知道Python真的已經(jīng)火出圈了。
先說(shuō)一點(diǎn),雖然現(xiàn)在不管圈里圈外,只要說(shuō)到做數(shù)據(jù)分析、機(jī)器學(xué)習(xí)甚至人工智能,好像已經(jīng)言必稱Python,不過(guò),這些領(lǐng)域并非天生就得是Python,別的不說(shuō),就說(shuō)人工智能。
人工智能領(lǐng)域出了很多語(yǔ)言,如果你早個(gè)幾年學(xué)習(xí)人工智能,可能連Python的影子都看不見(jiàn),大家一般推薦的都是LISP、Prolog,哪怕是業(yè)內(nèi)人士看這些語(yǔ)言都是又古老又偏門,尤其是Prolog,好像除了人工智能就沒(méi)別的地方能見(jiàn)到,但是Prolog做規(guī)則推導(dǎo)有奇效,大家也就一直沿用下來(lái)了。
現(xiàn)在呢?現(xiàn)在不怎么提了,一來(lái)是因?yàn)榛诮y(tǒng)計(jì)的機(jī)器學(xué)習(xí)一直占據(jù)了人工智能的頂流位置,規(guī)則推導(dǎo)說(shuō)得不多,二來(lái)是Python迅速崛起,人稱“人工智能第一語(yǔ)言”,就連規(guī)則推導(dǎo)都可以用Python來(lái)做。
另一個(gè)例子是數(shù)據(jù)分析,早前都是R語(yǔ)言的天下,后來(lái)是R和Python兩分天下,現(xiàn)在人工智能的東風(fēng)一起來(lái),R完全無(wú)法招架Python 迅猛發(fā)展的勢(shì)頭,所以這些前浪就理所當(dāng)然被拍在了沙灘上。
但是,這是結(jié)果,現(xiàn)在我們要問(wèn)的是:為什么Python能成為“人工智能第一語(yǔ)言”呢?
01 Python有哪些優(yōu)點(diǎn)
現(xiàn)在Python很熱,所以介紹Python的文章特別多,大家一定也看膩了諸如Python簡(jiǎn)單易用、靈活性高之類好像說(shuō)了很多,又好像什么都沒(méi)說(shuō)的介紹。我們說(shuō)點(diǎn)接地氣的。
在我來(lái)看,Python最大的優(yōu)點(diǎn)就是“拎包入住”。
如果大家去租房,一定能看到一個(gè)詞,叫“拎包入住”,這個(gè)詞經(jīng)常作為租屋的重要賣點(diǎn),也反映出消費(fèi)者對(duì)租屋的一個(gè)重要需求。
什么叫拎包入住?租房行業(yè)對(duì)這個(gè)詞的準(zhǔn)確定義有爭(zhēng)議,很多人在糾結(jié)家私家電齊全到底是不是等同于拎包入住,不過(guò)意思是清楚的,我作為租客,啥都不用準(zhǔn)備,只需要把行李拉過(guò)來(lái)就可以住下了,這就是拎包入住。
換句話說(shuō),有不少租屋是達(dá)不到拎包入住的標(biāo)準(zhǔn)的,本來(lái)我只是要滿足“住”的需要,可是因?yàn)樽馕輻l件有欠缺,導(dǎo)致我不得不先客串一回裝修師傅,需要先做一些其它的準(zhǔn)備,然后才能做我想要做的事。
好了,說(shuō)回編程語(yǔ)言。很多人喜歡從語(yǔ)言風(fēng)格、語(yǔ)法設(shè)計(jì)甚至語(yǔ)法糖等等角度來(lái)比較編程語(yǔ)言的優(yōu)劣,不過(guò),我更看重另一樣?xùn)|西:生態(tài)環(huán)境。
以前我們說(shuō)C++多么多么爆紅,后來(lái)又說(shuō)Java多么多么爆紅,現(xiàn)在又輪到了Python,到底這些“網(wǎng)紅語(yǔ)言”的成功背后靠的是什么?真的只是因?yàn)榫幊陶Z(yǔ)言自身的優(yōu)秀設(shè)計(jì)嗎?
我認(rèn)為,一款編程語(yǔ)言是否流行,設(shè)計(jì)當(dāng)然是很重要的因素,但生態(tài)環(huán)境的成熟可能是更為直接的原因。我們經(jīng)常能聽(tīng)到的一個(gè)關(guān)于編程的問(wèn)題是,A語(yǔ)言早就已經(jīng)過(guò)時(shí)了,現(xiàn)在已經(jīng)有了新興的B語(yǔ)言,為什么現(xiàn)在還要用A語(yǔ)言開(kāi)發(fā)項(xiàng)目呢?
這個(gè)問(wèn)題通常有兩種可能,一種是項(xiàng)目已經(jīng)用A語(yǔ)言做了大量開(kāi)發(fā),替換成B語(yǔ)言又得高樓平地起,另一種是B語(yǔ)言還太新,某個(gè)專業(yè)領(lǐng)域還沒(méi)有可用的或者好用的庫(kù),同樣也得高樓平地起。這兩種都可以歸結(jié)為同一個(gè)原因:使用B語(yǔ)言并不能拎包入住。
Python的成功,同樣是因?yàn)槟軌蛄喟胱 ?/p>
回想一下前面的廣告,說(shuō)用Python只要5分鐘就能把看似做不完的工作做完,為什么?
不是因?yàn)镻ython語(yǔ)言設(shè)計(jì)有多么多么精巧,別人要寫一萬(wàn)行,Python只要一行就搞定,而是Python有非常成熟的生態(tài)環(huán)境,你扔一個(gè)任務(wù)過(guò)來(lái),用Python不用從頭開(kāi)始,只要找到對(duì)應(yīng)的庫(kù),一句import加幾行代碼,可能結(jié)果就出來(lái)了。
從始至終,你都只需要關(guān)注任務(wù)本身,而不需要思考編程語(yǔ)言怎么處理實(shí)現(xiàn),沒(méi)什么雜七雜八的東西需要浪費(fèi)時(shí)間。這就叫拎包入住。

02 數(shù)據(jù)科學(xué)方向的熱門Python包介紹
都知道Python在人工智能、大數(shù)據(jù)方向很熱,但是,真的有任務(wù)來(lái)了,究竟該用哪些包呢?很多介紹Python的教程,是真的就只介紹Python的語(yǔ)法,語(yǔ)法當(dāng)然很重要,要想使用Python,首先當(dāng)然得掌握語(yǔ)法。
但是,前面我們也進(jìn)行了介紹,Python的優(yōu)勢(shì)在于擁有許多成熟的包,讓你可以“拎包入住”,也即可以專注于任務(wù)本身,所以,我們要用Python,不但需要掌握Python的語(yǔ)法,同時(shí)也要了解都有哪些好用的Python,都可以用來(lái)做什么。
Python好用的包非常多,覆蓋領(lǐng)域也是五花八門,都列出來(lái)反而顯得凌亂,這里我們只介紹數(shù)據(jù)科學(xué)和人工智能方向用得多的包。
首先是pandas。這是數(shù)據(jù)分析用得非常多的包,尤其擅長(zhǎng)各種格式化數(shù)值分析,前面提到的Python廣告只說(shuō)用Python,并沒(méi)有說(shuō)明該使用什么包,不過(guò),既然是替代電子表格進(jìn)行數(shù)據(jù)分析,想必肯定會(huì)用到pandas。
接著是scikit-learn,這個(gè)包寫法很多,也有人喜歡簡(jiǎn)寫為sklearn。這是個(gè)著名的機(jī)器學(xué)習(xí)包。scikit-learn非常好用,推薦大家都試一試,尤其是覺(jué)得機(jī)器學(xué)習(xí)數(shù)學(xué)很難,一看到機(jī)器學(xué)習(xí)幾個(gè)字就產(chǎn)生抵觸心理的同學(xué)。
為什么這么說(shuō)呢?我們都知道,機(jī)器學(xué)習(xí)不是一種方法,而是一個(gè)大框,里面堆滿各種算法模型,譬如線性模型、樹(shù)形模型、支持向量機(jī)模型、以及現(xiàn)在在機(jī)器學(xué)習(xí)領(lǐng)域非常熱門的神經(jīng)網(wǎng)絡(luò)模型。
每一種模型背后都依靠一套復(fù)雜的數(shù)學(xué)邏輯來(lái)支撐模型運(yùn)作。在很多人看來(lái),光是看懂機(jī)器學(xué)習(xí)模型的數(shù)學(xué)表達(dá)式就已經(jīng)十分費(fèi)勁,需要很深的數(shù)學(xué)功底,更不用說(shuō)手推公式和實(shí)戰(zhàn)中使用了。于是,很多人覺(jué)得機(jī)器學(xué)習(xí)“可遠(yuǎn)觀而不可褻玩焉”。
當(dāng)然,這里面有幾個(gè)理解誤區(qū)。是不是需要很深的數(shù)學(xué)功底才能明白機(jī)器學(xué)習(xí)模型的原理呢?未必,機(jī)器學(xué)習(xí)確實(shí)用到很多數(shù)學(xué)知識(shí),不過(guò),我經(jīng)常和大家分享的一個(gè)觀點(diǎn)是:不妨把數(shù)學(xué)看作只是一種語(yǔ)言,是一門外語(yǔ),機(jī)器學(xué)習(xí)的運(yùn)行原理,是用這門外語(yǔ)來(lái)描述,所以我們不太容易看懂。
那怎么辦呢?跨國(guó)交流我們可以找翻譯,同樣,只要有人看懂了機(jī)器學(xué)習(xí)這里的數(shù)學(xué)語(yǔ),然后“翻譯”成中文,也就方便大家看得懂了。這件事我自己做了些嘗試,寫了一本書叫《機(jī)器學(xué)習(xí)算法的數(shù)學(xué)解析和Python實(shí)現(xiàn)》,大家感興趣可以翻翻。
另一個(gè)誤區(qū)就是得把機(jī)器學(xué)習(xí)模型的數(shù)學(xué)原理都學(xué)懂弄通了,最好能手推一遍公式,然后才能知道怎么使用。這個(gè)理解符合我們長(zhǎng)期以來(lái)形成的按部就班的印象,不過(guò),就我看來(lái),使用機(jī)器學(xué)習(xí)和開(kāi)車很像,沒(méi)必要要求司機(jī)都學(xué)會(huì)造車了才能開(kāi)車,況且,造車和開(kāi)車很可能還是并不相同的兩條學(xué)習(xí)曲線,畢竟老技工未必就是老司機(jī)。
如果只是想用機(jī)器學(xué)習(xí)解決問(wèn)題,完全可以另辟蹊徑積累經(jīng)驗(yàn)。方法是什么呢?就是使用scikit-learn,這個(gè)包把常用的熱門的機(jī)器學(xué)習(xí)模型統(tǒng)統(tǒng)做了非常良好的封裝,我們完全可以像調(diào)用黑盒函數(shù)一樣,操作各種機(jī)器學(xué)習(xí)模型來(lái)解決實(shí)際問(wèn)題。
最后就是Pytorch、Tensorflow和Keras這幾個(gè)網(wǎng)紅深度學(xué)習(xí)包,Python這一輪走勢(shì)長(zhǎng)紅,這幾個(gè)深度學(xué)習(xí)包居功甚偉,在背后貢獻(xiàn)了大量流量。
現(xiàn)在是深度學(xué)習(xí)時(shí)代,大家都知道深度學(xué)習(xí)能解決很多以前無(wú)解的問(wèn)題,可是理論設(shè)計(jì)出來(lái)的模型,還得編程實(shí)現(xiàn)才能使用。怎么實(shí)現(xiàn)呢?就用這幾個(gè)包,它們把深度學(xué)習(xí)的各個(gè)部件都已經(jīng)封裝好了,使用者只需要像拼裝樂(lè)高積木一樣,把部件拼裝成完整的模型。
篇幅有限,我就簡(jiǎn)單介紹到這,當(dāng)然,Python的庫(kù)就像是一個(gè)工具倉(cāng)庫(kù),只要你想得到的工作,都可能已經(jīng)有不止一個(gè)成熟的Python庫(kù)可供選擇,譬如說(shuō)一些細(xì)分的機(jī)器學(xué)習(xí)任務(wù),如自然語(yǔ)言處理NLP,就還有好幾個(gè)專門做NLP領(lǐng)域任務(wù)的Python包,又譬如說(shuō)大數(shù)據(jù)用到的一些基礎(chǔ)組件,如Hadoop、Spark,同樣也有專門的Python對(duì)口服務(wù)。
現(xiàn)在大家應(yīng)該感到Python真是個(gè)寶藏男孩,應(yīng)該就能更為理解,為什么開(kāi)發(fā)人工智能要用Python,一項(xiàng)人工智能的工程可能涉及到多個(gè)環(huán)節(jié),而如果選擇使用Python,它可以給你提供一條龍服務(wù)。




























