1. 程式人生 > >Mahout機器學習平臺之聚類演算法詳細剖析(含例項分析)

Mahout機器學習平臺之聚類演算法詳細剖析(含例項分析)

第一部分:

學習Mahout必須要知道的資料查詢技能:

學會查官方幫助文件:

解壓用於安裝檔案(mahout-distribution-0.6.tar.gz),找到如下位置,我將該檔案解壓到win7Gmahout資料夾下,路徑如下所示:

G:\mahout\mahout-distribution-0.6\docs

學會查原始碼的註釋文件:

方案一:用maven建立一個mahout的開發環境(我用的是win7,eclipse作為整合開發環境,之後在Maven Dependencies中找到相應的jar包《這些多是.class檔案》,記得將原始碼檔案解壓到自己硬碟的一個資料夾中,之後填寫原始碼的檔案路徑即可)

方案二:直接用eclipse建立一個java工程,將解壓縮的原始碼檔案新增到這個工程,既可以檢視。

Mahout官網:

Mahout中的Shell命令進行操作:

       /bin/mahout  方法名  -h

第二部分:

資料探勘(機器學習)——聚類演算法的簡介(怎樣使用各種聚類演算法):

1. 選擇聚類演算法,所面臨的常見問題又哪些?

1不同形狀的資料集。不同形狀的資料集,也需要採取不同的度量策略,或者不同的聚類演算法。

2不同的資料次序。相同資料集,但資料輸入次序不同,也會造成聚類的結果的不同。

3噪聲。不同的演算法,對噪聲的敏感程度不同。

2. 在高維的歐式空間,什麼是“維數災難”?

在高維下,所有點對的距離都差不多(如歐式距離),或者是幾乎任意兩個向量都是正交(利用夾角進行進行度量),這樣聚類就很困難。

3. 常見的聚類演算法的策略有哪些?

1)層次或凝聚式聚類。採取合併的方式,將鄰近點或簇合併成一個大簇。

2)點分配。每次遍歷資料集,將資料分配到一個暫時適合的簇中,然後不斷更新。

4. 層次聚類演算法的複雜度是多少?

每次合併,都需計算出兩個點對之間的距離,複雜度是O(n^2),後續步驟的開銷,分佈正比與O((n-1)^2), O((n-2)^2)...,這樣求和算下來,演算法複雜度是O(n^3).

演算法優化:

採用優先佇列/最小堆來優化計算。優先佇列的構建,第一步需要計算出每兩個點的距離,這個開銷是

O(N^2).一般情況下,N個元素,單純的優先佇列的構建開銷為ON),若是N^2個距離值,則建堆的開銷是O(N^2)

第二步,合併,合併需要一個刪除、計算和重新插入的過程。因為合併一個簇對,就需要更新N個元素,開銷為O(N*logN)。總的開銷為O((N^2) * logN).

所以,總的演算法複雜度為O((N^2) * logN).


5. 歐式空間與非歐式空間下,常見的簇之間的距離度量有哪些?

歐式空間:

1)兩個簇之間的質心之間的距離最小

2)兩個簇中所有點之間的最短距離

3)兩個簇之間所有點對的平均距離

4)將具有最小半徑的兩個簇進行合併,簇的半徑:簇內的點到質心的最大距離

5)將具有最小直徑的兩個簇進行合併,簇的直徑:簇內任意兩點間的最大距離

非歐式空間,簇的中心點定義,該點距離其他點的距離最近,如何計算?

1)該點到簇中其他所有點的距離之和(求和),1-範數

2)該點到簇中其他點的最大距離(最大值),無窮-範數

3)該點到簇中其他點的平方和(平方和),2-範數

6. k-meansk均值演算法

點分配式的聚類演算法。一般用於球形或凸集的資料集

演算法步驟如下:

1)初始化k個選擇點作為最初的k個簇的中心

2)計算每個點分別到k個簇的中心,並將點分配到其距離最近的簇中

3)由分配的點集,分別更新每個簇的中心,然後回到2,繼續演算法,直到簇的中心變化小於某個閾值

7. k-means演算法的兩個問題?

