В вычислительном отношении наиболее эффективный способ решить, являются ли два набора точек линейно разделимыми, - применение линейного программирования. . GLTK идеально подходит для этой цели, и почти каждый язык высокого уровня предлагает интерфейс для него - R , Python, Octave, Julia и т. Д.
Что касается ответа, предлагающего использование SVM :
Использование SVM является неоптимальным решением для проверки линейной отделимости по двум причинам:
SVM являются классификаторами с мягким полем. Это означает, что SVM с линейным ядром может согласиться на разделительную плоскость, которая не разделяется идеально, даже если это действительно возможно. Затем, если вы проверите частоту ошибок, она будет не равна 0, и вы ошибочно заключите, что эти два набора не являются линейно разделимыми. Эту проблему можно смягчить, выбрав очень высокий коэффициент затрат C, но это связано с очень высокими вычислительными затратами.
SVM являются классификаторами максимальной маржи. Это означает, что алгоритм будет пытаться найти разделяющую плоскость, разделяющую два класса, стараясь держаться как можно дальше от обоих. Опять же, это особенность, увеличивающая вычислительные усилия без необходимости, поскольку она вычисляет что-то, что не имеет отношения к ответу на вопрос о линейной отделимости.
Допустим, у вас есть набор точек A и B:
Затем вы должны минимизировать 0 для следующих условий:
(А ниже - это матрица, а не набор точек сверху)
«Минимизация 0» фактически означает, что вам не нужно на самом деле оптимизировать целевую функцию, потому что нет необходимости выяснять, являются ли множества линейно разделимыми.
В конце ( ) определяется разделительная плоскость.
Если вы заинтересованы в рабочем примере по R или математическим деталям, проверьте это .