Że pewne punkty w , i chcę skupić punkty, aby:
Każda grupa zawiera taką samą liczbę elementów . (Załóżmy, że liczba klastrów dzieli .)
Każda klaster jest w pewnym sensie „przestrzennie spójny”, podobnie jak klastry z średnich.
Łatwo jest wymyślić wiele procedur klastrowania, które spełniają jedną lub drugą z nich, ale czy ktoś wie, jak uzyskać je jednocześnie?
machine-learning
clustering
k-means
unsupervised-learning
Nie Durrett
źródło
źródło
Odpowiedzi:
Proponuję podejście dwuetapowe:
uzyskać dobre wstępne oszacowania centrów skupień, np. używając twardych lub rozmytych środków typu K.
Użyj przypisania Globalnego najbliższego sąsiada, aby powiązać punkty z centrami skupień: Oblicz macierz odległości między każdym punktem i każdym środkiem skupiska (możesz zmniejszyć problem, obliczając tylko rozsądne odległości), powtórz X każdego środka skupienia i rozwiąż liniowy problem z przypisaniem . Otrzymasz dla każdego centrum klastrów dokładnie X dopasowań do punktów danych, dzięki czemu globalnie odległość między punktami danych a centrami klastrów zostanie zminimalizowana.
Pamiętaj, że możesz zaktualizować centra klastrów po kroku 2 i powtórzyć krok 2, aby w zasadzie uruchomić K-średnich ze stałą liczbą punktów na klaster. Nadal dobrym pomysłem będzie najpierw odgadnąć.
źródło
Wypróbuj tę odmianę k-średnich:
Inicjalizacja :
k
centra z zestawu danych losowo, a nawet lepiej, korzystając ze strategii kmeans ++Na koniec powinieneś przeprowadzić parowanie, które spełni twoje wymagania + -1 tej samej liczby obiektów na klaster (upewnij się, że kilka ostatnich klastrów ma również odpowiednią liczbę. Pierwsze
m
klastry powinny miećceil
obiekty, pozostałe dokładniefloor
obiekty).Krok iteracji :
Wymagania: lista dla każdego klastra z „propozycjami wymiany” (obiekty, które wolą być w innym klastrze).
Krok E : oblicz zaktualizowane centra skupień jak w zwykłych k-średnich
Krok M : Iterowanie przez wszystkie punkty (albo tylko jeden, albo wszystkie w jednej partii)
Oblicz najbliższe centrum klastrów, aby obiekt / wszystkie centra klastrów były bliżej niż bieżące klastry. Jeśli jest to inny klaster:
Rozmiary skupień pozostają niezmienne (+ - różnica sufitu / podłogi), obiekty są przenoszone tylko z jednego skupienia do drugiego, o ile poprawia to oszacowanie. Dlatego powinien zbiegać się w pewnym momencie, jak k-średnie. Może to być nieco wolniejsze (tj. Więcej iteracji).
Nie wiem, czy zostało to wcześniej opublikowane lub wdrożone. Właśnie tego bym spróbował (gdybym spróbował k-średnich. Istnieją znacznie lepsze algorytmy grupowania).
Dobrym miejscem na początek może być wdrożenie k-średnich w ELKI , które już wydaje się wspierać trzy różne inicjalizacje (w tym k-średnie ++), a autorzy powiedzieli, że chcą mieć także różne strategie iteracji, aby objąć wszystkie różne wspólne warianty w sposób modułowy (np. Lloyd, MacQueen, ...).
źródło
Jest to problem z optymalizacją. Mamy bibliotekę Java typu open source, która rozwiązuje ten problem (grupowanie, w którym ilość na klaster musi znajdować się między ustawionymi zakresami). Będziesz potrzebował maksymalnej liczby punktów maksymalnie kilku tysięcy - nie więcej niż 5000, a może 10000.
Biblioteka jest tutaj:
https://github.com/PGWelch/territorium/tree/master/territorium.core
Sama biblioteka jest skonfigurowana pod kątem problemów związanych z typem geograficznym / GIS - zobaczysz zatem odniesienia do X i Y, szerokości i długości geograficznej, klientów, odległości i czasu itp. Możesz po prostu zignorować elementy „geograficzne” i użyć go jako czystego klaster.
Zapewniasz zestaw początkowo pustych klastrów wejściowych, każdy z minimalną i maksymalną ilością docelową. Klaster przypisze punkty do twoich klastrów wejściowych, używając heurystycznego algorytmu optymalizacji (swapy, ruchy itp.). W optymalizacji optymalizuje przede wszystkim utrzymanie każdego skupiska w zakresie minimalnej i maksymalnej ilości, a następnie minimalizuje odległości między wszystkimi punktami skupienia i centralnym punktem skupienia, aby skupisko było spójne przestrzennie.
Nadajesz solverowi funkcję metryczną (tj. Funkcję odległości) między punktami za pomocą tego interfejsu:
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/TravelMatrix.java
Metryka jest tak skonstruowana, aby zwracała zarówno odległość, jak i „czas”, ponieważ została zaprojektowana z myślą o problemach geograficznych związanych z podróżą, ale w przypadku dowolnych problemów związanych z klastrowaniem wystarczy ustawić „czas” na zero, a odległość jest faktyczną metryką, której używasz między zwrotnica.
Skonfigurowałbyś swój problem w tej klasie:
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/Problem.java
Twoje punkty to „Klienci”, a ich liczba to 1. W klasie klientów upewnij się, że ustawiłeś costPerUnitTime = 0 i costPerUnitDistance = 1, zakładając, że zwracasz swoją odległość metryczną w polu „odległość” zwróconym przez TravelMatrix.
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/Customer.java
Zobacz tutaj przykład uruchamiania solvera:
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/test/java/com/opendoorlogistics/territorium/TestSolver.java
źródło
Sugeruję najnowszy artykuł Dyskryminacyjne grupowanie poprzez regularną maksymalizację informacji (i odnośniki w nim zawarte). W szczególności sekcja 2 mówi o równowadze klas i założeniu klastra.
źródło
Ostatnio sam tego potrzebowałem do niezbyt dużego zestawu danych. Moja odpowiedź, choć ma stosunkowo długi czas działania, z pewnością jest zbieżna z lokalnym optimum.
źródło