为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯6054654 2022-12-21 10:02:55
我想使用自定义距离矩阵而不是内置算法(即欧几里德)对我的数据进行聚类。而且似乎没有明确的方法来做到这一点。我试图将我的一些代码添加到 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);此代码使用 Euclidean 算法创建了一个 CLARANS 聚类(请参阅 //here 注释下方的行)。我应该用我自己的距离矩阵来改变它,我希望在 Smile 中有一种方法可以做到这一点。
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

你可能会使用

Distance<Integer> d = (i,j) -> matrix[i][j];

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

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


查看完整回答
反对 回复 2022-12-21
  • 1 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号