Тест на линейную отделимость

20

Есть ли способ проверить линейную отделимость набора данных двух классов в больших измерениях? Мои векторные векторы 40-длинные.

Я знаю, что всегда могу проводить эксперименты по логистической регрессии и определять скорость попадания в зависимости от частоты ложных тревог, чтобы определить, являются ли эти два класса линейно разделимыми или нет, но было бы хорошо узнать, существует ли уже стандартная процедура для этого.

Nik
источник
2
посмотрите здесь:
user603
Полезно построить разделение: x = неправильно классифицированные точки нормали к плоскости разделения, y = кумулятивные потери (x). (Для примера графика попробуйте новый вопрос с тегами svm и data-visualization.)
denis
Как насчет проблемы 3 класса? Все ли задачи 3+ классов являются нелинейными?
Розовый

Ответы:

3

Итак, машины опорных векторов (SVM), вероятно, то, что вы ищете. Например, SVM с линейным ядром RBF отображает объект в пространство более высокого измерения и пытается разделить классы линейной гиперплоскостью. Это хорошее короткое видео SVM, иллюстрирующее идею.

Вы можете обернуть SVM методом поиска для выбора функции (модель-обертка) и попытаться определить, может ли какая-либо из ваших функций линейно разделить ваши классы.

Есть много интересных инструментов для использования SVM, включая LIBSVM , MSVMPack и Scikit-learn SVM .

soufanom
источник
1
+1. Это почти как если бы Ник описывал SVM, а не слышал о них. В R вы можете использовать (с загадочным именем) e1071пакет svmс kernel="linear"и смотреть на прогноз в сравнении с фактическим.
Уэйн
1
Я знаю о SVM. Просто я не знал, что смогу использовать их для тестирования линейной отделимости без фактической классификации каждого образца.
Ник
4
@Wayne: Ник на самом деле не просит SVM. Я объясняю в своем ответе, почему это не решение его проблемы.
Рафаэль
2
« Линейное ядро ​​RBF » не существует.
Марк Клазен
Конечно ! Под этим подразумевалось ядро ​​RBF, которое отображает данные в линейно разделяемое пространство.
Суфаном
17

В вычислительном отношении наиболее эффективный способ решить, являются ли два набора точек линейно разделимыми, - применение линейного программирования. . GLTK идеально подходит для этой цели, и почти каждый язык высокого уровня предлагает интерфейс для него - R , Python, Octave, Julia и т. Д.

Что касается ответа, предлагающего использование SVM :

Использование SVM является неоптимальным решением для проверки линейной отделимости по двум причинам:

  1. SVM являются классификаторами с мягким полем. Это означает, что SVM с линейным ядром может согласиться на разделительную плоскость, которая не разделяется идеально, даже если это действительно возможно. Затем, если вы проверите частоту ошибок, она будет не равна 0, и вы ошибочно заключите, что эти два набора не являются линейно разделимыми. Эту проблему можно смягчить, выбрав очень высокий коэффициент затрат C, но это связано с очень высокими вычислительными затратами.

  2. SVM являются классификаторами максимальной маржи. Это означает, что алгоритм будет пытаться найти разделяющую плоскость, разделяющую два класса, стараясь держаться как можно дальше от обоих. Опять же, это особенность, увеличивающая вычислительные усилия без необходимости, поскольку она вычисляет что-то, что не имеет отношения к ответу на вопрос о линейной отделимости.


Допустим, у вас есть набор точек A и B:

введите описание изображения здесь

Затем вы должны минимизировать 0 для следующих условий:

(А ниже - это матрица, а не набор точек сверху)

введите описание изображения здесь

«Минимизация 0» фактически означает, что вам не нужно на самом деле оптимизировать целевую функцию, потому что нет необходимости выяснять, являются ли множества линейно разделимыми.

В конце ( введите описание изображения здесь) определяется разделительная плоскость.


введите описание изображения здесь

Если вы заинтересованы в рабочем примере по R или математическим деталям, проверьте это .

Раффаэль
источник
3
SVM являются классификаторами с мягким полем ... за исключением случаев, когда вы используете SVM с жестким полем. Тем не менее, использование SVM было бы похоже на стрельбу из мушки из пушки.
Марк Клазен,
это правильно - хотя многие (или, может быть, подавляющее большинство) библиотек SVM не предлагают этот выбор
Раффаэль
2
С
0

Линейный Перцептрон гарантированно найдет решение, если оно существует. Этот подход не эффективен для больших размеров. В вычислительном отношении наиболее эффективный способ определить, являются ли два набора точек линейно разделимыми, - это применить линейное программирование, как упомянуто @Raffael.

Быстрое решение состоит в том, чтобы решить перцептрон. Код с примером, чтобы решить, используя Perceptron в Matlab здесь

Риши Дуа
источник