Linia oddziela dwa zestawy punktów


19

Czy istnieje sposób na stwierdzenie, czy dwa zestawy punktów można oddzielić linią?

Mamy dwa zestawy punktów i jeśli istnieje linia, która oddziela i tak że wszystkie punkty i tylko po jednej stronie linii oraz wszystkie punkty i tylko po drugiej stronie.B A B A A B BABABAABB

Najbardziej naiwnym algorytmem, jaki wymyśliłem, jest zbudowanie wypukłego wielokąta dla i i przetestowanie go pod kątem przecięcia. Wygląda na to, że złożoność czasu dla tego powinna wynosić jak przy konstruowaniu wypukłego wielokąta. W rzeczywistości nie oczekuję poprawy złożoności czasu, nie jestem pewien, czy można to w ogóle poprawić. Ale przynajmniej powinien istnieć piękniejszy sposób ustalenia, czy istnieje taka linia.B O ( n log h )ABO(nlogh)

Odpowiedzi:


19

Zarówno uli, jak i Dave Clarke poprawnie zauważają, że jest to problem programowania liniowego, nawet w wyższych wymiarach (czy te dwa zestawy punktów można oddzielić hiperpłaszczyzną?), A zatem można je rozwiązać w czasie wielomianowym. Ponieważ jednak punkty znajdują się w płaszczyźnie, problem można rozwiązać w czasie , gdzieO(n)n jest całkowitą liczbą punktów.

Najprostszym rozwiązaniem jest prawdopodobnie randomizowany algorytm Seidela. Wybierz punkt wejściowy p równomiernie losowo i rekurencyjnie obliczyć linię oddzielającą dla wszystkich punktów z wyjątkiem p .

  • Jeśli taka linia nie istnieje, pierwotnych punktów nie da się rozdzielić.

  • Jeśli p znajduje się po właściwej stronie , to oddziela oryginalne punkty.

  • Jeśli p znajduje się po niewłaściwej stronie , wówczas albo oryginalne punkty można oddzielić linią przechodzącą przez p , albo oryginalnych punktów w ogóle nie da się oddzielić. Ten warunek jest łatwy do sprawdzenia w czasie O(n) [ćwiczenie].

O(n)


Dziękuję bardzo, zamierzam zagłębić się w ten artykuł.
com

p

10

Właściwością dwóch zestawów danych jest liniowa separowalność , po prostu to, że istnieje linia, która je oddziela. Wiele uczenia maszynowego jest poświęcone znajdowaniu klasyfikatorów liniowych , które są liniami, które wykonują separację, którą jesteś zainteresowany.

w1w2w3(a1,a2)Aw1a1+w2a2w3(b1,b2)Bw1b1+w2b2<w3w1x+w2yw3A

w1,w2,w3AB

w1,w2,w3

w1a1i+w2a2iw3i=1,..,|A|A={(a11,a21),,(a1|A|,a2|A|)}

w1b1j+w2b2j<w3j=1,..,|B|B={(b11,b21),,(b1|B|,b2|B|)}

Jeśli ograniczenia te są spójne, wówczas istnieje linia.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.