¿Hay alguna forma de probar la separabilidad lineal de un conjunto de datos de dos clases en altas dimensiones? Mis vectores de características son de 40 de largo.
Sé que siempre puedo ejecutar experimentos de regresión logística y determinar la tasa de aciertos frente a la tasa de falsas alarmas para concluir si las dos clases son linealmente separables o no, pero sería bueno saber si ya existe un procedimiento estándar para hacerlo.
Respuestas:
Bueno, las máquinas de vectores de soporte (SVM) son probablemente lo que estás buscando. Por ejemplo, SVM con un núcleo RBF lineal, asigna la función a un espacio dimensional más alto e intenta separar las clases mediante un hiperplano lineal. Este es un buen video SVM corto que ilustra la idea.
Puede ajustar SVM con un método de búsqueda para la selección de características (modelo de contenedor) e intentar ver si alguna de sus características puede espaciar linealmente las clases que tiene.
Hay muchas herramientas interesantes para usar SVM, incluyendo LIBSVM , MSVMPack y Scikit -learn SVM .
fuente
e1071
paquete (misteriosamente nombrado)svm
conkernel="linear"
y ver la predicción versus la real.Computacionalmente, la forma más efectiva de decidir si dos conjuntos de puntos son linealmente separables es mediante la aplicación de programación lineal . GLTK es perfecto para ese propósito y casi todos los lenguajes de alto nivel ofrecen una interfaz para él: R , Python, Octave, Julia, etc.
Con respecto a la respuesta que sugiere el uso de SVM :
El uso de SVM es una solución subóptima para verificar la separabilidad lineal por dos razones:
Los SVM son clasificadores de margen blando. Eso significa que un núcleo lineal SVM podría conformarse con un plano de separación que no se separa perfectamente, aunque en realidad sea posible. Si luego verifica la tasa de error, no será 0 y concluirá falsamente que los dos conjuntos no son linealmente separables. Este problema puede atenuarse eligiendo un coeficiente de costo C muy alto, pero esto tiene un costo computacional muy alto.
Los SVM son clasificadores de margen máximo. Eso significa que el algoritmo intentará encontrar un plano de separación que separe las dos clases mientras trata de mantenerse lo más lejos posible de ambas. Nuevamente, esta es una característica que aumenta el esfuerzo computacional innecesariamente, ya que calcula algo que no es relevante para responder la pregunta de la separabilidad lineal.
Digamos que tiene un conjunto de puntos A y B:
Luego debe minimizar el 0 para las siguientes condiciones:
(La A a continuación es una matriz, no el conjunto de puntos desde arriba)
"Minimizar 0" efectivamente significa que no necesita optimizar realmente una función objetivo porque esto no es necesario para averiguar si los conjuntos son linealmente separables.
Al final ( ) está definiendo el plano de separación.
En caso de que esté interesado en un ejemplo de trabajo en R o en los detalles matemáticos, consulte esto .
fuente
Perceptron lineal está garantizado para encontrar una solución si existe. Este enfoque no es eficiente para grandes dimensiones. Computacionalmente, la forma más efectiva de decidir si dos conjuntos de puntos son linealmente separables es mediante la aplicación de programación lineal como lo menciona @Raffael.
Una solución rápida sería resolver un perceptrón. Un código con un ejemplo para resolver usando Perceptron en Matlab está aquí
fuente