Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用smile库';s-CLARANS法_Java_Cluster Analysis_K Means_Distance Matrix_Smile - Fatal编程技术网

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