Teste de separabilidade linear

20

Existe uma maneira de testar a separabilidade linear de um conjunto de dados de duas classes em altas dimensões? Meus vetores de recursos têm 40 anos.

Eu sei que sempre posso executar experimentos de regressão logística e determinar a taxa de hitrato versus falso alarme para concluir se as duas classes são linearmente separáveis ​​ou não, mas seria bom saber se já existe um procedimento padrão para fazer isso.

Nik
fonte
2
veja aqui:
user603
É útil traçar a separação: x = pontos classificados incorretamente normal para o separador, y = perda acumulada (x). (Para um lote de amostra, tente uma nova pergunta com etiquetas svm e dados de visualização.)
denis
Que tal um problema de 3 classes? Todos os problemas com mais de 3 classes não são lineares?
Rosy

Respostas:

3

Bem, as máquinas de vetores de suporte (SVM) são provavelmente o que você está procurando. Por exemplo, o SVM com um kernel RBF linear, os mapas apresentam um espaço dimensional maior e tentam separar as classes por um hiperplano linear. Este é um belo vídeo SVM curto ilustrando a idéia.

Você pode agrupar o SVM com um método de pesquisa para seleção de recursos (modelo de wrapper) e tentar ver se algum de seus recursos pode poupar linearmente as classes que você possui.

Existem muitas ferramentas interessantes para usar o SVM, incluindo LIBSVM , MSVMPack e Scikit-learn SVM .

soufanom
fonte
1
+1. É quase como se Nik estivesse descrevendo SVM, sem ter ouvido falar deles. No R, você pode usar os e1071pacotes (nomeados misteriosamente) svmcom kernel="linear"e ver a previsão versus a real.
Wayne
1
Eu sei sobre SVMs. Só que eu não sabia que poderia usá-los para testar a separabilidade linear sem realmente classificar cada amostra.
Nik
4
@Wayne: Nik na verdade não está pedindo SVMs. Explico na minha resposta por que essa não é a solução para o seu problema.
Raffael
2
Um " núcleo RBF linear " não existe.
Marc Claesen
Claro ! O que se quis dizer é um kernel RBF que mapeia dados em um espaço linearmente separável.
Soufanom
17

Computacionalmente, a maneira mais eficaz de decidir se dois conjuntos de pontos são separáveis ​​linearmente é aplicando a programação linear . O GLTK é perfeito para esse propósito e praticamente todas as linguagens de alto nível oferecem uma interface para ele - R , Python, Octave, Julia, etc.

Com relação à resposta que sugere o uso de SVMs :

O uso de SVMs é uma solução subótima para verificar a separabilidade linear por dois motivos:

  1. SVMs são classificadores de margem flexível. Isso significa que um SVM linear do kernel pode se contentar com um plano de separação que não está se separando perfeitamente, mesmo que seja realmente possível. Se você verificar a taxa de erro, ela não será 0 e concluirá falsamente que os dois conjuntos não são linearmente separáveis. Esse problema pode ser atenuado com a escolha de um coeficiente de custo C muito alto - mas isso tem um custo computacional muito alto.

  2. SVMs são classificadores de margem máxima. Isso significa que o algoritmo tentará encontrar um plano de separação que esteja separando as duas classes enquanto tenta ficar longe das duas o máximo possível. Novamente, esse é um recurso que aumenta desnecessariamente o esforço computacional, pois calcula algo que não é relevante para responder à questão da separabilidade linear.


Digamos que você tenha um conjunto de pontos A e B:

insira a descrição da imagem aqui

Então você deve minimizar o 0 para as seguintes condições:

(O A abaixo é uma matriz, não o conjunto de pontos acima)

insira a descrição da imagem aqui

"Minimizar 0" efetivamente significa que você não precisa realmente otimizar uma função objetivo, porque isso não é necessário para descobrir se os conjuntos são linearmente separáveis.

No final ( insira a descrição da imagem aqui) está definindo o plano de separação.


insira a descrição da imagem aqui

Caso você esteja interessado em um exemplo de trabalho em R ou nos detalhes matemáticos, verifique isso .

Raffael
fonte
3
SVMs são classificadores de margem flexível ... exceto quando você usa SVM de margem rígida. Dito isto, usar SVMs seria como disparar uma mosca com um canhão.
Marc Claesen
isso é correto - embora muitos (ou talvez a maioria agora) de bibliotecas SVM não oferecem essa escolha
Raffael
2
C
0

O Perceptron linear é garantido para encontrar uma solução, se houver. Essa abordagem não é eficiente para grandes dimensões. Computacionalmente, a maneira mais eficaz de decidir se dois conjuntos de pontos são linearmente separáveis ​​é aplicando a programação linear conforme mencionado por @Raffael.

Uma solução rápida seria resolver um perceptron. Um código com um exemplo para resolver usando o Perceptron no Matlab está aqui

Rishi Dua
fonte