1)初始化選擇點;常用的方式是儘量選擇距離比較遠的點(方法:依次計算出與已確定的點的距離,並選擇距離最大的點),或者首先採取層次聚類的方式找出k個簇

2)如何選取k值;k值選取不當,會導致的問題?當k的數目低於真實的簇的數目時,平均直徑或其他分散度指標會快速上升可以採用多次聚類,然後比較的方式。多次聚類,一般是採用1, 2, 4, 8...數列的方式,然後找到一個指標在v/2, v時,獲取較好的效果,然後再使用二分法,在[v/2, v]之間找到最佳的k值。

8. CURE演算法

使用場景:

任何形狀的簇,如S形、環形等等,不需要滿足正態分佈,歐式空間,可以用於記憶體不足的情況

特徵:

簇的表示不是採用質心,而是用一些代表點的集合來表示。

演算法步驟:

1)初始化。抽取樣本資料在記憶體中進行聚類,方法可以採用層次聚類的方式,形成簇之後,從每個簇中再選取一部分點作為簇的代表點,並且每個簇的代表點之間的距離儘量遠。對每個代表點向質心移動一段距離,距離的計算方法:點的位置到簇中心的距離乘以一個固定的比例,如20%

2對簇進行合併。當兩個簇的代表點之間足夠近,那麼就合併這兩個簇,直到沒有更足夠接近的簇。

3)點分配。對所有點進行分配,即將點分配給與代表點最近的簇。

9. GRGPF演算法

場景:

非歐式空間,可用於記憶體不足的情況(對資料抽樣)

特徵:

同時使用了層次聚類和點分配的的思想。

如何表示簇?

資料特徵:簇包含點的數目,簇中心點,離中心點最近的一些點集和最遠的一些點集,ROWSUM(p)即點p到簇中其他店的距離平方和。靠近中心的點集便於修改中心點的位置,而遠離中心的點便於對簇進行合併。

簇的組織:類似B-樹結構。首先,抽取樣本點,然後做層次聚類,就形成了樹T的結構。然後,從樹T中選取一系列簇,即是GRGPF演算法的初始簇。然後將T中具有相同祖先的簇聚合,表示樹中的內部節點。

點的分配:對簇進行初始化之後,將每個點插入到距離最近的那個簇。

具體處理的細節更為複雜,如果對B-樹比較瞭解,應該有幫助。

10. 流聚類,如何對最近m個點進行聚類?

N個點組成的滑動視窗模型,類似DGIM演算法中統計1的個數。

1)首先,劃分桶,桶的大小是2的次冪,每一級桶的個數最多是b個。

2)其次,對每個桶內的資料進行聚類,如採用層次聚類的方法。

3)當有新資料來臨,需要新建桶,或者合併桶,這個類似於GDIM,但除了合併,還需要合併簇,當流內聚類的模型變化不是很快的時候,可以採取直接質心合併的方式。

4)查詢應答:對最近的m個點進行聚類,當m不在桶的分界線上時,可以採用近似的方式求解,只需求出包含m個點的最少桶的結果。

第三部分:

Mahout中實現常用距離的計算:以下摘自mahout-core-0.6.jar包中


對以上進行距離進行解析:

 

皮爾森相關度

類名:PearsonCorrelationSimilarity

原理:用來反映兩個變數線性相關程度的統計量

範圍:[-1,1],絕對值越大,說明相關性越強,負相關對於推薦的意義小。

說明:1不考慮重疊的數量;2如果只有一項重疊,無法計算相似性(計算過程被除數有n-1);3如果重疊的值都相等,也無法計算相似性(標準差為0,做除數)。

該相似度並不是最好的選擇,也不是最壞的選擇,只是因為其容易理解,在早期研究中經常被提起。使用Pearson線性相關係數必須假設資料是成對地從正態分佈中取得的,並且資料至少在邏輯範疇內必須是等間距的資料。Mahout中,為皮爾森相關計算提供了一個擴充套件,通過增加一個列舉型別(Weighting)的引數來使得重疊數也成為計算相似度的影響因子。

歐式距離相似度

類名:EuclideanDistanceSimilarity

原理:利用歐式距離d定義的相似度ss=1 / (1+d)

