Czy istnieje sposób przetestowania liniowej separowalności zestawu danych dwóch klas w dużych wymiarach? Moje wektory cech mają 40 długości.
Wiem, że zawsze mogę przeprowadzać eksperymenty z regresją logistyczną i określać szybkość hitrate vs. fałszywego alarmu, aby stwierdzić, czy dwie klasy można rozdzielić liniowo, czy nie, ale dobrze byłoby wiedzieć, czy istnieje już standardowa procedura do wykonania tego.
Odpowiedzi:
Cóż, maszyny wektorów wsparcia (SVM) są prawdopodobnie tym, czego szukasz. Na przykład SVM z liniowym jądrem RBF mapy odwzorowują wyższą przestrzeń wymiarową i próbuje rozdzielić klasy liniową hiperpłaszczyzną. To jest ładny krótki film SVM ilustrujący ten pomysł.
Możesz owinąć SVM metodą wyszukiwania do wyboru funkcji (model opakowania) i spróbować sprawdzić, czy którakolwiek z twoich funkcji może liniowo rozdzielić posiadane klasy.
Istnieje wiele interesujących narzędzi do korzystania z SVM, w tym LIBSVM , MSVMPack i Scikit-learn SVM .
źródło
e1071
pakiet znajdujesvm
siękernel="linear"
i spojrzenie na przewidywaniu kontra rzeczywiste.Obliczeniowo najskuteczniejszym sposobem podjęcia decyzji, czy dwa zestawy punktów można rozdzielić liniowo, jest zastosowanie programowania liniowego . GLTK jest idealny do tego celu i prawie każdy język wysokiego poziomu oferuje do tego interfejs - R , Python, Octave, Julia itp.
W odniesieniu do odpowiedzi sugerującej użycie maszyn SVM :
Korzystanie z SVM jest nieoptymalnym rozwiązaniem do weryfikacji liniowej rozdzielności z dwóch powodów:
SVM są klasyfikatorami o miękkim marginesie. Oznacza to, że liniowy SVM jądra może zadowolić się płaszczyzną oddzielającą, która nie rozdziela się idealnie, nawet jeśli jest to faktycznie możliwe. Jeśli następnie sprawdzisz poziom błędu, nie będzie on wynosił 0, i fałszywie wnioskujesz, że tych dwóch zestawów nie da się rozdzielić liniowo. Problem ten można złagodzić, wybierając bardzo wysoki współczynnik kosztu C - ale wiąże się to z bardzo wysokimi kosztami obliczeniowymi.
SVM są klasyfikatorami o maksymalnym marginesie. Oznacza to, że algorytm spróbuje znaleźć płaszczyznę oddzielającą, która oddziela dwie klasy, jednocześnie starając się trzymać z daleka od nich tak daleko, jak to możliwe. Ponownie jest to cecha niepotrzebnie zwiększająca wysiłek obliczeniowy, ponieważ oblicza coś, co nie jest istotne dla odpowiedzi na pytanie o liniową separowalność.
Powiedzmy, że masz zestaw punktów A i B:
Następnie musisz zminimalizować 0 dla następujących warunków:
(A poniżej to macierz, a nie zbiór punktów z góry)
„Minimalizacja 0” skutecznie oznacza, że nie trzeba tak naprawdę optymalizować funkcji celu, ponieważ nie jest konieczne sprawdzanie, czy zbiory można rozdzielić liniowo.
Na końcu ( ) definiuje płaszczyznę podziału.
Jeśli interesuje Cię działający przykład w języku R lub szczegóły matematyczne, sprawdź to .
źródło
Gwarantujemy, że liniowy perceptron znajdzie rozwiązanie, jeśli takie istnieje. To podejście nie jest skuteczne w przypadku dużych wymiarów. Obliczeniowo najskuteczniejszym sposobem podjęcia decyzji, czy dwa zestawy punktów można rozdzielić liniowo, jest zastosowanie programowania liniowego, o którym wspomniał @Raffael.
Szybkim rozwiązaniem byłoby rozwiązanie perceptronu. Kod z przykładem rozwiązania przy użyciu Perceptron w Matlabie znajduje się tutaj
źródło