天天看點

《Scala機器學習》一一3.4 機器學習庫

3.4 機器學習庫

spark是基于記憶體的存儲系統,它本質上能提高節點内和節點之間的資料通路速度。這似乎與ml有一種自然契合,因為許多算法需要對資料進行多次傳遞或重新分區。mllib是一個開源庫,但仍有一些私人公司還在不斷按自己的方式來實作mllib中的算法。

在第5章會看到大多數标準機器學習算法可以表示為優化問題。例如,經典線性回歸會最小化回歸直線與實際y值之間的距離平方和:

《Scala機器學習》一一3.4 機器學習庫

其中,是由下面的線性表達式所得到的預測值:

《Scala機器學習》一一3.4 機器學習庫

a通常稱為斜率,b通常稱為截距。線性優化問題更一般化的公式可以寫成最小化加法函數:

《Scala機器學習》一一3.4 機器學習庫

其中,l(w | xi, yi)稱為損失函數,r(w)是正則函數。正則函數增加了模型函數的複雜性,比如參數的數量(或基于此的自然對數)。下表給出了大多數常見的損失函數:

《Scala機器學習》一一3.4 機器學習庫

正則化的目的是懲罰更複雜的模型,以避免過拟合和降低泛化錯誤。mllib目前支援如下的正則化:

《Scala機器學習》一一3.4 機器學習庫

其中,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章會讨論其具體的實作。

繼續閱讀