範圍:[0,1],值越大,說明d越小,也就是距離越近,則相似度越大。

說明:同皮爾森相似度一樣,該相似度也沒有考慮重疊數對結果的影響,同樣地,Mahout通過增加一個列舉型別(Weighting)的引數來使得重疊數也成為計算相似度的影響因子。

餘弦相似度

類名:PearsonCorrelationSimilarityUncenteredCosineSimilarity

原理:多維空間兩點與所設定的點形成夾角的餘弦值。

範圍:[-1,1],值越大,說明夾角越大,兩點相距就越遠,相似度就越小。

說明:在數學表達中,如果對兩個項的屬性進行了資料中心化,計算出來的餘弦相似度和皮爾森相似度是一樣的,在mahout中,實現了資料中心化的過程,所以皮爾森相似度值也是資料中心化後的餘弦相似度。另外在新版本中,Mahout提供了UncenteredCosineSimilarity類作為計算非中心化資料的餘弦相似度。

Spearman秩相關係數

類名:SpearmanCorrelationSimilarity

原理:Spearman秩相關係數通常被認為是排列後的變數之間的Pearson線性相關係數。

範圍:{-1.0,1.0},當一致時為1.0,不一致時為-1.0

說明:計算非常慢,有大量排序。針對推薦系統中的資料集來講,用Spearman秩相關係數作為相似度量是不合適的。

曼哈頓距離

類名:CityBlockSimilarity

原理:曼哈頓距離的實現,同歐式距離相似,都是用於多維資料空間距離的測度

範圍:[0,1],同歐式距離一致,值越小,說明距離值越大,相似度越大。

說明:比歐式距離計算量少,效能相對高。

Tanimoto係數

類名:TanimotoCoefficientSimilarity

原理:又名廣義Jaccard係數,是對Jaccard係數的擴充套件,等式為

範圍:[0,1],完全重疊時為1,無重疊項時為0,越接近1說明越相似。

說明:處理無打分的偏好資料。

對數似然相似度

類名:LogLikelihoodSimilarity

原理:重疊的個數,不重疊的個數,都沒有的個數

範圍:具體可去百度文庫中查詢論文《Accurate Methods for the Statistics ofSurprise and Coincidence

說明:處理無打分的偏好資料,比Tanimoto係數的計算方法更為智慧。

Mahout中聚類實現的演算法:

官網演算法Clustering演算法摘錄:

·        Canopy Clustering -single machine/MapReduce (deprecated, will beremoved once Streaming k-Means is stable enough)

·        Spectral Clustering -

原始碼中聚類演算法的實現:以下摘自mahout-core-0.6.jar包中


對以上各種聚類類的解析:

 

第四部分:

