2016-03-02 28 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问题,但真的需要像你这样的专家来帮助解决这个问题。我们拥有数以亿计的数据集 - 我们担心这些方法可能无法正常工作。 –