Staram się inteligentnie bin posortować kolekcję. Mam kolekcję fragmentów danych. Ale wiem, że te dane wpisuje się nierówno wielkości pojemników. Nie wiem, jak inteligentnie wybrać punkty końcowe, aby odpowiednio dopasować dane. na przykład:
Powiedzmy, że mam w mojej kolekcji 12 produktów i wiem, że dane zmieszczą się w 3 pojemnikach:
Index: 1 2 3 4 5 6 7 8 9 10 11 12
Value: 1 1 1 3 3 3 3 3 3 5 5 6
Jak inteligentnie wybrać moje punkty przerwania dla pojemników ?
Obecna implementacja, którą mam, dzieli dane na pojemniki o równej wielkości, a następnie bierze średnią punktów końcowych, aby znaleźć indeksy na końcu pojemników. Działa to tak:
Index: 1 2 3 4 5 6 7 8 9 10 11 12
Value: 1 1 1 3 3 3 3 3 3 5 5 6
first break evenly: i = 1-4, 5-8, 9-12
mean endpoints: between 4 and 5: (3+3)/2 = 3
between 8 and 9: (3+3)/2 = 3
Więc teraz wszystko poniżej 3 mieści się w bin 1, wszystko powyżej 3, ale poniżej 3 pasuje do bin 2, a wszystko powyżej 3 mieści się w bin 3. Możesz zobaczyć, na czym polega mój problem. Jeśli dane mają nierówne pojemniki, moja metoda zawodzi.
Znajomy wspomniał o algorytmie k-najbliższego sąsiada, ale nie jestem pewien.
źródło
Odpowiedzi:
Myślę, że to, co chcesz zrobić, nazywa się klastrowaniem. Chcesz zgrupować swoje „Wartości” w taki sposób, aby podobne wartości były zbierane w tym samym pojemniku, a liczba wszystkich pojemników była wstępnie ustawiona.
Możesz rozwiązać ten problem za pomocą algorytmu klastrowania k-średnich . W MATLAB możesz to zrobić poprzez:
Powyższe wywołanie
Values
grupuje wartości w trzy grupy, dzięki czemu wariancja wewnątrz grupy jest minimalna.źródło
k-średnie jest opcją, ale nie jest zbyt sensowne dla danych 1-wymiarowych. W danych jednowymiarowych masz jedną ogromną zaletę: dane można w pełni posortować.
Zamiast tego spójrz na optymalizację naturalnych przerw :
http://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization
źródło