Я використовую libsvm, і я помітив, що кожного разу, коли я дзвоню svmtrain (), я створюю нову модель і, здається, немає можливості розміщувати дані в існуючій моделі. Чи можливо це зробити? Я просто не бачу цього аспекту в libsvm?
Я використовую libsvm, і я помітив, що кожного разу, коли я дзвоню svmtrain (), я створюю нову модель і, здається, немає можливості розміщувати дані в існуючій моделі. Чи можливо це зробити? Я просто не бачу цього аспекту в libsvm?
Відповіді:
Це здається, що ви шукаєте алгоритм навчання "поступового" чи "онлайн". Ці алгоритми дозволяють оновити класифікатор новими прикладами, не перевчаючи всю справу з нуля.
Це, безумовно, можливо з векторними машинами підтримки, хоча я вважаю, що libSVM зараз не підтримує це. Можливо, варто поглянути на кілька інших пакетів, які пропонують його, в тому числі
PS: @Bogdanovist: Про це досить велика література. kNN очевидно і тривіально наростає. Можна перетворити (деякі) байєсові класифікатори в додаткові класифікатори, зберігаючи підрахунки замість ймовірностей. STAGGER, AQ * та деякі (але не всі) алгоритми сімейства ідентифікаторів сімейства ID * також є поступовими, вгорі голови.
Більшість онлайн-інкрементальних утиліт SVM призначені для лінійних ядер, і я вважаю, що це не так складно, як для нелінійних ядер.
Деякі з найпомітніших Інтернет-/ поступових інструментів SVM, які зараз доступні:
+ LaSVM Leon Bottous : Він підтримує як лінійні, так і нелінійні ядра. Код C ++
+ LaRank Bordes : Він підтримує як лінійні, так і нелінійні ядра. C ++ код. Здається, зараз посилання розірвано :-(
+ код Герта Кавенберга, інкрементальний і декрементальний : підтримує як лінійні, так і нелінійні ядра. Код Matlab.
+ Кріс Діель Інкрементальне навчання SVM : підтримує як лінійні, так і нелінійні ядра. Matlab code.
+ Alistair SVMHeavy від Шилтона : Тільки двійкова класифікація та регресія. C ++ код
+ ІнтернетSVR Франческо Паррелла: Тільки регресія. Matlab і C ++.
+ Пегасо : Як лінійний, так і нелінійний. C і код Matlab. Інтерфейс Java .
+ Вабпал Лангфорда : Не впевнений :-(
+ MCSVM Кобі Краммера : як лінійний, так і нелінійний. C код
Більш оновлений список можна знайти у моїй відповіді Quora .
Інша можливість - альфа-висівання . Мені невідомо, чи підтримує libSVM. Ідея полягає в тому, щоб поділити величезну кількість навчальних даних на шматки. Потім ви тренуєте SVM на першому шматку. Оскільки отримані вектори підтримки - це не що інше, як деякі зразки ваших даних, ви берете їх і використовуєте їх для тренування вашого SVM з наступним фрагментом. Крім того, ви використовуєте цей SVM для обчислення початкової оцінки значень альфа для наступної ітерації (висіву). Тому переваги двоякі: кожна з проблем менша, і завдяки розумній ініціалізації вони сходяться ще швидше. Таким чином ви спростите величезну проблему для послідовного вирішення ряду більш простих кроків.
Ще один варіант, якщо ви шукаєте "додаткове" рішення, можна знайти тут ...
Розширення LIBLINEAR, що дозволяє поступово навчатись.