1

使用 elki 时,如何获取kmeans (llyod) 集群中的数据点质心?

我也可以将这些点插入距离函数之一并获得任意两个点之间的距离吗?

这个问题是不同的,因为我的问题的主要焦点是检索数据点,而不是自定义数据点。此外,另一个线程上的答案目前不完整,因为它指的是目前无法运行的 wiki。此外,我想具体了解需要做什么,因为所有库的文档有点像白痴,如果您知道/理解您将直接使用的库,将不胜感激回答,以便其他有同样问题的人也可以有一个很好的可靠参考来参考,而不是试图找出图书馆。

4

1 回答 1

2

ClusterELKI 中的 A (JavaDoc)从不存储点数据。它只存储点DBIDs(Wiki),您可以使用该getIDs()方法获得它。要获取原始数据,您需要Relation从数据库中获取。该方法getModel()返回集群模型,对于 kmeans 是一个KMeansModel.

Relation您可以通过它们从数据库中获取点数据DBID,或者根据两个DBIDs 计算距离。

KMeans 的质心很特别——它不是数据库对象,而是一个数值向量——集群的算术平均值。使用 KMeans 时,您应该使用SquaredEuclideanDistanceFunction. 这是 a 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);
于 2016-03-03T08:56:28.020 回答