2012-08-07 60 views
4

我已經運行從亨利馬烏教程合成控制數據K-均值聚類算法,並想知道如果有人可以解釋如何解釋輸出。我跑clusterdump和接收到的輸出,看起來像這樣(截斷爲節省空間):如何閱讀Mahout的集羣輸出

CL-592{n=57 c=30.726, 29.813...] r=[3.528, 3.597...]} 
Weight : [props - optional]: Point: 
1.0 : [distance=27.453962995925863]: [24.672, 35.261, 30.486...] 
1.0 : [distance=27.675053294846002]: [25.592, 29.951, 34.188...] 
1.0 : [distance=28.97727289419493]: [30.696, 32.667, 34.223...] 
1.0 : [distance=21.999685652862784]: [32.702, 35.219, 30.143...] 
... 
CL-598{n=50 c=[29.611, 29.769...] r=[3.166, 3.561...]} 
Weight : [props - optional]: Point: 
1.0 : [distance=27.266203490250472]: [27.679, 33.506, 23.594...] 
1.0 : [distance=28.749781351838173]: [34.727, 28.325, 30.331...] 
1.0 : [distance=32.635136046420186]: [27.758, 33.859, 29.879...] 
1.0 : [distance=29.328974057024624]: [29.356, 26.793, 25.575...] 

有人能向我解釋如何閱讀呢?據我所知,CL -__是一個簇ID,後面跟着n =簇中的點數,c =質心作爲向量,r =半徑作爲向量,然後是簇中的每個點。它是否正確?此外,我怎麼知道哪個聚集點與哪個輸入點匹配?即被描述爲鍵值對的點,其中鍵是該點的某種ID並且該值是矢量?如果沒有,我可以設置它,所以它是?

+0

對不起,因爲這樣碰撞,但你是如何得到聚集點?我可以得到聚類質心,但不知何故,我無法得到點與你分配的聚類之間的關係? – Marko 2014-08-28 08:55:15

回答

7

我相信你對數據的解釋是正確的(我只用亨利馬烏工作〜3周,所以有人更豐富的或許應該在權衡這一點)。

至於聯點回創建它們我用NamedVector,其中名稱是向量的關鍵輸入。當你閱讀的生成點文件之一(clusteredPoints),你可以每行(點矢量)轉換回NamedVector和檢索使用.getName()名稱。響應

更新評論

當你開始讀你的數據轉化爲Mahout的,你把它轉換成向量的集合與您然後寫使用的文件(points)的聚類算法後。 Mahout爲您提供了幾種可供您使用的Vector類型,但它們還允許您訪問名爲NamedVectorVector包裝類,這將允許您識別每個矢量。

例如,您可以創建每個NamedVector如下:

NamedVector nVec = new NamedVector(
    new SequentialAccessSparseVector(vectorDimensions), 
    vectorName 
    ); 

然後你寫你的NamedVectors收藏的東西,如到文件:

SequenceFile.Writer writer = new SequenceFile.Writer(...); 
VectorWritable writable = new VectorWritable(); 

// the next two lines will be in a loop, but I'm omitting it for clarity 
writable.set(nVec); 
writer.append(new Text(nVec.getName()), nVec); 

您現在可以使用此文件作爲輸入到其中一個聚類算法。

點文件運行其中一種聚類算法後,它將生成另一個點文件,但它將位於名爲clusteredPoints的目錄中。

然後,您可以讀取該點文件並解壓到你每一個向量相關聯的名字。它看起來像這樣:

IntWritable clusterId = new IntWritable(); 
WeightedPropertyVectorWritable vector = new WeightedPropertyVectorWritable(); 

while (reader.next(clusterId, vector)) 
{ 
    NamedVector nVec = (NamedVector)vector.getVector(); 
    // you now have access to the original name using nVec.getName() 
} 
+0

感謝您的回答,@JesseBuesking。我也是初學者,所以我需要一些幫助來理解你的回答。你在哪裏定義點爲'NamedVector'?從何處/何時可以使用'.getName()'?謝謝。 – Alison 2012-08-08 13:38:12

-1

我有同樣的問題,(使用mahout 0.6)。我也是一個初學者。我需要以集羣的形式向用戶顯示文檔。所以我將需要文檔名稱,而不是與羣集相對應的文字。我一直在從shell腳本中集中文本文檔。

+0

seqdumper可用於獲取羣集和文件的映射。 – user2039862 2013-04-24 13:32:04

+0

如果你想輸出包含文件名而不是向量,使用命名向量屬性。 – user2039862 2013-04-24 13:33:04

0

嘗試添加選項-of CSV在clusterdump,你將有進一步的治療更可利用的結果。