Mahout Spectral聚類

譜聚類(Spectral Clustering)這名字看着就比Canopy、K-means來得高端大氣上檔次,事實上它確實是一種比較現代化的聚類方法,並且極具工程應用價值。譜聚類算法聲稱對樣本空間的形狀無限制,並能收斂於全局最優解。什麼意思呢?我們知道,K-means聚類要求樣本來自歐氏空間,從而可以計算歐氏距離,進而根據歐氏距離來決定一個樣本點歸屬於哪個類。但現實總是殘酷的,我們的研究對象往往並非來源於歐氏空間。舉個例子,如果有個樣本集,比方說是一羣人,每個人具有身高、年齡、學歷、籍貫等量綱難以統一的屬性,那麼親,請告訴我樣本間的歐氏距離怎麼算?天知道把兩個人的籍貫相減再平方,加上學歷相減再平方,是個什麼玩意兒。這個時候K-means就有了它的侷限性。不僅如此,K-means還可能因爲初始中心點選取不當而陷入局部最優解中——雖然這可以通過多次運行算法來解決。

話雖如此,但很明顯,譜聚類算法狡猾地繞開了樣本點之間“關係”的測度。它要求你只傳遞給它樣本集的相似度矩陣即可。至於兩個樣本點的相似度怎麼算,它可不管。所以我們還是要爲K-means正個名:如果願意,K-means完全可以使用類似相似度的指標來衡量樣本點之間的關係,並以此爲基礎做聚類運算;只不過揹負着歷史的沉重包袱,我們所認定的正統K-means,應該是在歐式空間上做的聚類。所以在我看來,譜聚類最大的價值並不是對空間形狀無要求,而是在於它針對海量樣本進行聚類的高性能表現。而這一成就,是通過相似度矩陣稀疏化、拉普拉斯矩陣降維來達到的。這也是譜聚類的精髓所在,暫且按下不表。

那麼相似度是個什麼概念呢?它與歐氏距離有什麼關係?答案是沒啥關係,但這兩個指標在衡量樣本間關係時具有相反的意義——兩樣本歐氏距離越大,表明關係越遠;而相似度則相反。作爲一個非正式的例子,或者最簡單的一種處理方式,你可以認爲當樣本空間是歐式空間時,樣本點之間歐氏距離的倒數(如果有)就可以看成兩個樣本點的相似度。

鑑於譜聚類並不考慮相似度的計算邏輯,我事先得告訴你,當你把譜聚類算法執行流程都走通了之後,在實際應用時,你需要回過頭來花費更多的時間來對樣本間的相似度做精雕細琢的計算。因爲它,只有它最大程度地決定了初始數據質量,從而決定了最終的聚類效果。

前面扯得有點多,很多概念我們後面還會詳細闡述,但現在我們要馬上進入實踐環節。類似Canopy、K-means聚類,對於譜聚類,我們同樣先關注如下問題:
  • 譜聚類是什麼?
  • 輸入數據的格式是什麼?
  • 如何提交程序執行聚類?
  • 輸出結果如何查看?

譜聚類是什麼?

譜聚類是與時俱進、應運而生的聚類方法,大數據時代是它發揮的舞臺(暫時先說這麼多)。與其說它是個算法,不如說是算法框架,因爲其諸多細節允許使用者根據實際需求來構造相應處理方式。其框架性流程如下:
(1)構建樣本集的相似度矩陣W。
(2)對相似度矩陣W進行稀疏化,形成新的相似度矩陣A。
(2)構建相似度矩陣A的拉普拉斯矩陣L。
(3)計算拉普拉斯矩陣L的前k個特徵值與特徵向量,構建特徵向量空間。
(4)將前k個特徵向量(列向量)組合成N*k的矩陣,每一行看成k維空間的一個向量,利用K-means或其它經典聚類算法對該矩陣進行聚類。
所以再廢話一句,譜聚類並不神祕,它的實質,是降維後做K-means聚類。我們馬上在Mahout中實現它。

Mahout Spetral Clustering輸入數據格式

以下約定:
  • $LOCAL表示本地數據存放目錄
  • $HADOOP_MAHOUT表示hadoop集羣的mahout輸出目錄
  • $MAHOUT_HOME表示本地mahout的安裝目錄
與Canopy、K-means聚類不同,Spectral要求直接輸入相似度矩陣,而且要以(i, j, value)的形式輸入,其中i,j是矩陣元素的行標籤和列標籤,以零開始,value是對應矩陣元素的值。我們爲這次實驗準備的數據如圖1所示,它是已經計算好的相似度矩陣,是個對稱矩陣,並且對角線上的值都爲零。

圖1

不過這不能作爲原始數據文件上傳,需要處理成如下形式:
0,0,0
0,1,0.6
0,2,0.9
......
1,0,0.6
1,1,0
1,2,0.8
......
詳細數據見[1],文件名爲sc-data。

Mahout Spectral Clustering任務提交

準備好數據後,我們把存放數據的文件sc-data從本地上傳到HDFS中:
hadoop fs -put $MAHOUT_HOME/sc-data $HADOOP_MAHOUT/

