首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用smile库的CLARANS方法使用自定义距离矩阵对我的数据进行聚类

如何使用smile库的CLARANS方法使用自定义距离矩阵对我的数据进行聚类
EN

Stack Overflow用户
提问于 2019-05-29 20:07:40
回答 1查看 173关注 0票数 1

我想用一个自定义的距离矩阵来聚类我的数据,而不是内置的算法(即欧几里得)。而且似乎没有明确的方法来做到这一点。

我已经尝试将我的一些代码添加到Smile项目的演示中。我也尝试过在我的项目中进行测试,下面是一段代码:

代码语言:javascript
复制
        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注释下面的一行)。我应该用我自己的距离矩阵来改变它,我希望有一种方法可以在微笑中做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-30 14:25:34

您很可能会使用

代码语言:javascript
复制
Distance<Integer> d = (i,j) -> matrix[i][j];

聚类对象编号,而不是它们的向量。

但可能值得关注的是ELKI,它为距离矩阵预定义了类,并为对象集使用了优化的表示形式,而不是像上面的lambda那样使用昂贵的盒装Integer。因为ij是装箱的整数,所以对于每个距离计算,这需要额外的内存间接(和缓存未命中),这可能会大大降低性能。它还有更好的FastCLARANS算法,以及FastPAM算法,据说要快O(k)倍。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56360272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档