Java 如何使用smile库';s-CLARANS法
我希望使用自定义距离矩阵而不是内置算法(即欧几里德算法)对数据进行聚类。而且似乎没有明确的方法来做到这一点 我已经尝试将我的一些代码添加到微笑项目的演示中。我也尝试在我的项目中进行测试,下面是一段代码:Java 如何使用smile库';s-CLARANS法,java,cluster-analysis,k-means,distance-matrix,smile,Java,Cluster Analysis,K Means,Distance Matrix,Smile,我希望使用自定义距离矩阵而不是内置算法(即欧几里德算法)对数据进行聚类。而且似乎没有明确的方法来做到这一点 我已经尝试将我的一些代码添加到微笑项目的演示中。我也尝试在我的项目中进行测试,下面是一段代码: StringBuilder sb = new StringBuilder(); String line; while ((line = vrpJsonFromFile.readLine()) != null) { sb.ap
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);
StringBuilder sb=新建StringBuilder();
弦线;
而((line=vrpJsonFromFile.readLine())!=null){
sb.append(行)。append(“\n”);
}
JSONArray JSONArray=新的JSONObject(sb.toString()).getJSONArray(“服务”);
Double[]data=newdouble[jsonArray.length()][2];
for(int i=0;iMath.sqrt(Math.pow(y[1]-x[1,2)+Math.pow(y[0]-x[0,2));
CLARANS CLARANS=新CLARANS(数据,距离1,3);
系统输出打印(clarans);
这段代码使用欧几里德算法创建了一个CLARANS聚类(请参见//here注释下面的一行)。我应该用我自己的距离矩阵来改变它,我希望有一种方法可以在微笑中做到这一点。你可以使用
Distance<Integer> d = (i,j) -> matrix[i][j];
距离d=(i,j)->矩阵[i][j];
对对象编号进行聚类,而不是对其向量进行聚类
但是值得一看的是ELKI,它为距离矩阵提供了预定义的类,并为对象集使用了优化表示,而不是像上面的lambda那样使用昂贵的盒装整数。由于i
和j
是装箱整数,因此每次距离计算都需要额外的内存间接寻址(和缓存未命中),这会大大降低性能。它还有更好的FastCLARANS算法,以及据说快了O(k)倍的FastPAM