Estoy usando libsvm y noté que cada vez que llamo svmtrain(), crear un nuevo modelo y que parece ser no hay opción para poner datos en un modelo existente. ¿Esto es posible hacerlo sin embargo? ¿Simplemente no estoy viendo este aspecto en libsvm?
Respuestas
¿Demasiados anuncios?Suena como que usted está buscando una "incremental" o "en línea" algoritmo de aprendizaje. Estos algoritmos permiten la actualización de un clasificador con nuevos ejemplos, sin reciclaje de la totalidad de la cosa desde el principio.
Definitivamente, es posible con máquinas de soporte vectorial, aunque creo que libSVM no es compatible actualmente. Valdría la pena echar un vistazo a varios otros paquetes que ofrecen, incluyendo
- Gert Cauwenbergh del 2000 NIPS de papel (con código) http://www.isn.ucsd.edu/svm/incremental/
- Pegasos (que está disponible por sí mismo o como parte de dlib)
- SVM Pesado http://people.eng.unimelb.edu.au/shiltona/svm/
PS: @Bogdanovist: Hay una muy amplia literatura sobre este. kNN es, obviamente, y trivialmente incremental. Uno podría girar a (algunos de) los clasificadores bayesianos en incremental de los clasificadores mediante el almacenamiento de cuenta en lugar de las probabilidades. TRÉMULO, AQ* y algunos (pero no todos) de los* ID de la familia de árbol de decisión de los algoritmos también son incrementales, la parte superior de mi cabeza.
La mayoría de los online/incremental SVM utilidades son lineales, kernels y supongo que no es tan difícil como lo es para los no-lineal de los núcleos.
Algunos de los notables en Línea/incremental SVM herramientas disponibles en la actualidad:
+ Leon Bottous del LaSVM: apoya lineal y no-lineal de los núcleos. El código de C++
+ Bordes del LaRank: apoya lineal y no-lineal de los núcleos. El código de C++. Parece que el enlace está roto, ahora :-(
+ Gert Cauwenberghs' código incremental y descendente: es compatible tanto lineal y no lineal de los núcleos. Código de Matlab .
+ Chris Diehl Incremental SVM Aprendizaje: admite lineal y no-lineal de los núcleos. Código de Matlab.
+ Alistair Shilton del SVMHeavy: Sólo Binario de clasificación y regresión. El código de C++
+ Francesco Parrella del OnlineSVR: Sólo Regresión. Matlab y C++.
+ Pegasos: lineales y no lineales. C y código de Matlab. Una interfaz java.
+ Langford del Vowpal Wabbit: No estoy seguro :-(
+ Koby Hacinamiento del MCSVM: lineal y no-lineal. Código de C
Obtener una lista actualizada se puede encontrar en mi Quora respuesta.
Otra posibilidad es la alfa-siembra. Yo no soy consciente de si libSVM admite. La idea es dividir una enorme cantidad de datos de entrenamiento en trozos. Luego de entrenar un SVM en el primer fragmento. Como la resultante de soporte de vectores no son sino algunas de las muestras de los datos, se encarga de las y los utilizan para entrenar a su SVM con el siguiente fragmento. También, el uso que SVM para calcular una estimación inicial de los valores de alfa para la siguiente iteración (la siembra). Por lo tanto, el beneficio es doble: cada uno de los problemas es más pequeño y a través de smart inicialización convergen aún más rápido. De esta manera se simplifica un problema enorme en forma secuencial de la resolución de una serie de pasos más simples.