Mam zestaw punktów na mapie. Próbuję tworzyć klastry. Wraz z odległością rozważam maksymalny koszt (jako inny parametr) każdego klastra.K-means Algorytm o wielu parametrach
Proszę znaleźć poniższy fragment kodu.
private void assignCluster(List<Cluster> finalClusters, List<Node> clusterNodes, int maxCostLimit) {
double max = Double.MAX_VALUE;
double min = max;
int clusterIndex = 0;
double distance = 0.0;
for (Node node : clusterNodes) {
min = max;
for (int i = 0; i < finalClusters.size(); i++) {
Cluster cluster = finalClusters.get(i);
distance = Point.getDistanceBetweenPoints(node.getPoint(), cluster.getPoint());
if (distance < min && (cluster.getTotalCost() + node.getCost()) <= maxCostLimit) {
min = distance;
clusterIndex = i;
}
}
if (min != max) {
Cluster cluster = finalClusters.get(clusterIndex);
cluster.setTotalCost(cluster.getTotalCost() + node.getCost());
cluster.addClusterNode(node);
}
}
}
Jeśli spróbuję utworzyć klastry, będzie to nieskończona pętla. Alternatywnie dwa punkty na mapie są przypisywane do dwóch różnych klastrów. W każdej iteracji zmieniają się centroidy tych dwóch klastrów. Proszę zasugerować mi, Jak mogę to osiągnąć?
edytuje
Cluster.java
public class Cluster{
private List<Node> clusterNodes = new ArrayList<Node>();
private Integer totalCost = 0;
private Point2D point;
//getters and setters
}
Point.java
public class Point{
private double x = 0;
private double y = 0;
// getters and setters
//method to find the distance between 2 points
}
mam na myśli ten link podstawowej Kmeans algorytmu: http://www.dataonfocus.com/k-means-clustering-java-code/
Czy możesz opublikować swój kod klaster klasy i punkt – Ironluca
Wydaje mi się, że wpadasz w lokalną optymalność. Popraw, jeśli się mylę, ale przypuszczam, że generujesz swój środek ciężkości losowo - przynajmniej powinieneś. Uważam więc, że potrzebny jest mechanizm, który sprawdzi stan między dwiema iteracjami. Na przykład powinieneś być w stanie wykryć, czy centroid przeszedł z (A1, B1) do (A2, B2), a następnie z powrotem do (A1, B1). W takim przypadku musisz utworzyć nowy centroid. W każdym razie pomocne byłoby zamieszczenie większej ilości kodu. – freefall
Czy możesz również opublikować kod, w którym zaktualizujesz centroidy, po wywołaniu 'assignCluster()' –