Как кластеризовать мои данные с помощью специальной матрицы расстояний, используя метод CLARANS библиотеки улыбок

Я хочу кластеризовать свои данные с помощью пользовательской матрицы расстояний, а не встроенных алгоритмов (т.е. евклидовых). И, кажется, нет четкого способа сделать это.

Я попытался добавить часть своего кода в демонстрационные версии проекта 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 с помощью евклидова алгоритма (см. Строку под комментарием // здесь). Я должен изменить это с помощью моей собственной матрицы расстояний, и я надеюсь, что есть способ сделать это в Smile.

1 ответ

Решение

Вы можете использовать

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

кластеризовать номера объектов, а не их векторы.

Но, возможно, стоит взглянуть на ELKI, который имеет предопределенные классы для матриц расстояний и использует оптимизированные представления для наборов объектов, вместо того, чтобы использовать дорогостоящую коробку Integer как в лямбде выше. Так как i а также j целые числа в штучной упаковке, это требует дополнительной косвенной памяти (и пропусков кэша) для каждого вычисления расстояния, которое может значительно снизить производительность. Он также имеет лучший алгоритм FastCLARANS, а также FastPAM, которые предположительно в O(k) раз быстрее.

Другие вопросы по тегам