Mahout kmeans聚類

Mahout? K-means聚類

一、Kmeans 聚類原理

K-means算法是最為經典的基于劃分的聚類方法,是十大經典數據挖掘算法之一。K-means算法的基本思想是:以空間中k個點為中心進行聚類,對最靠近他們的對象歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。

假設要把樣本集分為c個類別,算法描述如下:

(1)適當選擇c個類的初始中心;

(2)在第k次迭代中,對任意一個樣本,求其到c各中心的距離,將該樣本歸到距離最短的中心所在的類;

(3)利用均值等方法更新該類的中心值;

(4)對于所有的c個聚類中心,如果利用(2)(3)的迭代法更新后,值保持不變,則迭代結束,否則繼續迭代。

該算法的最大優勢在于簡潔和快速。算法的關鍵在于初始中心的選擇和距離公式

二、Mahout kmeans實現

?Mahout kmeans MapReduce實現的原理和上述的一致,值得注意的是,Mahout將數據存儲在HDFS,用MapReduce做批量并行的計算。在做kmeans之前,需要將文本用Mahout向量化模塊工具做向量化。計算過程主要分為三個步驟:初始中心選取,尋找簇中心,劃分數據。

(一) 簇定義

簇Cluster是一個實體,保存該簇的關鍵信息。

?privateint id; 簇編號

核心參數:計算完數據后最終的簇屬性

?private long numPoints; 簇中點的個數

?private Vector center; 中心向量 center=

?private Vector radius; 半徑向量?radius =

調整參數:簇中加入一個點后調整的參數

?private double s0; s0=?權重和。對于Kmeansw=1 ,所有s0=numPoints

?private Vector s1;? s1=? x pointw為權重。對kmeansw =1

?private Vector s2 ;? s2=?x pointw為權重。對kmeansw =1

(二) 初始中心點選擇

(1)RandomSeedGenerator 將輸入的向量隨機選擇K個輸出到HDFS作為Kmeans 聚類的初始中心點。

(2)另一種將Canopy計算出的簇中心作為kmeans聚類的初始中心點。

(三) 迭代更新中心

? 通過不斷的迭代,移動簇中心。該過程劃分為兩個部分,一個是簇劃分Job,一個是控制迭代循環。

1.簇劃分Job過程:

????? Map:

Collection<Cluster> clusters = newArrayList<Cluster>()

setUp(){

????? ?????? ?????? ?讀入上一次輸出的全部中心點,填充cluster。

}

Map(WritableComparable<?> key, VectorWritable point){

用KMeansClustererclusterer 將point 劃分到cluster中距離最近的一個cluster中。

輸出: key? clusterID ,value? ClusterObservations

}

}

? Combiner:

?? ?Reduce(key?clusterID ,value? Iterator<ClusterObservations> it ){

?? ? ?????? ?計算同一個cluster的局部參數。

??? }

?? Reduce:

?? ? Reduce(key? clusterID ,value? ClusterObservations){

計算同一cluster的全局參數。

計算cluster的新中心。

對比之前的中心,計算是否收斂。

替換新的中心點作為cluster的中心。

輸出 keyclusterID,value Cluster

}

2.循環過程

?while(!收斂||沒有達到相應的迭代次數){

???? 1.執行迭代Job,輸入全部數據,輸出新的簇中心;

???? 2.判斷是否有簇沒有收斂。只要有一個簇沒有收斂,則斷定為全局不收斂。

?}

(四) 劃分數據

??劃分數據過程是對簡單的,只需要計算向量和所有簇的距離,將其劃分到距離最小的一個簇中。由一個map完成。

Map:

Collection<Cluster> clusters = new ArrayList<Cluster>()

setUp(){

讀取最終收斂的簇,填充clusters。

}

Map(WritableComparable<?> key, VectorWritable point){

?? Double min = 0 ;

?? String clusterID ;

?????? While(cluster :clusters){

????? 計算min;

????? 得到最小距離的clusterID;

????? }

?????? 輸出:clusterID ,point

???? }

三、API說明

API

KMeansDriver.main(args);

--input(-i)

輸入路徑

--outpu(-o)

輸出路徑

--distanceMeasure(-dm)

距離類權限命名,如“org.apache.mahout.common.distance.Cosine

DistanceMeasure”

--clusters(-c)

中心點存儲路徑,如果該路徑下沒有中心點,則隨機生成并寫入該目錄

--numClusters(-k)

簇個數

--convergenceDelta(-cd)

收斂值

--maxIter(-x)

最大迭代次數

--overwrite(-ow)

是否覆蓋上次操作

--clustering(-cl)

是否執行聚類

--method(-xm)

默認”mapreduce”,或”sequential”

?

示例

