3.4 機器學習庫
spark是基于記憶體的存儲系統,它本質上能提高節點内和節點之間的資料通路速度。這似乎與ml有一種自然契合,因為許多算法需要對資料進行多次傳遞或重新分區。mllib是一個開源庫,但仍有一些私人公司還在不斷按自己的方式來實作mllib中的算法。
在第5章會看到大多數标準機器學習算法可以表示為優化問題。例如,經典線性回歸會最小化回歸直線與實際y值之間的距離平方和:
其中,是由下面的線性表達式所得到的預測值:
a通常稱為斜率,b通常稱為截距。線性優化問題更一般化的公式可以寫成最小化加法函數:
其中,l(w | xi, yi)稱為損失函數,r(w)是正則函數。正則函數增加了模型函數的複雜性,比如參數的數量(或基于此的自然對數)。下表給出了大多數常見的損失函數:
正則化的目的是懲罰更複雜的模型,以避免過拟合和降低泛化錯誤。mllib目前支援如下的正則化:
其中,sign (w)是w中所有元素對應的符号向量。
目前mllib實作了如下的算法:
基本統計
概要統計(summary statistics)
相關性
分層抽樣(stratified sampling)
假設檢驗
流式顯著性檢驗
随機資料生成
分類與回歸
線性模型(svm、logistic回歸和線性回歸)
樸素貝葉斯
決策樹
內建樹(随機森林和梯度提升樹)
保序回歸
協同過濾
交替最小二乘(alternating least squares,als)
聚類
k-means
gaussian混合
power疊代聚類(pic)
隐狄利克雷分布(latent dirichlet allocation,lda)
二分(bisecting)k-means
流式(streaming)k-means
降維
奇異值分解(svd)
主成分分析(pca)
特征提取與變換
頻繁模式挖掘
fp-growth
關聯規則
prefixspan
優化
随機梯度下降(sgd)
有限記憶體bfgs(l-bfgs)
第5章将會介紹其中的一些算法,而更複雜的非結構化機器學習方法将在第6章介紹。
3.4.1 sparkr
r是用流行的s程式設計語言實作的(s語言是當時在貝爾實驗室工作的john chambers所建立的),它目前由r統計計算基金會支援。調查表明r的人氣近年來在不斷增加。sparkr提供了一個輕量級前端來使用基于r的apache spark。從spark 1.6.0開始,sparkr提供了一個分布式dataframe,它支援選擇、過濾、聚合等操作,這與r的dataframe和dplyr類似,但是sparkr處理的是非常大的資料集。sparkr還支援基于mllib的分布式機器學習。
sparkr需要r的3.0版本或更高版本,可通過./bin/sparkr來運作shell。本書将在第8章介紹sparkr。
3.4.2 圖算法:graphx和graphframes
圖算法是其中最難的算法之一,因為若圖本身不能被分割(即它能表示成一組斷開的子圖),那麼圖算法需要在節點之間有恰當的分布。對節點規模高大數百萬的社交網絡上進行分析開始流行的原因是,一些公司(如facebook、谷歌和linkedin)的研究人員已經提出了新的方法來規範圖表示、算法以及問答類型。
graphx是一個圖計算的現代架構,在2013年的一篇論文提出了這種架構(graphx: a resilient distributed graph system on spark by reynold xin, joseph gonzalez, michael franklin和ion stoica, grades(sigmod workshop), 2013)。之前的圖并行架構有pregel和powergraph。graphx中的圖由兩個rdd表示:一個用于表示頂點;另一個用于表示邊。一旦rdd加入,graphx支援類似于pregel的api或類似于mapreduce的api,其中map函數應用于節點的近鄰,而reduce是在map結果之上進行聚合。
在寫本書時,graphx實作了如下的圖算法:
pagerank
連通分量
三角計數
标簽傳播(label propagation)
svd ++(協同過濾)
強連通分量
由于graphx是一個開源庫,是以其修改會被列出來。graphframes是databricks公司給出的一種新的實作,它建構在dataframe之上,完全支援如下這三種語言:scala、java和python。第7章會讨論其具體的實作。