天天看點

《Mahout算法解析與案例實戰》一一3.3 Mean Shift算法

本節書摘來自華章計算機《mahout算法解析與案例實戰》一書中的第3章,第3.3節,作者:樊 哲,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

3.3.1 mean shift算法簡介

mean shift算法,中文可以翻譯為均值偏移或均值漂移,最早是由fukunaga在1975年發表的《the estimation of the gradient of a density function, with application in pattern recognition》中被提出來,這是一篇關于機率密度梯度函數的論文。mean shift最開始的意思是偏移的均值向量,它是一種無參的估計方法,沿着機率梯度上升方向尋找分布的峰值。通俗地講,它是一個這樣的疊代過程:先計算出目前點的偏移均值,移動該點到其偏移均值,然後以此為新的起點,繼續移動,直到滿足一定的條件結束。

mean shift算法的特性之一是該算法不需要提供一個要聚類的數目(k-means聚類算法是需要的),而且該算法還能根據資料的特征發現任意形狀的聚類簇(這點和canopy算法不同,canopy算法發現的是圓形簇)。該算法首先為每個資料建立一個固定半徑的視窗,循環周遊每個視窗,通過一個本地的密度函數計算一個均值漂移向量(這個向量是指向最大增長速度的方向)。然後每個視窗根據計算出來的均值漂移向量移動到一個新的位置,并且開始新的循環。循環退出的條件是當通過本地密度函數計算出來的向量變到很小的時候,滿足一個門檻值就退出。

3.3.2 mahout中mean shift算法實作原理

在mahout中,mean shift算法是通過修改canopy聚類算法得到的。該算法在mahout 中的實作思路如下。

在講解算法前,首先需要了解下面的參數設定:該算法使用距離門檻值t1作為每個視窗的固定半徑,使用距離門檻值t2來決定兩個canopy什麼時候合并為一個(即當兩個canopy的距離小于t2的時候就把它們合并)。每個canopy包含一個或者多個被限制在某個範圍的點(這些點使用整數id來表示)。下面是算法的具體步驟。

1)算法在初始時為每個輸入樣本資料點建立一個canopy。

2)針對每一個canopy,把輸入與目前canopy的距離小于距離門檻值t1的歸為目前canopy(比如,一共有三條記錄,如果它們彼此的距離都小于t1,那麼以第一條記錄為canopy的點有兩個,分别是記錄2和記錄3;以第二條記錄為canopy的點也有兩個,分别是記錄1和記錄3;以第三條記錄為canopy的點也有兩個,分别是記錄1和記錄2)。每一個canopy計算它的均值漂移向量,計算方法:使用每個canopy包含的點的全部次元相加除以包含點的數目就得到了一個新的canopy中心向量,即均值漂移向量。這個中心向量的權重通過它包含的點的數目來表示。

3)針對步驟2中新的canopy計算它們之間的距離,當距離小于門檻值t2時就把它們歸為一個canopy,同時相應的屬性也疊加。

4)算法結束的條件:當每一個canopy的前後兩次的內插補點都滿足小于一個給定的門檻值delta時,該算法結束。

5)算法結束後,剩下的canopy的數目就是聚類的數目。

該算法的流程圖如圖3?14所示。

《Mahout算法解析與案例實戰》一一3.3 Mean Shift算法

這裡的mapper和reducer的操作其實是一樣的,而driver主要是進行循環的觸發和退出循環條件的判斷,在圖3?15中可以詳細地看出該算法的mapper、reducer和driver的主要工作。

mapper主要的工作是根據t1和t2門檻值把canopy進行歸類、合并,然後使用新的中心向量來更新每個canopy,輸出到reducer;reducer根據map的輸出進行與map同樣的操作,然後傳回到driver;driver根據reducer的結果進行判斷,看門檻值是否小于delta(當然循環的次數也是一個條件),然後根據該結果确定退出或繼續循環。

《Mahout算法解析與案例實戰》一一3.3 Mean Shift算法

圖3?15 mean shift算法mapper、reducer和driver工作流

3.3.3 mahout的mean shift算法實戰

1.輸入資料

2.參數意義

mean shift算法在mahout中的使用方式如下:

其中[]包含的兩個參數是可選的。

generic options參數選項和canopy算法一樣,這裡不再介紹,可直接參考相關内容。

job-specific options參數選項包含如下:

--input (-i ) input:任務的輸入檔案選項,必選。

--output (-o) output:任務的輸出檔案的選項,必選。

-- convergencedelta (-cd) convergencedelta:判斷退出循環的門檻值,預設是0.5,可選。

-- maxiter (-x) maxiter:最大的循環次數,必選。

--overwrite (-ow):如果出現,則對輸出路徑進行重寫,可選。

--inputiscanopies (-ic) inputiscanopies:如果出現,則說明輸入已經被轉換為mean-shiftcanopies了,可選。

--distancemeasure (-dm) distancemeasure:距離計算的類名稱,預設為square-euclidean,即歐氏距離平方,可選。

--kernelprofile (-kp) kernelprofile:内部計算方法類,預設是triangularkernelprofile。

--t1 (-t1) t1:t1門檻值,可選。

--t2 (-t2) t2:t2門檻值,可選。

--clustering (-cl):如果出現,則對資料進行分類,可選。

--method (-xm) method:選擇使用的計算方式,單機或叢集,預設為叢集,可選。

--outlierthreshold (-outlierthreshold) outlierthreshold:異常值門檻值,可選。

--help (-h):列印此參數幫助資訊,可選。

--tempdir tempdir:臨時檔案所存放的地方,可選。

--startphase startphase:開始要運作算法的階段,可選。

--endphase endphase:最後要運作算法的階段,可選。

關于inputiscanopies參數的設定:當輸入的樣本資料已經轉換為meanshiftcanopies時,就不需要設定參數,否則就需要設定,然後就是在程式中執行一個inputdriver任務,這個任務就是把輸入轉換為meanshiftcanopies的,且要求輸入中的次元是按照空格來間隔的(一個或多個空格)。

3.運作

通過前面兩個小節的内容,相信讀者已經知道了如何上傳資料,這裡不再贅述。在正式運作該算法的調用指令之前,首先要對輸入資料進行轉換。進入hadoop安裝目錄,執行如下指令:

上面的指令運作完成後,直接運作下面的指令:

繼續閱讀