String? [] arg=?????????? {"-x","10",

?????? ?????? ?????? ?????? ?????? ?????? "-c","kmeans_center",

?????? ?????? ?????? ?????? ?????? ?????? "-i","vector\tfidf-vectors",

?????? ?????? ?????? ?????? ?????? ?????? "-o","kmeans",

??????????????????????? "-dm","org.apache.mahout.common.distance.?? EuclideanDistanceMeasure",

?????? ?????? ?????? ?????? ?????? ?????? "-k","3",

?????? ?????? ?????? ?????? ?????? ?????? "-cd","0.01",

?????? ?????? ?????? ?????? ?????? ?????? "-ow",

?????? ?????? ?????? ?????? ?????? ?????? "-cl",

?????? ?????? ?????? ?????? ?????? ?????? "-xm","mapreduce"};

?????? ?????? KMeansDriver.main(arg);

?

輸出

結果文件

Key類型

Value類型

說明

clusters-*

類id (org.apache.hadoop.io.Text)

類中心

(org.apache.mahout.

clustering.kmeans.Cluster)

每條記錄以類id和類中心表示一個類別

clusteredPoints

類id (org.apache.hadoop.io.IntWritable)

文檔向量

(org.apache.

mahout.clustering.WeightedVectorWritable)

每條記錄中,文檔向量代表文檔,類id代表該文檔所屬類別

注:clusters-*中*代表數字,第i次迭代產生的類信息即為clusters-i

四、參考文獻

?1.《web數據挖掘》

轉載于:https://www.cnblogs.com/cl1024cl/p/6205088.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376983.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Web項目中獲取SpringBean——在非Spring組件中獲取SpringBean

最近在做項目的時候我發現一個問題&#xff1a;Spring的IOC容器不能在Web中被引用(或者說不能被任意地引用)。我們在配置文件中讓Spring自動裝配&#xff0c;但并沒有留住ApplicationContext的實例。我們如果希望在我們的項目中任何位置都能拿到同一個ApplicationContext來獲取…

postgresql對于HashJoin算法的Data skew優化與MCV處理

Data skew 很好理解&#xff0c;即數據傾斜。現實中的數據很多都不是正態分布的&#xff0c;譬如城市人口&#xff0c;東部沿海一個市的人口與西部地區一個市地區的人口相比&#xff0c;東部城市人口會多好幾倍。 postgresql的skew的優化核心思想是"避免磁盤IO"。 優…

JavaScript | 創建對象并通過JavaScript函數在表中顯示其內容

In this example, we created an object named employee with id, name, gender, city, and salary and assigned and displaying the values in the table using JavaScript function. 在此示例中&#xff0c;我們創建了一個名為employee的對象&#xff0c;其對象為id &#x…

基于socket的簡單文件傳輸系統

【實驗目的及要求】 在 Uinx/Linux/Windows 環境下通過 socket 方式實現一個基于 Client/Server 文件傳輸程序。 【實驗原理和步驟】 1. 確定傳輸模式:通過 socket 方式實現一個基于 Client/Server 或 P2P 模式的文件傳輸程序。 2. 如果選擇的是 Client/Server 模式的文件傳輸…

《GPU高性能編程-CUDA實戰》中例子頭文件使用

《GPU高性能編程-CUDA實戰&#xff08;CUDA By Example&#xff09;》中例子中使用的一些頭文件是CUDA中和C中本身沒有的&#xff0c;需要先下載這本書的源碼&#xff0c;可以在&#xff1a;https://developer.nvidia.com/content/cuda-example-introduction-general-purpose-g…

mcq 隊列_人工智能| AI解決問題| 才能問題解答(MCQ)| 套裝1

mcq 隊列1) Which of the following definitions correctly defines the State-space in an AI system? A state space can be defined as the collection of all the problem statesA state space is a state which exists in environment which is in outer spaceA state sp…

Postgresql的HashJoin狀態機流程圖整理

