是不是機器學習的框架都偏向 Python ?如果是,為什麼?
Python 有哪些特性讓科學計算的開發者們這麼喜歡?
本題已加入知乎圓桌 ?「機器學習 · 學以致用」,更多「機器學習」相關話題討論歡迎關注。
Life is shit(short), go Pythonic
首先當然是因為大家的life都很short,Python作為解釋型語言,雖然跑得比誰都慢,但減少了開發者的工作量。簡單易學的特點催生了龐大的用戶群體和活躍社區,機器學習框架的製作者也是為了走群眾路線讓更多人用,Python比較接地氣。
利用python可以享受很多便捷的數學運算第三方庫,比如NumPy、SciPy,在可視化方面有MatplotLib和SeaBorn,結構化數據操作可以通過Pandas得到R一般的體驗,針對各種垂直領域比如圖像、語音、文本在預處理階段都有很成熟的庫可以調用,人們常說:「就你庫多」。
Python性能方面當然是無法滿足大規模數據訓練的,所以一般企業都是先用Python搭建原型,然後用C++或者JAVA來實現工程化,再用Python封裝留出介面。
總結:好寫、支持全面、好調、速度不慢。
1. Python是解釋語言,這讓寫程序方便不只一點。舉例來說,在C等編譯語言里寫一個矩陣乘法,需要自己分配操作數(矩陣)的內存、分配結果的內存、手動對BLAS介面調用gemm、最後如果沒用smart pointer還得手動回收內存空間。Python幾乎就是import numpy; numpy.dot兩句話的事。
Update (2015-5-7): 當然現在很多面向C/C++庫已經支持託管的內存管理了,這也讓開發過程容易了很多,但解釋語言仍然有天生的優勢——不需要編譯時間。這對機器學習這種需要大量prototyping和迭代的研究方向是非常有益工作效率的。
2. Python的開發生態成熟,有很多非常有用的庫可以用。除了上面說到的NumPy,還有SciPy、NLTK、os(自帶)等等不一而足。Python靈活的語法還使得包括文本操作、list/dict comprehension等非常實用的功能非常容易高效實現(編寫和運行效率都高),配合lambda等使用更是方便。這也是Python良性生態背後的一大原因。相比而言,Lua雖然也是解釋語言,甚至有LuaJIT這種神器加持,但其本身很難做到Python這樣,一是因為有Python這個前輩佔領著市場份額,另一個也因為它本身種種反常識的設計(比如全局變數)。不過借著Lua-Python bridge和Torch的東風,Lua似乎也在寄生興起。
3. 寫程序方便對做機器學習的人很重要。因為經常需要對模型進行各種各樣的修改,這在編譯語言里很可能是牽一髮而動全身的事情,Python里通常可以用很少的時間實現。
4. Python的效率不差。解釋語言的發展已經大大超過許多人的想像。很多比如list comprehension的語法糖都是貼近內核實現的。除了JIT[1]之外,還有Cython可以大幅增加運行效率。最後,得益於Python對C的介面,很多像gnumpy, theano這樣高效、Python介面友好的庫可以加速程序的運行,在強大團隊的支撐下,這些庫的效率可能比一個不熟練的程序員用C寫一個月調優的效率還要高。
[1] 原生Python是不自帶JIT的,想用JIT的同學可以看看PyPy和Numba。(多謝評論中 @劉慎修同學指出)原因很多:
一、python的庫多
有TensorFlow,Theano,scikit-learn,Cognitive Toolkit, Keras
二、數據存儲方便
有sql,hadoop,mangodb,redis,spark
三、數據獲取方便
有Scrapy,beautifulsoup,requests,paramiko
四、數據運算方便
有pandas,Numpy,scipy
四、輸出結果方便
有matplotlib,VisPy
五、和其他語言交互方便
有ctypes,rpy2,Cython,SWIG,PyQt,boost.python
六、加速方便
有pypy,Cython,PyCUDA
七、圖形圖像方便
有PyOpenGL,PyOpenCV,mayavi2
八、信號處理方便
PyWavelets,scipy.signal
九、雲系統支持方便
github,sourceforge,EC2,BAT,HPC
python支持的平台多,包括windows,linux,unix,macos。而matlab太貴,只能調用其api,用python省錢,省錢就是賺錢。
python 的性能差不用來洗白,確實差。
然而它仍然可以流行是它對解決問題非常友好。
這原因其中包括 python 本身的易用優勢和強大的工具庫儲備。
比如:
做安全的想發個探測包,requests 能完全封裝好協議棧的操作,使用者只關心真正需要關心的發給誰發什麼數據,這實際上是非常高效的。
而文本操作也同樣省去了許多不需要重複做的事情。
這一點的誘惑非常大的,雖然技多不壓身,但做研究做探索,時間精力真的很寶貴,python 節約的時間用來思考真正該要解決的問題才是大家需要的。
說到底編程語言只是工具,所謂精通某一門編程語言,是對工具的使用的熟練,懂得處理什麼樣的問題是另外一碼事。
而機器學習的研究就是另外一碼事,對這碼事來說,用什麼不重要,什麼能節約掉不必要的精力開支就用什麼,因為還有更多更重要的事情要做,糾結於編程語言底層如何操作不是這裡要關心的,沒必要也不應該。Matlab是進行研究機器相關研究的最好語言,幾乎沒有之一。然而,價格不菲。於是,學者們將視線轉到了Python。
有個學者是做機器學習的,但不是計算機專業出身。對於他來說,最直接的需求就是,將自己的idea從公式轉化到計算機語言,進行運行即可。這一次轉化,中間所需要做的額外精力越少越好。
那麼首先,在演算法實現的過程中,遵循程序語言的規則和避免程序語言的陷阱是需要耗費精力的:Python語言本身的設計,可以幫助用戶避開數量不少的陷阱,無需考慮申明變數,釋放內存這些非計算專業學者所認為的「瑣事」。
其次,從數學符號轉化到計算機語言這本身,也是需要耗費精力的。如果能提供給研究人員一種錯覺:「寫程序,就是將公式以另一種語言再寫一遍即可」,是比較完美的。Python所能提供的這種錯覺,相對於其他語言,比較偏高。主要依靠Python本身的特色和一些開源的演算法庫。首先,Vector提供了吧,學者理解這個泛型幾乎不需要眨眼吧。然後,全稱量詞什麼的,一個for in也能解釋,雖然有點怪怪的,但也能接受吧。最後,一大波庫襲來,SciPy、Numpy等等。讓寫程序和寫公式一樣酸爽。
到這裡,這個學者有點坐不住了。覺得這個還行,先看看價格,你猜怎麼著,免費!!!!學者立即一拍大腿,就她了。這時候,突然一道亮光閃過,Python女神出現在他的面前:「感謝您選擇Python,我們還有超級大禮包相送哦」
「首先,您發表的論文得有個圖吧,來來來,這裡有個Matplotlib拿去。畫出來的圖特別的萌萌噠。」
「您平時做研究還要做個筆記什麼的吧,來來來,這裡有個ipython notebook拿去,做筆記也萌萌噠。哦,忘了告訴你了。稍微轉化一下,可以用作slideshow。這樣,你去開會的時候,做presentation 也萌萌噠」
「還有哦,我們還提供網路蜘蛛,lambda函數式編程。只要您需要,也會提供哦,免費的哦!!」
「希望您使用愉快!」
這時候,這個學者厚重的眼鏡片下,充滿了淚水。
----以上,根據自己的理解回答了一下。可能有很多不嚴謹的地方,望海涵。本來想正兒八經的回答一下,結果答到後面就越來越不正經了。
python大法好啊,我覺得機器學習框架偏向於python無非以下幾個原因。
(1)簡單易用,用戶基數大
首先python作為解釋型語言,大大減少了開發者的工作量,python的易用性就不多說了,寫過代碼的同學都應該比較清楚。這種易用性導致了python龐大的用戶群體以及繁榮的社區。我覺得任何一個機器學習框架的開發者都希望自己的產品被更多用戶所用,於是python是不二選擇。
(2)豐富的第三方庫
利用python可以享受很多便捷的數學運算第三方庫,比如numpy、scipy,在可視化方面可以調用matplotlib,而且針對各種垂直領域比如圖像、語音、文本在預處理階段都有很成熟的庫可以調用。基於python實現數據挖掘,基本上可以說是站在巨人的肩膀上。
(3)性能問題
python因為是高級解釋型語言,所以在性能方面當然是無法滿足大規模數據訓練的。所以一般企業級業務的演算法都會選擇通過c或者c++來實現,然後通過python進行上層的封裝。這樣就可以解決性能問題,這種方法也適用於各個深度學習框架。
python大法好,這是很多機器學習程序猿的共識,樓上都說了在語言特性方面的有點。在這裡補充一下python和matlab對於深度學習的支持。
Theano:這是一個基於python的開源代碼庫,主要的優勢(相比於matlab的各種工具箱)在於可以利用GPU加速。相比較而言,matlab的GPU支持不夠,這就限制了其在深度學習方面的應用前景。
Python 就像瑞士軍刀,不但短小精悍,而且功能強大,許多疑難雜症的問題,使用Python都能快速解決。 相較於c/c++,python 的代碼相對簡潔非常多,代碼生產效率遠高於c/c++,因此能快速地從實驗結果中進行迭代。舉例來說,如果我要把一個csv檔(my_csv_file.csv),讀入進代碼內進行分析,使用python 只要兩行代碼就能完成。
再舉例來說:
假設有個植物學家收集了三種鳶尾花的品種 setosa, versicolor, virginica 各若干朵,並測量了每朵鳶尾花的萼片長 (sepal
length)、萼片寬 (sepal width)、花瓣長(petal
length)、花瓣寬(petal width)。試問:假設我們看到了新的一朵鳶尾花,我們是否有辦法利用 「萼片長、萼片寬 、花瓣長、花瓣寬」等資訊,來推測此朵鳶尾花是屬於哪一個品種 (setosa, versicolor, virginica)?
這個問題,是非常典型的機器學習的問題,利用植物學家收集的訓練資料進行學習後,對沒見過的花朵進行預測。
在Python 里,只要寫50行以內的代碼,就能輕易地利用機器學習解決此問題。並把機器學習到的決策過程,進行圖表視覺化的呈現。下面,簡單的舉幾個例子,對於學習成果進行解釋:(如下圖所示)
? step1: 如果 petal length &<= 2.45 公分 —&> 則品種是 setosa
? step1,
step2, step3, step4
1. step1 如果 petal length &> 2.45
公分 —&> step2
2. step2 如果 petal width &<= 1.75 公分 —&> step3
3. step3 如果 petal length &<= 4.95 公分 —&> step4
?
step4 如果 petal width &<= 1.65 公分 —&> 則品種是 versicolor
?
step4如果 petal width &> 1.65 公分 —&> 則品種是 virginica
由上述例子,從「資料的匯入」、「資料整理」、「機器學習」、到「視覺化呈現」四個步驟,在短短不到50行的Python 的代碼就能完成。 由此,可以說明使用 Python 來進行機器學習的實驗驗證,是非常有效率,且能快速進行迭代。
Python 除了對傳統的機器學習演算法有完整的支持外,現在最新、最火的深度學習演算法,也能在 Python 里找到相對應的資源。 深度學習框架的鼻祖 theano 在 2009-04-02 就已經進行了 v0.1版的 release,是由 Deep Leaning 大牛 Yoshua Bengio 帶領 Montreal University 的成員進行開發。 其後,近年來隨著深度學習越來越受重視,Google 在 2015-11-9 推出了 tensorflow 的深度學習框架,其開發團隊有一大部分是來自於 theano 的開發團隊。
綜合以上,Python (1) 在資料處理上,有完整的支持套件 (2) 代碼簡潔、快速撰寫 (3) 視覺化呈現工具完整 (4) 傳統機器學習演算法,有完善的支持 (5)
最新的深度學習演算法,有完善的支持,且總是走在最新的發展潮流上。
結論:
- Python 就像瑞士軍刀,不但短小精悍,而且功能強大
- Python 提升代碼生產效率,因此能快速從實驗結果中進行迭代
- Python 很擅長與不同語言進行整合,特別是 c/c++
- Python 有很強大的圖表視覺化工具
- Python 支持許多機器學習演算法,如:決策樹、SVM (支持向量機)
- Python 支持許多深度學習框架,如:theano, tensorflow,
caffe
本回答來自Emotibot數據科學家林志豪
語言特性的話,就兩點。
1、Python是解釋性語言,入門比較簡單,語法比較優美。
2、用Python開發比較快。要知道機器學習的開發,關鍵在於有個想法之後立馬用代碼去實現以驗證演算法的可操作性和優越性。而C++等效率類語言開發慢,且代碼維護難。
-----------------------------------------------------------------------------------------------------------------------------
我個人覺得選擇python最重要的反倒不是其語言特性。而是因為Python的社區比較diverse。而且現在科學計算這塊是Python的大方向。
Python有眾多例如scikit-learn這樣成熟的機器學習包,,並且還有Numpy、Scipy、Pandas、Matplotlib以及Numba、Pypy等可以大幅提神科學計算速度的包。。方便開發人員快速開發機器學習演算法。並且在遇到問題的時候,還可以尋求Python社區裡面大牛的幫主。
-----------------------------------------------------------------------------------------------------------------------------
最後一句,Python大法好。
------------------------------------------------------------------------------------------------------------------------------
真的是最後一句了,人生苦短,我用Python。
其實原因是,搞機器學習的,大部分都不會寫代碼
人生苦短,我用Python。
可以專註與邏輯、演算法本身,而不是糾結於如何實現某個數據結構,自身的數據結構應用也比較簡單方便。
擁有大量的庫。
跨平台。
與c能很好相互調用。
簡潔。
人生苦短,何不用python。首先python是解釋語言,寫程序很方便,所以做研究的人喜歡用它。正如為什麼很多做研究的人用Matlab那樣。出成果才是研究者關心的事情,實現只要方便就行。
然而在性能方面,我拿 python 和 c++ 做個比較。
c++ 的cpu效率是遠遠高於 python 的,這點大家都承認吧。不過 python 是一門膠水語言,它可以和任何語言結合,基於這個優點,很多數據處理的python 庫底層都是 c++ 實現的,意思就是說:你用python寫code,但效率是c++的。只有那些for 循環,還是用python的效率。
近年來機器學習最要是深度學習,而深度學習使用cuda gpu加速遠比cpu要快,而cuda 是c++寫的。所以現在TensorLayer、theano 等深度學習庫都是 python 編程、底層c++。
而那些for 循環的效率,在整體耗時裡面完全可以忽略!
有的人就會說,那為什麼不直接用c++ 寫cuda?不是更快嗎?我想告訴大家,如果沒有多年的cuda經驗,寫出來的代碼效率絕對是個問題。
這就是為什麼大家都用python的原因~其實Python用著比較好的也就那麼幾個, 無非是好學,生產力高, 適合搞科研,做原型。
你看博士最樂意用的matlab不也是這樣嗎。這就像。。。有了微信之後,沒幾個人會用來往一樣。。。
當前主流機器學習框架對 Python 如此青睞的原因眾位答主都分析的差不多了。一門語言背後是一個巨大的平台和特定的使用群體,俗稱膠水語言的 Python 的若干優點只要使用 import this 命令調出內嵌打油詩就能了解個大概。無論以研究、傳播還是商用為目的,機器學習框架從 Python 介面開始對潛在用戶提供支持都是一個不錯的選擇;相關支持越好,使用者就越多,也就會吸引更多的輪子製造者把目光集中到這裡,起到一個持續的正向激勵作用。
話說回來,不少研究人員對 MATLAB 才是真愛,當初 caffe 能積累眾多的用戶和它提供了 MATLAB 介面有很大的關係。
相信很多同為 .mat 真愛粉的朋友對牛津 VGG 組出產的MATCONVNET(https://github.com/vlfeat/matconvnet) 也很熟悉。
除此之外,Torch(https://github.com/torch/torch7) 這個庫在堅守 Lua 陣營多年之後也是推出了 Pytorch 這種經典復刻版以吸引更多使用者。雖然 Python 很好用,不過絕不是唯一選擇。
TensorFlow(https://www.tensorflow.org/), MXNet(https://mxnet.incubator.apache.org/get_started/install.html) 這些流行輪子都在逐步添加對其它車型的支持以適應 Java, R, Julia 等陣營里老司機的開車需要。
另外對那批深度學習造輪子的人而言只有 Python 還不太夠用,C/C++/CUDA 是個繞不開的坎,有興趣的各位可以翻出「史前產品」Decaf(https://github.com/Yangqing/decaf) 以及更老的PyBrain(https://github.com/pybrain/pybrain) 測測速度感受一下。
用過Caffe,TensorFlow,PyTorch。
前面有位仁兄說的很好啊,「人生苦短,不如python。」
首先放個圖!!!!
一、免費!
儘管在學院的時候用用「免費版」的matlab還是可以的,然而到公司後會有明確的規定哪些軟體可以使用,哪些不能,哪些需要向支持部門申請商業授權序列號,還是很嚴格的,至少我在MSRA的時候是這樣。所以,在商業領域大家就不是太在意matlab了,私底下用用但很少放到檯面上。
二、精巧!
我感覺大部分程序員都崇尚一個原則,「LESS IS MORE」。相比matlab動輒幾個G以及很難跨平台移植,python核心程序幾十MB,需要什麼包pip install自動匹配版本和平台,多輕便呀。
三、可移植性!
相比c++這種大型核武器,python這種解釋性語言的天性可以使得它幾乎用一套代碼運行在各個平台。這是非常了不起而且很節約成本的事情,考慮到C/C++的編譯和移植很多設計系統層的函數差異、平台差異、編譯器差異,還是很煩躁的。
四、開發速度!
在c++11出來之前,很多系統層或者文本處理需要基於系統函數或boost再進行位元組處理,輕輕鬆鬆上百行。然而,在python里, e.g.:
with open(filepath, "r") as fp:
----for line in fp:
--------print(line)
就可以自動處理文件句柄的開啟與關閉,讀取文件中每一行的數據,還不用關心到底是"
"還是"
"等平台問題。因此啊,代碼量能夠極大地減少。
五、學術開發!
事實上學術界和工業界的目的是不一致的!學術界所探討的是可能性問題,而工業界是實現性問題。所以,學術界的代碼靈活性很高!經常提出新的想法和實現,如果c++實現的不好改框架是三天兩頭的事情。因此,利用python先看看這個演算法work不work再討論性能的問題。
六、GitHub ArXiv!
因為在學術界,大家基本上都在GitHub開源了論文的實現。基於主流框架-&>基於Python-&>你可以毫不費力的通過這條路復現結果,這很大程度上推動了很多人去學習python和使用python。畢竟,論文的發表周期越來越短,系統越來越複雜,很少有人能直接根據論文提供的信息復現出結果。
七、題外話!
因為很早起python、R、matlab這些語言對機器學習的支持都很不錯。但後來深度學習框架的設計者,caffe選擇了python,torch選擇了lua(一個應用於遊戲的腳本語言),tensorflow選擇了python。隨著深度學習的如火如荼,一下就把python推向了神壇。而後fb也順勢推出了pytorch,幾天內github上的star就幾千了。
用python驗證想法,
再用C++提升性能,
然而,能用的想法卻很少,
哈哈哈哈哈。
所以不是我們不關心速度,
而是還沒到那一步呢。
----
補充一下:
現在大家為了提升python的性能基本上都會用c++對一些運算元編譯成pyd版本,在python里直接調用就好了,比如swig。
Python適合做一些簡單的數據預處理的工作,或者一些只用跑一兩次的簡單的job,但是做核心數據計算跟C++的效率差太多 (Cython可以稍微提速一下,但是中間的坑很多,要想把Cython程序寫快不比直接寫C++容易)。
對於ML來說,主程序至少要跑幾十次,甚至成百上千次,寫程序省下的一點點方便,是跑程序調參數等結果時留下的淚。。。。
隨著C++11/14的新特徵的引用,寫起來也不比python麻煩。做多線程並行也比python要方便很多。python有個方便的特性,直接在交互性解釋器里 敲help 函數或者包之類的就能看到文檔。這幫助了多少懶得背和查文檔的 學問人啊
外行都用C++寫業務了,那我們喝西北風么?
主要有兩個原因。
一是簡便,腳本語言,拿個記事本就能寫,寫完拿控制台就能跑。
二是高效。效率比java、r、matlab高。matlab雖然包也多,但是效率是這四個裡面最低的。推薦閱讀:
※有沒有一段代碼,讓你覺得人類的智慧也可以璀璨無比?
※深度學習方面的學術交流平台?
※985 本科大二,計算機專業,為什麼很多專科的都比自己懂得多?
※在大學四年是否適合讀大磚頭的技術書?