2016-03-02 67 views
0

當我使用elki時,如何獲取kmeans(llyod)集羣中的數據點質心ELKI獲取聚類數據點

也可以將這些點插入到距離函數之一中並獲得任意兩點之間的距離嗎?

這個問題是不同的,因爲我的問題的主要焦點是檢索數據點,而不是自定義數據點。此外,另一個線程的答案目前還不完整,因爲它指的是目前沒有運行的wiki。此外,我想特別知道需要做什麼,因爲所有庫的文檔都有點像大雁一樣追逐,如果你知道/理解庫,你會直接與回答,以便其他具有相同問題的人也可以有一個很好的參考資料,而不是試圖找出圖書館。

+0

雖然這個問題提到DBSCAN,答案涵蓋了訪問對象。 [ELKI:在Java中自定義對象上運行DBSCAN](http://stackoverflow.com/questions/30893319/elki-running-dbscan-on-custom-objects-in-java),這對於層次集羣也是如此:http ://stackoverflow.com/q/17687533/1060350 –

+0

@ Anony-Mousse在示例文檔中,它使用'getoffset'命令並返回數字。他們是關於他們在db中的位置的數據點嗎?我將如何去獲取每個羣集的質心? (也btw所有的圖書館的網站是關閉的,我不認爲它只在我的最終)。 –

回答

1

A Cluster(JavaDoc)in ELKI 從來沒有存儲點數據。它只存儲點DBIDs(Wiki),您可以使用getIDs()方法獲得。要獲取原始數據,您需要從數據庫中獲取Relation。方法getModel()返回聚類模型,kmeans的聚類模型爲KMeansModel

您可以通過自己的DBID, 從數據庫中獲取Relation點數據或計算基於兩個DBID S上的距離。

KMeans的質心是特殊的 - 它不是數據庫對象,但總是一個數值向量 - 該聚類的算術平均值。使用KMeans時,應該使用SquaredEuclideanDistanceFunction。這是一個NumberVectorDistanceFunction,它具有方法distance(NumberVector o1, NumberVector o2)(並非所有距離都在數字向量上工作!)。

Relation<? extends NumberVector> rel = ...; 
NumberDistanceFunction df = SquaredEuclideanDistanceFunction.STATIC; 

... run the algorithm, then iterate over each cluster: ... 

Cluster<KMeansModel> cluster = ...; 
Vector center = cluster.getModel().getMean(); 
double varsum = cluster.getModel().getVarianceContribution(); 

double sum = 0.; 
// C++-style for loop, for efficiency: 
for(DBIDRef id = cluster.getIDs().iterDBIDs(); id.valid(); id.advance()) { 
    double distance = df.distance(relation.get(id), center); 
    sum += distance; 
} 

System.out.println(varsum+" should be the same as "+sum); 
+0

當你得到的意思是不是因集羣而異?也許我並沒有完全理解代碼,但是看起來你只使用一個質心作爲距離函數,當距離中心的平均距離,首先得到每個點離它質心的距離,然後增加這些距離。 Varsum也等於從它的中心到每個點距離的總和? –

+0

該代碼片段處理一個* single *簇('Cluster!= Clustering');你仍然需要在所有集羣上使用另一個for循環。 –

+0

@ErichSchubert此信息非常有幫助。我在DBSCAN上遇到問題。由於ELKI用戶郵件列表不是英文的,我不知道如何向您提出問題。你能告訴我,我能否以某種方式聯繫你?我的問題是我嘗試了Apache math3 DBSCANClusterer並得到了我期望的結果,但我不知道如何使用ELKI的DBSCAN獲得相同的結果。我可以發佈一個stackoverflow問題,但真的需要像你這樣的專家來幫助解決這個問題。我們擁有數以億計的數據集 - 我們擔心這些方法可能無法正常工作。 –