天天看點

《Spark大資料分析實戰》——3.4節MLlib

本節書摘來自華章社群《spark大資料分析實戰》一書中的第3章,第3.4節mllib,作者高彥傑 倪亞宇,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

3.4 mllib

mllib是建構在spark上的分布式機器學習庫,充分利用了spark的記憶體計算和适合疊代型計算的優勢,将性能大幅度提升。同時由于spark算子豐富的表現力,讓大規模機器學習的算法開發不再複雜。

3.4.1 mllib簡介

mllib是一些常用的機器學習算法和庫在spark平台上的實作。mllib是amplab的在研機器學習項目mlbase的底層元件。mlbase是一個機器學習平台,mli是一個接口層,提供很多結構,mllib是底層算法實作層,如圖3-17所示。

《Spark大資料分析實戰》——3.4節MLlib

mllib中包含分類與回歸、聚類、協同過濾、資料降維元件以及底層的優化庫,如

《Spark大資料分析實戰》——3.4節MLlib

通過圖3-18讀者可以對mllib的整體元件和依賴庫有一個宏觀的把握。

下面對圖3-18中讀者可能不太熟悉的底層元件進行簡要介紹。

blas/lapack層:lapack是用fortran編寫的算法庫,顧名思義,linear algebra package,是為了解決通用的線性代數問題的。另外必須要提的算法包是blas(basic linear algebra subprograms),其實lapack底層是使用了blas庫的。不少計算機廠商都提供了針對不同處理器進行了優化的blas/lapack算法包。

3.4.2 mllib中的聚類和分類

聚類和分類是機器學習中兩個常用的算法,聚類将資料分開為不同的集合,分類對新資料進行類别預測,下面将就兩類算法進行介紹。

1.?聚類和分類

(1)什麼是聚類

聚類(clustering)指将資料對象分組成為多個類或者簇(cluster),它的目标是:在同一個簇中的對象之間具有較高的相似度,而不同簇中的對象差别較大。其實,聚類在人們日常生活中是一種常見行為,即所謂的“物以類聚,人以群分”,其核心思想在于分組,人們不斷地改進聚類模式來學習如何區分各個事物和人。

(2)什麼是分類

資料倉庫、資料庫或者其他資訊庫中有許多可以為商業、科研等活動的決策提供所需要的知識。分類與預測即是其中的兩種資料分析形式,可以用來抽取能夠描述重要資料集合或預測未來資料趨勢。分類方法(classif?ication)用于預測資料對象的離散類别(categorical label);預測方法(prediction)用于預測資料對象的連續取值。

分類流程:新樣本→特征選取→分類→評價

訓練流程:訓練集→特征選取→訓練→分類器

最初,機器學習的分類應用大多都是在這些方法及基于記憶體基礎上所構造的算法。目前,資料挖掘方法都要求具有基于外存以處理大規模資料集合能力,同時具有可擴充能力。

2.?mllib中的聚類和分類

mllib目前已經實作了k-means聚類算法、樸素貝葉斯和決策樹分類算法。這裡主要介紹被廣泛使用的k-means聚類算法和樸素貝葉斯分類算法。

(1)k-means算法

1)k-means算法簡介。

k-means聚類算法能輕松地對聚類問題模組化。k-means聚類算法容易了解,并且能在分布式的環境下并行運作。學習k-means聚類算法,能更容易地了解聚類算法的優缺點,以及其他算法對于特定資料的高效性。

k-means聚類算法中的k是聚類的數目,在算法中會強制要求使用者輸入。如果将新聞聚類成諸如政治、經濟、文化等大類,可以選擇10~20的數字作為k。因為這種頂級類别的數量是很小的。如果要對這些新聞詳細分類,選擇50~100的數字也是沒有問題的。k-means聚類算法主要可以分為三步。第一步是為待聚類的點尋找聚類中心;第二步是計算每個點聚類中心的距離,将每個點聚類到離該點最近的聚類中去;第三步是計算聚類中所有點的坐标平均值,并将這個平均值作為新的聚類中心點。反複執行第二步,直到聚類中心不再進行大範圍的移動,或者聚類次數達到要求為止。

