我想用一个自定义的距离矩阵来聚类我的数据,而不是内置的算法(即欧几里得)。而且似乎没有明确的方法来做到这一点。
我已经尝试将我的一些代码添加到Smile项目的演示中。我也尝试过在我的项目中进行测试,下面是一段代码:
StringBuilder sb = new StringBuilder();
String line;
while ((line = vrpJsonFromFile.readLine()) != null) {
sb.append(line).append("\n");
}
JSONArray jsonArray = new JSONObject(sb.toString()).getJSONArray("services");
Double[][] data = new Double[jsonArray.length()][2];
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject address = jsonArray.getJSONObject(i).getJSONObject("address");
data[i][0] = Double.parseDouble(address.getString("lon"));
data[i][1] = Double.parseDouble(address.getString("lat"));
}
// here
Distance<Double[]> distance1 = (x, y) -> Math.sqrt(Math.pow(y[1]-x[1],2) + Math.pow(y[0]-x[0], 2));
CLARANS<Double[]> clarans = new CLARANS<>(data, distance1, 3);
System.out.println(clarans);这段代码使用欧几里得算法创建了一个CLARANS集群(参见//here注释下面的一行)。我应该用我自己的距离矩阵来改变它,我希望有一种方法可以在微笑中做到这一点。
发布于 2019-05-30 14:25:34
您很可能会使用
Distance<Integer> d = (i,j) -> matrix[i][j];聚类对象编号,而不是它们的向量。
但可能值得关注的是ELKI,它为距离矩阵预定义了类,并为对象集使用了优化的表示形式,而不是像上面的lambda那样使用昂贵的盒装Integer。因为i和j是装箱的整数,所以对于每个距离计算,这需要额外的内存间接(和缓存未命中),这可能会大大降低性能。它还有更好的FastCLARANS算法,以及FastPAM算法,据说要快O(k)倍。
https://stackoverflow.com/questions/56360272
复制相似问题