然後,執行以下命令行提交任務進行kmeans聚類:
mahout spectralkmeans \
     -i $HADOOP_MAHOUT/sc-data \
     -o $HADOOP_MAHOUT/ \
     -k 2 \
     -d 6 \
     --maxIter 100
在這條命令行中,參數-i的值是輸入數據的路徑,-o是輸出文件存放路徑,-k表示欲生成的類數,-d是相似度矩陣的維度,--maxIter限制最大迭代次數。

Mahout Spectral Clustering輸出結果查看

Spectral Clustering的輸出結果就保存在$HADOOP_MAHOUT文件夾下,包含5個子文件:
../calculations
../clusteredPoints
../clusters-0
../clusters-1
../clusters-2

calculations存放計算過程產生的數據。
clusteredPoints是最後的聚類結果,裏面記錄了每個向量及其對應所分的類。
clusters-0至clusters-2是程序最後執行K-means聚類,經過兩次迭代所產生的數據文件,clusters-2則是最終聚類結果。
同樣的,以上數據文件都是sequence file的形式,不能直接查看。我們使用下面的命令,將數據轉化爲可閱讀的文本:
mahout seqdumper \
     -s $HADOOP_MAHOUT/clusteredPoints/part-m-00000 \
     -o $LOCAL/clusteredPoints

mahout seqdumper \
     -s $HADOOP_MAHOUT/clusters-0/part-randomSeed \
     -o $LOCAL/clusters-0

mahout seqdumper \
     -s $HADOOP_MAHOUT/clusters-1/part-r-00000 \
     -o $LOCAL/clusters-1

mahout seqdumper \
     -s $HADOOP_MAHOUT/clusters-2/part-r-00000 \
     -o $LOCAL/clusters-2

clusteredPoints展示了每個樣本分別屬於哪個類別,其中key後面的值是類別編號,value後面的值是數據點,不過光看value的數據我們已經看不出它跟初始的相似度矩陣的聯繫了,好在它是按樣本的順序排列的。以下是實例的clusteredPoints數據文件內容:
Key: 1: Value: 1.0: [0.188, -0.982]
Key: 1: Value: 1.0: [0.915, 0.404]
Key: 4: Value: 1.0: [-0.902, 0.432]
Key: 1: Value: 1.0: [0.465, -0.885]
Key: 4: Value: 1.0: [0.748, 0.664]
Key: 4: Value: 1.0: [-0.994, 0.112]

clusters-0至clusters-2是K-means聚類的生成結果,我們的問題是,K-means操作的數據集是什麼?這涉及calculations這個文件夾。它的子文件如下:
../diagonal
../eigenvectors-192
../eigenverifier
../laplacian-0
../seqfile-168
../unitvectors-80
../vector
注意eigenvectors-、laplacian-、seqfile-、unitvectors-後面的數字是隨機生成的。K-means聚類的對象就存放在unitvectors-80的數據文件中,用vectordump可以把數據轉換成可閱讀的形式查看:
mahout vectordump \
     -s $HADOOP_MAHOUT/calculations/unitvectors-80/part-m-00000 \
     -o $LOCAL/calculations-unitvectors
其內容如下:
{1:-0.9821410024116984,0:0.18814635628080645}
{1:0.40378499159750353,0:0.9148539121414981}
{1:0.43206003606297805,0:-0.9018448454347666}
{1:-0.8853509357734358,0:0.46492334908574123}
{1:0.6639814955737503,0:0.747749004369545}
{1:0.11218035585847443,0:-0.9936878623388062}
所代表的矩陣是:

圖2

回過頭去看clusteredPoints的內容,是不是對上號了?

clusters-0給出了每個類別的初始中心點,如下所示:
Key: 1: Value: CL-1{n=0 c=[0.915, 0.404] r=[]}
Key: 4: Value: CL-4{n=0 c=[0.748, 0.664] r=[]}

我們還可以使用clusterdump將clusteredPoints和clusters-0至clusters-2的結果整合在一起,由於clusters-2代表了最後的聚類結果,我們來查看這個文件代表的類別。命令行如下:
mahout clusterdump \
     -s $HADOOP_MAHOUT/clusters-2 \
     -p $HADOOP_MAHOUT/clusteredPoints \
     -o $LOCAL/clusters-2-dump

樣例爲:
VL-1{n=3 c=[0.523, -0.488] r=[0.299, 0.632]}
     Weight:  Point:
     1.0: [0.188, -0.982]
     1.0: [0.915, 0.404]
     1.0: [0.465, -0.885]
VL-4{n=3 c=[-0.383, 0.403] r=[0.800, 0.226]}
     Weight:  Point:
     1.0: [-0.902, 0.432]
     1.0: [0.748, 0.664]
     1.0: [-0.994, 0.112]
其中,
VL-1代表這是一個cluster
n=3代表該cluster有3個點
c=[...]代表該cluster的中心點
r=[...]代表cluster的半徑

參考資料:

[1]  http://pan.baidu.com/share/link?shareid=1803362968&uk=1258687326
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章