当我使用elki时,如何获得kmeans(llyod)群集中的数据点和质心?
我也可以将这些点插入其中一个距离函数并获得任意两点之间的距离吗?
这个问题不同,因为我的问题的主要焦点是检索数据点,而不是自定义数据点。另外,另一个线程的答案目前还不完整,因为它指的是目前无法运行的维基。此外,我想知道需要做什么,因为所有库的文档有点像一个疯狂的追逐,如果你了解/理解你将直接与你的库,你会非常感激。回答,以便其他具有相同问题的人也可以有一个很好的参考,而不是试图找出图书馆。
答案 0 :(得分:1)
ELKI中的Cluster
(JavaDoc)从不存储点数据。它只存储点DBIDs
(Wiki),您可以使用getIDs()
方法获得。要获取原始数据,您需要数据库中的Relation
。方法getModel()
返回群集模型,对于kmeans而言是KMeansModel
。
您可以通过Relation
从数据库DBID
获取点数据,
或者根据两个DBID
计算距离。
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);