0
機器學(xué)習(xí)的初學(xué)者,普遍需要面對一個問題:
到底學(xué)習(xí)哪個編程語言?
答案可能會讓你驚訝:對高手來說,這關(guān)系不大。只要你了解所選語言的機器學(xué)習(xí)庫和工具,語言本身其實沒那么重要。相當多的機器學(xué)習(xí)庫支持多種編程語言。當然,取決于你在公司中的開發(fā)角色和你需要實現(xiàn)的任務(wù),有些語言、庫和工具會比其他的更高效。下面,我們來看看六大主流機器學(xué)習(xí)語言——R 語言、MATLAB、Python、Java 、C/C++ 和 Lisp。
R 是一個專門設(shè)計來進行數(shù)據(jù)計算的語言工具。在大規(guī)模數(shù)據(jù)挖掘、可視化和報告的應(yīng)用場景中,它處于領(lǐng)先地位。通過 CRAN 資源庫,你能輕易獲得海量工具包,能應(yīng)用于幾乎所有的機器學(xué)習(xí)算法、數(shù)據(jù)測試和分析過程。R 語言用于表達關(guān)系、轉(zhuǎn)化數(shù)據(jù)以及進行并行操作的語法十分優(yōu)雅,但略顯深奧。
雷鋒網(wǎng)消息,KDNuggets 最近的調(diào)查發(fā)現(xiàn),在分析、挖據(jù)和其他數(shù)據(jù)科學(xué)任務(wù)中,R 是最受歡迎、最常用的語言。但近年來 Python 逐漸搶走更多用戶。
KDNuggets 2015 民意調(diào)查: 分析、挖據(jù)和數(shù)據(jù)科學(xué)任務(wù)中最常用的編程語言是 R。
MATLAB 在學(xué)術(shù)界十分普及,這是因為:
它強大的數(shù)學(xué)處理能力;
對代數(shù)、微積分有豐富支持;
支持符號計算;
對不同學(xué)科(從數(shù)字信號處理到計算生物學(xué))有一系列豐富的工具箱。
這門基于矩陣的語言,經(jīng)常應(yīng)用于機器學(xué)習(xí)算法的原型設(shè)計,有時還被用于開發(fā)復(fù)雜的解決方案。它的商用許可特別貴,但對有些企業(yè)用戶來說也許值得,因為它可以大幅減少開發(fā)、研究耗費的時間和精力。AI 大牛吳恩達就推薦初學(xué)者使用 Octave 或 MATLAB 入門。相比之下,Octave 是 MATLAB 的一個免費替代品,它們十分相似,有幾乎相同的語法。只是 Octave 的工具箱更少一些,IDE 也不如 MATLAB 成熟。
雖然 Python 是一門通用型的編程、編寫腳本的語言,但它逐漸在數(shù)據(jù)科學(xué)家和機器學(xué)習(xí)工程師之間流行起來。與 R 和 MATLAB 不同的是,數(shù)據(jù)處理和科學(xué)計算的慣用語法并沒有內(nèi)置于 Python 語言中,但 NumPy、SciPy 和 Pandas 這些庫把 Python 這方面的的功能性提到了與 R 和 MATLAB 同等的水平。還有人認為這使 Python 的語法更易用。
有海量開源框架支持 Python:比如 Scikit-learn、Theano、TensorFlow。這些專業(yè)機器學(xué)習(xí)庫使開發(fā)者訓(xùn)練機器學(xué)習(xí)模型更便捷,有的還能很好地支持分布式計算。通常,這些資料庫中關(guān)乎性能表現(xiàn)的代碼,大多數(shù)仍然用 C 或 C++ 編寫,有的甚至用 Fortran;Python 的角色主要是作為 wrappers 或者 API。R 語言包與之類似。
Python 生態(tài)系統(tǒng)最大的優(yōu)勢在于:用它組合出一個復(fù)雜的端到端產(chǎn)品或服務(wù)比較容易,比如說使用 Django 或 Flask 的網(wǎng)絡(luò)應(yīng)用,還有使用 PyQt 的桌面應(yīng)用,甚至是使用 ROS 的自主機器人代理。
值得一提的是,慕課三巨頭 (edX, Coursera, and Udacity)全都提供了 Python 的入門課程。另外,包括 MIT、加州大學(xué)伯克利分校在內(nèi)的美國頂級學(xué)府,已經(jīng)把 Python 作為計算機新生的必修語言??梢灶A(yù)期,將來會有更多的 IT 頂級名校轉(zhuǎn)向 Python,與之相對的它在工業(yè)界的不斷普及。
總而言之,在機器學(xué)習(xí)領(lǐng)域,Python 是一個全能多面手,許多人認為它是未來的大趨勢。
Java 是大多數(shù)軟件工程師的選擇。這是由于在面向?qū)ο蟮木幊讨?,它干凈、一致的?zhí)行方式;以及使用 JVMs 的平臺獨立性。它犧牲了簡潔和靈活性,以使代碼更清楚明白,并提高可靠性。這使它廣泛應(yīng)用于重要級別較高的企業(yè)軟件系統(tǒng)中。為了維持相同水平的可靠性,并避免編寫出亂七八糟的界面,正在使用 Java 的企業(yè)傾向于在機器學(xué)習(xí)應(yīng)用中繼續(xù)使用該語言。
在分析和設(shè)計原型上,java 有許多很有用的工具和庫(比如 Weka)。除此之外,在開發(fā)大規(guī)模分布式學(xué)習(xí)系統(tǒng)上,Java 有很多一流的選擇:比如 Spark+MLlib, Mahout, H2O 和 Deeplearning4j。騰訊一個月前開源的大數(shù)據(jù)計算平臺 Angel 也是使用的 Java。這些框架/庫對業(yè)界標準的數(shù)據(jù)處理和存儲系統(tǒng)十分友好(比如Hadoop/HDFS),使它們之間的兼容、整合十分方便。
C/C++ 是編寫底層軟件的理想語言,比如操作系統(tǒng)的某部分或網(wǎng)絡(luò)草案。計算速度和內(nèi)存效率在這些應(yīng)用場景中十分關(guān)鍵。出于同樣的原因,它們也是執(zhí)行機器學(xué)習(xí)底層步驟的通用選項。但是,由于缺乏對數(shù)據(jù)處理的慣用抽象化,而且內(nèi)存管理加重了寫代碼的負擔(dān),使它們對初學(xué)者十分不友好。開發(fā)完整的端到端系統(tǒng)中使用 C/C++ 也是一項負擔(dān)。
在嵌入式系統(tǒng)的例子中,比如智能設(shè)備、汽車和傳感器,使用 C 或者 C++ 語言可能是必需的。若現(xiàn)有平臺基礎(chǔ)或特定應(yīng)用已使用了 C/C++,使用它們會更方便。另外,基于 C/C++ 的機器學(xué)習(xí)庫也有不少,比如 LibSVM, Shark 和 mlpack。
這可是 AI 編程語言的祖師。就雷鋒網(wǎng)所知,Lisp 誕生于 1958 年,是有史以來第一個用于 AI 的計算機語言。該語言十分靈活、并可擴展。它的一些屬性,比如快速原型設(shè)計和方便的“宏”使用(macro utility),在 AI 開發(fā)中十分有用。編寫復(fù)雜程序使用 Lisp 相對容易。它是一個能用簡單的方式創(chuàng)造強大算法的語言。
Lisp 有著清楚的映射,用它進行系統(tǒng)性的改變相對容易。它的 Read-eval-print 回路(讀取-求值-輸出的回路,簡稱 REPL)提供了交互性的開發(fā)環(huán)境。動態(tài)類型(Dynamic typing)、condition system 以及強大的對象系統(tǒng)(object system)是 Lisp 主要特點,使它一度成為 AI 領(lǐng)域最常用語言之一。目前雖然在國內(nèi)比較小眾,但業(yè)內(nèi)公認它是最強大的機器學(xué)習(xí)語言之一。
這些語言之外,還有幾個用于數(shù)據(jù)建模和和企業(yè)分析的商業(yè)化產(chǎn)品,它們能在具有更高可控性的數(shù)據(jù)處理環(huán)境中應(yīng)用機器學(xué)習(xí)模型。 RapidMiner, IBM SPSS, SAS+JMP 和 Stata 都屬于這類產(chǎn)品。它們旨在為數(shù)據(jù)分析提供可靠的端到端解決方案,并通常有可編程 API 以及可編寫腳本的語法。
不斷普及的基于機器學(xué)習(xí)的云服務(wù),是該領(lǐng)域的最新發(fā)展。這包括亞馬遜機器學(xué)習(xí),Google Prediction, DataRobot, IBM Watson (沃森) 和 Microsoft Azure。對于把學(xué)習(xí)方案擴展到對海量數(shù)據(jù)的處理,以及用不同模型進行快速測試,它們向客戶提供了解決方案。只要你有堅實的機器學(xué)習(xí)基礎(chǔ),使用新產(chǎn)品或者新平臺就相當于學(xué)習(xí)怎么使用一個新工具。
選擇語言/庫時一個很重要的考慮是如何平衡開發(fā)時間和執(zhí)行時間。如果需要幾個月來開發(fā),一個能在幾分鐘內(nèi)完成數(shù)據(jù)處理的學(xué)習(xí)通道也或許一文不值??焖俚貏?chuàng)建、測試原型非常重要,因為首次嘗試一般都是失敗的,開發(fā)者需要不斷重復(fù)。
這就是為什么有經(jīng)驗的機器學(xué)習(xí)工程師會如此搶手:他們做開發(fā)時,會使用任何用著順手的工具/語言/庫。就雷鋒網(wǎng)所知,在 AI 產(chǎn)品開發(fā)中,這是一個經(jīng)常發(fā)生的場景:用 Python、R 這些高層語言開發(fā)算法原型,然后把方案轉(zhuǎn)移到 Java 或者 C/C++ 上,來生產(chǎn)終端產(chǎn)品。因此,想成為高層次的機器學(xué)習(xí)開發(fā)者,只會一種語言是不夠的。
相關(guān)文章:
谷歌、微軟、OpenAI 等巨頭的七大機器學(xué)習(xí)開源項目 看這篇就夠了
盤點四大民間機器學(xué)習(xí)開源框架:Theano、Caffe、Torch 和 SciKit-learn
BAT 在下一盤大棋?深度盤點國內(nèi)四大機器學(xué)習(xí)開源平臺
IEEE Spectrum公布編程語言最新排行:大數(shù)據(jù)是贏家
Google試水—Go語言也要冒險嘗試機器學(xué)習(xí)?
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。