Estou usando o libsvm e notei que toda vez que chamo svmtrain (), crio um novo modelo e parece que não há opção para colocar dados em um modelo existente. Isso é possível, no entanto? Eu simplesmente não estou vendo esse aspecto no libsvm?
Estou usando o libsvm e notei que toda vez que chamo svmtrain (), crio um novo modelo e parece que não há opção para colocar dados em um modelo existente. Isso é possível, no entanto? Eu simplesmente não estou vendo esse aspecto no libsvm?
Respostas:
Parece que você está procurando por um algoritmo de aprendizado "incremental" ou "online". Esses algoritmos permitem atualizar um classificador com novos exemplos, sem reciclar a coisa toda do zero.
Definitivamente, é possível com máquinas de vetores de suporte, embora eu acredite que o libSVM atualmente não o suporte. Pode valer a pena dar uma olhada em vários outros pacotes que o oferecem, incluindo
PS: @ Bogdanovist: Há uma literatura bastante extensa sobre isso. O kNN é obviamente e trivialmente incremental. Pode-se transformar (alguns) classificadores bayesianos em classificadores incrementais armazenando contagens em vez de probabilidades. STAGGER, AQ * e alguns (mas não todos) os algoritmos da árvore de decisão da família ID * também são incrementais, no topo da minha cabeça.
A maioria dos utilitários SVM on-line / incrementais são para kernels lineares e suponho que não seja tão difícil quanto para kernels não lineares.
Algumas das notáveis ferramentas SVM on-line / incrementais disponíveis atualmente:
+ LaSVM de Leon Bottous : Ele suporta kernels lineares e não lineares. Código C ++
+ LaRank de Bordes : suporta kernels lineares e não lineares. Código C ++. Parece que o link está quebrado agora :-(
+ código de Gert Cauwenberghs, incremental e decremental : suporta kernels lineares e não lineares. Código Matlab.
+ Aprendizado SVM incremental de Chris Diehl : suporta kernels lineares e não lineares. Código Matlab.
+ Alistair SVMHeavy de Shilton : Somente classificação binária e regressão. Código C ++
+ OnlineSVR de Francesco Parrella: Somente regressão. Matlab e C ++.
+ Pegasos : lineares e não lineares. Código C e Matlab. Uma interface Java .
+ Vowpal Wabbit de Langford : Não tenho certeza :-(
+ MCSVM de Koby Crammer : linear e não linear. Código C
Uma lista mais atualizada pode ser encontrada na minha resposta do Quora .
Outra possibilidade é a semeadura alfa . Não sei se o libSVM suporta isso. A idéia é dividir uma enorme quantidade de dados de treinamento em partes. Em seguida, você treina um SVM no primeiro pedaço. Como os vetores de suporte resultantes nada mais são do que algumas amostras dos seus dados, você os utiliza e os treina para treinar seu SVM com o próximo pedaço. Além disso, você usa esse SVM para calcular uma estimativa inicial dos valores alfa para a próxima iteração (propagação). Portanto, os benefícios são duplos: cada um dos problemas é menor e, através da inicialização inteligente, converge ainda mais rapidamente. Dessa forma, você simplifica um grande problema para resolver sequencialmente uma série de etapas mais simples.
Outra opção, se você estiver procurando uma solução "incremental", pode ser encontrada aqui ...
Uma extensão do LIBLINEAR que permite um aprendizado incremental.