狀態機 可以放大觀看。 HashJoinState Hash Join運行期狀態結構體 typedef struct HashJoinState {JoinState js; /* 基類;its first field is NodeTag */ExprState *hashclauses;//hash連接條件List *hj_OuterHashKeys; /* 外表條件鏈表;list of …

Ajax和Jsonp實踐

之前一直使用jQuery的ajax方法&#xff0c;導致自己對瀏覽器原生的XMLHttpRequest對象不是很熟悉&#xff0c;于是決定自己寫下&#xff0c;以下是個人寫的deom&#xff0c;發表一下&#xff0c;聊表紀念。 Ajax 和 jsonp 的javascript 實現&#xff1a; /*! * ajax.js * …

得到前i-1個數中比A[i]小的最大值,使用set,然后二分查找

題目 有一個長度為 n 的序列 A&#xff0c;A[i] 表示序列中第 i 個數(1<i<n)。她定義序列中第 i 個數的 prev[i] 值 為前 i-1 個數中比 A[i] 小的最大的值&#xff0c;即滿足 1<j<i 且 A[j]<A[i] 中最大的 A[j]&#xff0c;若不存在這樣的數&#xff0c;則 pre…

學習語言貴在堅持

學習語言貴在堅持 轉自&#xff1a;http://zhidao.baidu.com/link?urlr2W_TfnRwipvCDLrhZkATQxdrfghXFpZhkLxqH1oUapLOr8jXW4tScbyOKRLEPVGCx0dUfIr-30n9XV75pWYfK給大家介紹幾本書和別處COPY來的學習C50個觀點 《Thinking In C》&#xff1a;《C編程思想》&#xff1b; 《The…

stl vector 函數_在C ++ STL中使用vector :: begin()和vector :: end()函數打印矢量的所有元素...

stl vector 函數打印向量的所有元素 (Printing all elements of a vector) To print all elements of a vector, we can use two functions 1) vector::begin() and vector::end() functions. 要打印矢量的所有元素&#xff0c;我們可以使用兩個函數&#xff1a;1) vector :: b…

JqueryUI入門

Jquery UI 是一套開源免費的、基于Jquery的插件&#xff0c;在這里記錄下Jquery UI 的初步使用。 第一、下載安裝 下載Jquery,官網&#xff1a;http://jquery.com;  下載Jquery UI&#xff0c;官網&#xff1a;http://jqueryui.com/ Jquery的部署就不說了&#xff0c;說下Jqu…

gp的分布、分區策略(概述)

對于大規模并行處理數據庫來說&#xff0c;一般由單master與多segment組成。 那么數據表的單行會被分配到一個或多個segment上&#xff0c;此時需要想一想分布策略 分布 在gp6中&#xff0c;共有三個策略&#xff1a; 哈希分布 隨機分布 復制分布 哈希分布 就是對分布鍵進行…

[ Java4Android ] Java基本概念

視頻來自&#xff1a;http://www.marschen.com/ 1.什么是環境變量 2.JDK里面有些什么&#xff1f; 3.什么是JRE&#xff1f; 什么是環境變量&#xff1f; 1.環境變量通常是指在操作系統當中&#xff0c;用來指定操作系統運行時需要的一些參數; 2.環境變量通常為一系列的鍵值對&…

_thread_in_vm_Java Thread類的靜態void sleep(long time_in_ms,int time_in_ns)方法,帶示例

_thread_in_vm線程類靜態無效睡眠(long time_in_ms&#xff0c;int time_in_ns) (Thread Class static void sleep(long time_in_ms, int time_in_ns)) This method is available in package java.lang.Thread.sleep(long time_in_ms, int time_in_ns). 軟件包java.lang.Thread…

大規模web服務開發技術(轉)

前段時間趁空把《大規模web服務開發技術》這本書看完了&#xff0c;今天用一下午時間重新翻了一遍&#xff0c;把其中的要點記了下來&#xff0c;權當復習和備忘。由于自己對數據壓縮、全文檢索等還算比較熟&#xff0c;所以筆記內容主要涉及前5章內容&#xff0c;后面的零星記…

IO多路復用的三種機制Select,Poll,Epoll

IO多路復用的本質是通過系統內核緩沖IO數據讓單個進程可以監視多個文件描述符&#xff0c;一旦某個進程描述符就緒(讀/寫就緒)&#xff0c;就能夠通知程序進行相應的讀寫操作。 select poll epoll都是Linux提供的IO復用方式&#xff0c;它們本質上都是同步IO&#xff0c;因為它…

qt中按鈕貼圖

一.QT之QPushButton按鈕貼圖 二.QT之QToolButton按鈕貼圖 一.QT之QPushButton按鈕貼圖具體操作流程 1. Qt Designer中拖入一Tool Button 2. 選擇圖標的圖片放入工程目錄下&#xff0c;如放在Resources內 3. 雙擊工程的Resource Files下的qrc文件&#xff0c;如圖 4. 在彈出的窗…

Ubuntu手動編譯gVim7.3修復終端啟動時與ibus的沖突

個bug伴隨著Ubuntu/ibus的升級苦憋已久&#xff0c;癥狀為終端啟動gvim時卡死&#xff0c;gvim -f可以緩解此問題&#xff0c;但偶爾還是要發作&#xff0c;況且每次末尾托個&也不方便。其實新版gvim已經修復此bug&#xff0c;不過ubuntu安裝包一直沒更新&#xff0c;那我們…

Android Activity類講解(一)

--by CY[kotomifigmail.com] &#xff11;&#xff0e;protected void onCreate(Bundle savedInstanceState) { throw new RuntimeException("Stub!");   } 當創建一個Activity時&#xff0c;系統會自動調用onCreate方法來完成創建工作&#xff0e;該創建工作包括布…