引言
在學習Scala的過程中奈应,我發(fā)現(xiàn)其在構(gòu)建大規(guī)模分布式計算系統(tǒng)上有與生俱來的特質(zhì)。其豐富的類型系統(tǒng)可以幫助編程設(shè)計提供很好的信息隱藏和抽象悼吱,其monoids和monads概念利用Scala高階函數(shù)實現(xiàn)計算并行和數(shù)據(jù)處理流水線,其Actor系統(tǒng)幫助編寫可伸縮性的應(yīng)用程序,其實現(xiàn)特定領(lǐng)域語言的優(yōu)勢幫助開發(fā)用戶很好克服不同語言的障礙圃泡。
雖然以上Scala優(yōu)點說起來不會感同身受,但這可以作為我學習的一大動力愿险,讓我開始嘗試編寫并行機器學習系統(tǒng)颇蜡。
在學習過程中,我主要參考《Scala for Machine Learning》一書和相關(guān)網(wǎng)上的資料辆亏。希望這些分享能幫助自己學習风秤,也更好的服務(wù)有興趣的讀者。
為何使用Scala構(gòu)建機器學習系統(tǒng)
抽象
Monoids和Monads是函數(shù)式編程的重要概念扮叨。
Monoids定義了在具有閉包性質(zhì)(property of closure)的數(shù)據(jù)集上的二元操作op缤弦,恒等操作(identity operation)和結(jié)合性(associativity)。
下面是代碼描述:
trait Monoid[T] {
def zero: T
def op(a: T, b: T): T
}
Monoids具有結(jié)合性的操作甫匹。假設(shè)ts1甸鸟、ts2、ts3是三個時間序列兵迅,該性質(zhì)保證ts1+(ts2+ts3) = (ts1+ts2)+ts3抢韭。Monoid的結(jié)合性對于計算流的并行化是很關(guān)鍵的。
Monads可以被認為是容器的結(jié)構(gòu)恍箭,它是Monoids的推廣刻恭。像是Scala標準庫中的List,Map等集合被設(shè)計成monads的結(jié)構(gòu)扯夭。
Monads提供了以下的功能:1. 創(chuàng)建集合鳍贾; 2. 對集合的元素進行轉(zhuǎn)換; 3. 壓平嵌套的集合交洗。
下面是Scala代碼描述:
trait Monad[M[_]] {
def apply[T](a: T): M[T]
def flatMap[T, U](m: M[T])(f: T=>M[U]): M[U]
}
Monads允許集合或者容器連接起來產(chǎn)生一個工作流骑科,該性質(zhì)可以應(yīng)用在任何科學計算中。
可擴展性
Actors系統(tǒng)使得Scala編程變得可伸縮构拳、可擴展咆爽。Actors作為協(xié)程(coroutines),通過異步消息進行通信置森,管理底層的線程池斗埂。
機器學習的工作流被實現(xiàn)成一系列的計算任務(wù),這些任務(wù)包含了Scala的高階方法(如flatMap,map,fold,reduce,collect,join,filter)對數(shù)據(jù)集合的操作凫海,Scala允許actors集群對這些數(shù)據(jù)進行分割來完成計算任務(wù)呛凶。Scala還支持本地或遠程的actor之間進行消息分發(fā)和消息路由。
上圖中行贪,主節(jié)點作為控制器漾稀,管理和調(diào)度四步任務(wù)模闲。這些具體的任務(wù)通過Scala的actors實現(xiàn)的多個工作節(jié)點執(zhí)行。主節(jié)點通過和工作節(jié)點交換消息來管理工作流的執(zhí)行狀態(tài)县好,負責可靠性围橡。通過監(jiān)督actors的層次結(jié)構(gòu)來實現(xiàn)計算任務(wù)的高可用性。
可配置性
Scala支持依賴注入(dependency injection)缕贡,通過抽象變量(abstract variables)翁授、自引用成分(self-referenced composition)和可堆疊的特質(zhì)(stackable traits)的組合來實現(xiàn)。最常用的依賴注入的模式成為cake pattern晾咪,該模式在構(gòu)建動態(tài)計算工作流中經(jīng)常用到收擦。
可維護性
Scala內(nèi)嵌了領(lǐng)域?qū)S谜Z言(Domain Specific Languages,DSL)谍倦。DSLs是在Scala原生庫上建立的語法層塞赂,DSLs允許軟件開發(fā)者抽象計算細節(jié),更好讓使用者理解昼蛀。DSLs最有名的應(yīng)用案例就是在Matlab中的語法形式宴猾。
計算工作流
一個計算工作流(computational workflow)可以分為以下幾個步驟:
- 從文件或數(shù)據(jù)庫中載入數(shù)據(jù)集
- 將數(shù)據(jù)集進行分割,用于并行的數(shù)據(jù)處理
- 運用過濾技術(shù)叼旋、方差分析等進行數(shù)據(jù)預(yù)處理
- 應(yīng)用機器學習模型
在使用訓練數(shù)據(jù)進行分析的過程還需要一些具體的處理:
- 從清洗的輸入數(shù)據(jù)中選擇訓練集仇哆、測試集、驗證集
- 抽取關(guān)鍵特征夫植、利用聚類技術(shù)從一組相似觀測中簡歷親近關(guān)系
- 減少特征數(shù)量讹剔,避免訓練數(shù)據(jù)過擬合
- 重復(fù)進行多次上述步驟來驗證模型和調(diào)整模型
- 將模型進行持久化,用于新觀測數(shù)據(jù)的預(yù)測和處理
- 評估模型表現(xiàn)
轉(zhuǎn)載請注明作者Jason Ding及其出處
Github博客主頁(http://jasonding1354.github.io/)
GitCafe博客主頁(http://jasonding1354.gitcafe.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡書主頁(http://www.reibang.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354進入我的博客主頁