2)k-means示例。

下面的例子中有7名選手,每名選手有兩個類别的比分,a類比分和b類比分如表3-6所示。

《Spark大資料分析實戰》——3.4節MLlib

将1号和4号選手分别作為兩個簇的中心點,下面每一步将選取的點計算和兩個簇中心的歐幾裡德距離,哪個中心距離小就放到哪個簇中,如表3-8所示。

《Spark大資料分析實戰》——3.4節MLlib

第二輪将使用(1.8,2.3)和(4.1,5.4)作為新的簇中心,重複以上的過程。直到疊代次數達到使用者設定的次數終止。最後一輪的疊代分出的兩個簇就是最後的聚類結果。

3)mllib之k-means源碼解析。

mllib中的k-means的原理是:在同一個資料集上,跑多個k-means算法(每個稱為一個run),然後傳回效果最好的那個聚類的類簇中心。初始的類簇中心點的選取有兩種方法,一種是随機,另一種是采用kmeans||(kmeans++的一個變種)。算法的停止條件是疊代次數達到設定的次數,或者在某一次疊代後所有run的k-means算法都收斂。

①?類簇中心初始化。

本節介紹的初始化方法是對于每個運作的k-means都随機選擇k個點作為初始

類簇:

上文對典型聚類算法k-means原理進行介紹,下面将對典型的分類算法樸素貝葉斯算法進行介紹。

(2)樸素貝葉斯分類算法

樸素貝葉斯分類算法是貝葉斯分類算法多個變種之一。樸素指假設各屬性之間是互相獨立的。研究發現,在大多數情況下,樸素貝葉斯分類算法(naive bayes classif?ier)在性能上與決策樹(decision tree)、神經網絡(netural network)相當。貝葉斯分類算法在大資料集的應用中具有方法簡便、準确率高和速度快的優點。但事實上,貝葉斯分類也有其缺點。由于貝葉斯定理假設一個屬性值對給定類的影響獨立于其他的屬性值,而此假設在實際情況中經常是不成立的,則其分類準确率可能會下降。

樸素貝葉斯分類算法是一種監督學習算法,使用樸素貝葉斯分類算法對文本進行分類,主要有兩種模型,即多項式模型(multinomial model)和伯努利模型(bernoulli model)。mllib使用的是被廣泛使用的多項式模型。本書将以一個實際的例子來簡略介紹使用多項式模型的樸素貝葉斯分類算法。

在多項式模型中,設某文檔d=(t1,t2,…,tk),tk是該文檔中出現過的單詞,允許重複。

先驗機率p(c) = 類c下單詞總數/整個訓練樣本的單詞總數

類條件機率p(tk|c) = (類c下單詞tk在各個文檔中出現過的次數之和+1)

v是訓練樣本的單詞表(即抽取單詞,單詞出現多次,隻算一個),|v|則表示訓練樣本包含多少種單詞。p(tk|c)可以看作是單詞tk在證明d屬于類c上提供了多大的證據,而p(c)則可以認為是類别c在整體上占多大比例(有多大可能性)。

給定一組分好類的文本訓練資料,如表3-10所示。

給定一個新樣本(河北河北河北吉林香港),對其進行分類。該文本用屬性向量表示為d=(河北, 河北, 河北, 吉林, 香港),類别集合為y={yes, no}。

《Spark大資料分析實戰》——3.4節MLlib

類yes下總共有8個單詞,類no下總共有3個單詞,訓練樣本單詞總數為11,是以p(yes)=8/11, p(no)=3/11。類條件機率計算如下:

分母中的8,是指yes類别下textc的長度,也即訓練樣本的單詞總數,6是指訓練樣本有河北、北京、上海、廣東、吉林、香港,共6個單詞,3是指no類下共有3個單詞。

有了以上類條件機率,開始計算後驗機率:

比較大小,即可知道這個文檔屬于類别河北。

繼續閱讀