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