Mahout進行例項分析(K-meanscanopyfuzzy k-means

步驟簡介:

A、資料轉換及相應的命令簡介

BK-meanscanopyfuzzy k-means命令,引數簡介

Cmahout操作k-meanscanopyfuzzy k-means聚類的詳細命令

D、用K-means演算法進行操作,之後用R進行視覺化操作

詳細步驟:

A、資料轉換及相應的命令簡介

Mahoutorg.apache.mahout.clustering.conversion.InputDriver

作用:這個類,是將文字檔案中(.txt格式)用空格分隔的浮點型數字轉換為Mahout中的序列檔案(VectorWritable型別),這個型別適合叢集任務,有些Mahout任務,則需要任務是一般型別。

原始碼的位置mahout-integration-0.6.jar

命令使用mahoutorg.apache.mahout.clustering.conversion.InputDriver       http://  \

–i  /user/hadoop/mahout6/p04-17.txt         \

-o  /user/hadoop/mahout6/vecfile       \

-v  org.apache.mahout.math.RandomAccessSparseVector


對於文字資料,資料處理及相關的類(註解文字轉換為序列檔案序列檔案轉換為向量檔案,下面幾個類,主要是對文字檔案進行挖掘時用):


向量文字型別(向量檔案的儲存方式):

BK-meanscanopyfuzzy k-means命令,引數簡介

Mahoutk-means命令使用引數簡介:


Mahoutcanopy命令使用引數簡介:


Mahoutfuzzy k-means命令使用引數簡介:


Cmahout操作k-meanscanopyfuzzy k-means聚類的詳細命令

Mahout之資料預處理:

mahoutorg.apache.mahout.clustering.conversion.InputDriver \

–i  /user/hadoop/mahout6/p04-17.txt         \

-o  /user/hadoop/mahout6/vecfile       \

-v  org.apache.mahout.math.RandomAccessSparseVector

Mahoutk-means命令:

mahout kmeans -i /user/hadoop/mahout6/vecfile -o/user/hadoop/mahout6/result1 -c /user/hadoop/mahout6/clu1 -x 20 -k 2 -cd 0.1-dm org.apache.mahout.common.distance.SquaredEuclideanDistanceMeasure -cl

Mahoutcanopy命令:

mahout canopy -i /user/hadoop/mahout6/vecfile -o /user/hadoop/mahout6/canopy-result-t1 1 -t2 2 –ow

Mahoutfuzzy k-means命令:

mahoutfkmeans -i /user/hadoop/mahout6/vecfile

-o/user/hadoop/mahout6/fuzzy-kmeans-result

-c/user/hadoop/mahout6/fuzzy-kmeans-centerpt -m 2 -x 20 -k 2 -cd 0.1

-dmorg.apache.mahout.common.distance.SquaredEuclideanDistanceMeasure -ow -cl

D、用K-means演算法進行操作,之後用R進行視覺化操作(匯出K-means演算法生成的資料)

聚類結果分析:

 


資料匯出命令幫助文件資訊:



例項命令列如下所示(本案例指令碼是用mahoutk-means演算法生成的資料匯出):

將資料轉換為CSV格式:

mahoutclusterdump -s /user/hadoop/mahout6/result2/clusters-1-final -p/user/hadoop/mahout6/result2/clusteredPoints -o /home/hadoop/cluster1.csv -ofCSV

將資料轉換為TXT格式:

mahoutclusterdump -s /user/hadoop/mahout6/result2/clusters-1-final -p/user/hadoop/mahout6/result2/clusteredPoints -o /home/hadoop/cluster1.txt -ofTEXT

匯出後的資料格式:



R語言進行效果展示(輸出的資料格式可以參考上圖所示):

mahoutkmeans -i /user/hadoop/mahout6/vecfile -o /user/hadoop/mahout6/resultTest2 -c/user/hadoop/mahout6/cluTest1-x 20 -cd 0.00001 -dmorg.apache.mahout.common.distance.SquaredEuclideanDistanceMeasure -cl

mahoutclusterdump -s /user/hadoop/mahout6/result2/clusters-1-final -p/user/hadoop/mahout6/result2/clusteredPoints -o /home/hadoop/cluster1.csv -ofCSV


將上面聚類生成的四個資料進行處理,分成四個檔案,之後按如下R程式碼進行視覺化處理:

R參考程式碼:

> c1<-read.csv(file=\"2/cluster1.csv\",sep=\",\",header=FALSE)

> c2<-read.csv(file=\"2/cluster2.csv\",sep=\",\",header=FALSE)

> c3<-read.csv(file=\"2/cluster3.csv\",sep=\",\",header=FALSE)

> c4<-read.csv(file=\"2/cluster4.csv\",sep=\",\",header=FALSE)

> y<-rbind(c1,c2,c3,c4)

> cols<-c(rep(1,nrow(c1)),rep(2,nrow(c2)),rep(3,nrow(c3)),rep(4,nrow(c4)))

> plot(y, col=c(\"black\",\"blue\")[cols])

> q()

> plot(y, col=c(\"black\",\"blue\",\"green\",\"yellow\")[cols])

> center<-matrix(c(0.764, 0.182,0.369, 0.378,0.749, 0.551,0.422, 0.671),ncol=2,byrow=TRUE)

> points(center, col=\"violetred\", pch = 19)

 

第四部分:

資料預處理遇到的問題(輸入如下命令報錯):

mahoutorg.apache.mahout.clustering.conversion.InputDriver \

–i  /user/hadoop/mahout6/p04-17.txt         \

-o  /user/hadoop/mahout6/vecfile       \

-v  org.apache.mahout.math.RandomAccessSparseVector


問題解決方案(檢視原始碼——詳細方法請參看文章開始):

這個類(mahoutorg.apache.mahout.clustering.conversion.InputDriver)位置位於原始碼中的mahout-integration-0.6.jarjar包下,如上圖所示:

英文解析:(摘錄原始碼註釋檔案)
This class converts text files containing 
space-delimited floating point numbers intoMahout sequence files of VectorWritable suitable for input to the clusteringjobs in particular, and any Mahout job requiring this input in general.

中文解析:(摘自原始碼註釋檔案)這個類,是將文字檔案中(.txt格式)用空格分隔的浮點型數字轉換為Mahout中的序列檔案(VectorWritable型別),這個型別適合叢集任務,有些Mahout任務,則需要任務是一般型別。

mahout org.apache.mahout.clustering.conversion.InputDriver在原始碼中的位置:


謝謝您的檢視,如有問題,請留言!!!!

參考文獻:

http://mahout.apache.org/users/clustering/fuzzy-k-means-commandline.html

相關推薦

Mahout機器學習平臺演算法詳細剖析例項分析

第一部分: 學習Mahout必須要知道的資料查詢技能: 學會查官方幫助文件: 解壓用於安裝檔案(mahout-distribution-0.6.tar.gz),找到如下位置,我將該檔案解壓到win7的G盤mahout資料夾下,路徑如下所示: G:\mahout\mahout

機器學習 K-means 演算法 C++

筆記: 尚未解決的問題 :     1. 只支援二維,而不支援三維或更高,需要模板元     2. 尚未實現如何刪除極端點, 即預處理     3. 尚未視覺化 編譯環境 Ubuntu gcc 5.4 編譯選項  g++ -std=c++14 #include &l

機器學習sklearn19.0演算法——Kmeans演算法

一、關於聚類及相似度、距離的知識點 二、k-means演算法思想與流程 三、sklearn中對於kmeans演算法的引數 四、程式碼示例以及應用的知識點簡介 (1)make_blobs:聚類資料生成器 sklearn.datasets.m

機器學習sklearn19.0演算法——層次AGNES/DIANA、密度(DBSCAN/MDCA)、譜

一、層次聚類 BIRCH演算法詳細介紹以及sklearn中的應用如下面部落格連結: http://www.cnblogs.com/pinard/p/6179132.html http://www.cnblogs.com/pinard/p/62

機器學習】常用演算法原型

1. 聚類簡介 在機器學習中,分為監督學習、無監督學習和半監督學習。前一篇部落格中提到的迴歸和分類都屬於監督學習,本文著重探討無監督學習中的聚類演算法。 博主之前看過一些資料,這兩天也翻閱了網上的各大部落格後,也想總結一下,寫一寫聚類相關的知識點,對

[機器學習]t-SNE演算法實踐指南

Saurabh是一名資料科學家和軟體工程師,熟練分析各種資料集和開發智慧應用程式。他目前正在加州大學伯克利分校攻讀資訊和資料科學碩士學位,熱衷於開發基於資料科學的智慧資源管理系統。 介紹 許多資料科學家經常面對的問題之一:假設有一個包含數百個特徵(變數)的資料集,且對資料所屬的域沒有任何瞭解,需要對該資

機器學習中的演算法演變及學習筆記

【說在前面】本人部落格新手一枚,象牙塔的老白,職業場的小白。以下內容僅為個人見解,歡迎批評指正,不喜勿噴![認真看圖][認真看圖] 【補充說明】聚類演算法可以作為獨立方法將資料聚成不同簇,也可以作為資料探勘任務(例如分類、關聯規則等)的預處理! 【補充說明】聚類演算法與分類演算法的主要區別在於訓練時的樣本有無

吳恩達機器學習演算法的引數選擇以及優化

對於K(k<樣本量的)均值聚類,一般引數的自定義主要有兩個,一個是聚類中心初始位置的選擇,二是K值的選擇 優化目標:每個樣本點到該點聚類中心的平方的累加 解決聚類中心的初始化問題: 隨機挑選樣本點作為聚類中心,這個過程重複50-1000次,選出J值最低的(通常K值為2-10的時候

機器學習演算法層次

層次聚類也叫連通聚類方法,有兩個基本方法:自頂而下和自底而上。自頂而將所有樣本看做是同一簇,然後進行分裂。自底而上將初所有樣本看做不同的簇,然後進行凝聚。這種聚類的中心思想是:離觀測點較近的點相比離觀測點較遠的點更可能是一類。 這種方法首先會生成下面的樹

機器學習——K-均值K-means演算法

本文轉載自:https://www.cnblogs.com/ybjourney/p/4714870.html 一 K-均值聚類(K-means)概述 聚類 “類”指的是具有相似性的集合。聚類是指將資料集劃分為若干類,使得類內之間的資料最為相似,各類之間的資料相

機器學習筆記演算法及實踐K-Means,DBSCAN,DPEAK,Spectral_Clustering

這一週學校的事情比較多所以拖了幾天,這回我們來講一講聚類演算法哈。 首先,我們知道,主要的機器學習方法分為監督學習和無監督學習。監督學習主要是指我們已經給出了資料和分類,基於這些我們訓練我們的分類器以

周志華《機器學習》Ch9. :k-means演算法的python實現

理論 k-means方法是一種常用的聚類方法,其目標是最小化 其中是第i個簇的中心。直接優化上式有難度,故k-means演算法採用一種近似方法。 簡單來說,k-means演算法由兩個步驟迴圈組成: 1. 計算每個sample到各個簇中心的距離,將該sample的類

機器學習】---密度從初識到應用

max 一個 eight log div 指定 聚類 空間 mar 一.前述 密度聚類是一種能降噪的算法。 二.相關概念 先看些抽象的概念(官方定義): 1.:對象O的是與O為中心,為半徑的空間,參數,是用戶指定每個對象的領域半徑值。 2.MinPts(領域密度閥值):對象

Python機器學習——Agglomerative層次

條件 分享圖片 n-2 mov unique ber and 兩個 its 層次聚類(hierarchical clustering)可在不同層次上對數據集進行劃分,形成樹狀的聚類結構。AggregativeClustering是一種常用的層次聚類算法。 ??其原理是:最初

[吳恩達機器學習筆記]13K-means

沒有 rand 幫助 聯系 method ima 運用 重新 function 13.聚類 覺得有用的話,歡迎一起討論相互學習~Follow Me 13.1無監督學習簡介 從監督學習到無監督學習 在一個典型的監督學習中,我們有一個有標簽的訓練集,我們的目標是找到能夠區分正

機器學習實戰DBSCN

# !/usr/bin/python # -*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as plt import sklearn.datasets as ds import matplotlib.colors f

機器學習-*-K均值及程式碼實現

KMeans聚類 在聚類演算法中,最出名的應該就是k均值聚類(KMeans)了,幾乎所有的資料探勘/機器學習書籍都會介紹它,有些初學者還會將其與KNN等混淆。k均值是一種聚類演算法,屬於無監督學習的一種,而KNN是有監督學習/分類學習的一種。 聚類:顧名思義,就是講某些相似的事物聚在

機器學習入門線性迴歸演算法推導

心血來潮,想將所學到的知識寫篇部落格,筆者所研究的方向為機器學習,剛學習的時候,走了很多彎路,看的書不少,在推導機器學習一些演算法時候遇到了不少困難,查了不少資料,在剛才學的時候,有很多公式推導起來很困難,或者說大多數人都會遇到這樣的問題,本部落格目的就是解決在機器學習公式推導過程中遇到的問

機器學習】Kmeans

寫在篇前   Kmeans演算法是一種經典的聚類演算法,屬於無監督學習的範疇。所謂聚類,即指對於給定的一個樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇,且讓簇內的點儘量緊密的連在一起,而讓簇間的距離儘量的大。 優點: 原理簡單 速度快 對大資料集有比較

機器學習】層次

寫在篇前   層次聚類(hierarchical clustering)是一種通用的聚類演算法之一,它通過自下而上合併或自上而下拆分來構建巢狀聚類。這種簇的層次結構表示為樹(或樹狀圖),樹的根匯聚所有樣本,樹的葉子是各個樣本。本篇部落格會簡述層次聚類的原理,重點