Mam zestaw danych 2D, w których chcę znaleźć środki o określonej liczbie środków kół ( ), które maksymalizują całkowitą liczbę punktów w określonej odległości ( ).R
np. mam 10 000 punktów danych i chcę znaleźć środki okręgów, które przechwytują jak najwięcej punktów w promieniu . 5 centrów i promień 10 są podane wcześniej, a nie pochodzą z danych.
Obecność punktu danych w okręgu jest albo wartością binarną albo / albo. Jeśli , nie ma różnicy wartości w stosunku do punktu oddalonego o 11 jednostek w porównaniu do 100 jednostek w oddaleniu, ponieważ oba są w odległości> 10. Podobnie w przypadku przebywania w kręgu, nie ma żadnej dodatkowej wartości będąc blisko środka vs. blisko krawędzi . Punkt danych znajduje się w jednym z okręgów lub na zewnątrz.
Czy istnieje dobry algorytm, którego można użyć do rozwiązania tego problemu? Wydaje się, że są one związane z technikami grupowania, ale zamiast minimalizować średni dystans, funkcja „odległości” wynosi 0, jeśli punkt znajduje się w obrębie dowolnego z punktów, a 1 w przeciwnym razie.
Wolę znaleźć sposób na zrobienie tego w R, ale każde podejście byłoby mile widziane.
źródło
Odpowiedzi:
Jest to wariacja problemu k-średnich. Promień centrów nie ma znaczenia, o ile zakłada się, że są one równe.
Spinki do mankietów:
Umieści środki okręgów w miejscach o najwyższym prawdopodobieństwie punktów.
Klasyczne K-oznacza Procedura:
Opcje:
Dlaczego K-znaczy atakuje problem:
Powinien istnieć jakiś analog „Zero Inflated Poissona”, w którym występuje element niegaussowski, który odbiera rozkład równomierny.
Jeśli chcesz „dostroić” swój model i masz pewność, że istnieje wystarczająca liczba punktów próbnych, możesz zainicjować za pomocą k-średnich, a następnie wykonać ulepszony regulator k-średnich, który usuwa punkty poza promieniami kręgów z konkurencji. Lekko zakłócałoby to twoje kręgi, ale może nieco poprawić wydajność, biorąc pod uwagę dane.
źródło
Ktoś prawdopodobnie ma lepszy algorytm formalny, ale oto jedno podejście brutalnej siły (hack?). Użyłbym jednego z sześciokątnych algorytmów binowania do obliczenia histogramu 2D. Podobnie jak
hexbin
wR
.Użyłbym sześciokąta, który z grubsza określiłby twój okrąg o promieniu R, a następnie posortowałbym według górnych N pojemników. Jeśli masz
N
wyraźne odległe kosze, świetnie. Teraz jednym ze sposobów jest lokalne poruszanie się po okręgu w skali 2 * R (w kierunkach x i y) od środka sześciokątów o największej gęstości. Gęstości obliczeniowe mogą z grubsza optymalizować lokalnie pozycję. To wyjaśnia fakt, że sześciokąty nie były ruchomym oknem w odniesieniu do ustalonego początku.Jeśli wszystkie górne kosze są blisko, musisz mieć lepszy sposób na przemieszczanie swoich kręgów w tej okolicy.
Zauważ, że mogę myśleć o kilku narożnych przypadkach, w których tak naiwna strategia spektakularnie się nie powiedzie. Ale to tylko punkt wyjścia.
Tymczasem mam nadzieję, że ktoś ma lepszy algorytm.
źródło
+R
i-R
, a następnie umieszcza wszelkie możliwe rozwiązania na stosie i wybiera spośród nich. np. w twoim1D
uderzeniu28,29,30,31,32
przesuwałbym okno do18-28
i38-48
szukał wszystkich możliwych rozwiązań. Następnie można w nich znaleźć kombinacje maksymalnego uzyskiwania punktów. Nie jesteś pewien, czy to pomogłoby? Próbuję sprawdzić, czy mój naiwny algorytm da się uratować? :)