Quiero agrupar mis datos con una matriz de distancia personalizada en lugar de la incorporada en algoritmos (es decir euclidiana). Y no parece haber ninguna manera clara de hacerlo.
He intentado añadir algo de mi código para las demostraciones en el proyecto de la sonrisa. También trató de hacerlo con las pruebas en mi proyecto, aquí hay un trozo del código:
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);
Este código crea un CLARANS de agrupamiento con el algoritmo de Euclides (ver la línea por debajo de la // aquí comentario). Debería cambiarlo con mi propia matriz de distancia y espero que hay una manera de hacer eso en la sonrisa.
Es probable que pueda utilizar
Distance<Integer> d = (i,j) -> matrix[i][j];
para agrupar los números de objeto, no sus vectores.
Pero puede ser digno de mirar Elki vez que se ha predefinido clases de matrices de distancia, y los usos optimizado representaciones de conjuntos de objetos en lugar de tener que usar costosos en caja Integer
como en el anterior lambda. Debido a que i
y j
son números enteros en caja, esto requiere direccionamiento indirecto de memoria adicional (y errores de caché) para cada cálculo de la distancia, que puede reducir mucho el rendimiento. También tiene algoritmo de los mejores FastCLARANS, así como FastPAM que son supuestamente O (k) veces más rápido.