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