Випробування на лінійну відокремлюваність


20

Чи є спосіб перевірити лінійну відокремленість двокласного набору даних у великих розмірах? Мої вектори функцій 40-довгі.

Я знаю, що я завжди можу проводити експерименти з логістичною регресією та визначати швидкість поштовху проти помилкової тривоги, щоб зробити висновок, чи є два класи лінійно відокремленими чи ні, але було б добре знати, чи існує вже стандартна процедура для цього.


2
подивіться тут:
user603

Корисно побудувати графік розділеності : x = неправильно класифіковані точки нормальна до розділової площини, y = кумулятивна втрата (x). (Для пробної площі, спробуйте новий питання з тегами SVM і даних-візуалізації.)
Денису

Як щодо проблеми 3 класу? Чи всі проблеми класів 3+ нелінійні?
Рози

Відповіді:


3

Добре, що векторні машини підтримки (SVM) - це, мабуть, те, що ви шукаєте. Наприклад, SVM з лінійним ядром RBF, відображає зображення у просторі більшого розміру і намагається розділити класи на лінійну гіперплощину. Це хороше коротке відео SVM, що ілюструє ідею.

Ви можете обернути SVM методом пошуку для вибору функції (модель обгортки) і спробувати перевірити, чи може якась із ваших функцій лінійно розподілити класи, які ви маєте.

Існує багато цікавих інструментів для використання SVM, включаючи LIBSVM , MSVMPack та SVM-Scikit-learn .


1
+1. Це майже так, ніби Нік описував SVM, не чуючи про них. В R, можна використовувати (загадково назва) e1071пакет це svmз kernel="linear"і дивитися на передбачення по порівнянні з фактичною.
Уейн

1
Я знаю про SVM. Просто я не знав, що можу використовувати їх для тестування лінійної відокремлюваності без фактичного класифікації кожного зразка.
Нік

4
@Wayne: Нік насправді не просить SVM. Я пояснюю у своїй відповіді, чому це не є рішенням його проблеми.
Раффаел

2
" Лінійне ядро ​​RBF " не існує.
Marc Claesen

Звичайно ! Мається на увазі ядро ​​RBF, яке переносить дані в простір, що розділяється лінійно.
soufanom

17

Обчислювально найефективніший спосіб вирішити, чи лінійно відокремлюються два набори точок, це шляхом застосування лінійного програмування . GLTK ідеально підходить для цієї мети і майже кожна мова високого рівня пропонує інтерфейс для неї - R , Python, Octave, Julia тощо.

Що стосується відповіді, що пропонує використання SVM :

Використання SVM є неоптимальним рішенням для перевірки лінійної роздільності з двох причин:

  1. SVM - класифікатори з низьким рівнем обмеження. Це означає, що лінійне ядро ​​SVM може осісти для роздільної площини, яка не відокремлюється ідеально, хоча це може бути реально можливим. Якщо ви перевірите коефіцієнт помилок, це буде не 0, і ви помилково зробите висновок, що два набори не є лінійно відокремлюваними. Цю проблему можна пом'якшити, вибравши дуже високий коефіцієнт витрат C - але це пов'язано з дуже високими обчислювальними витратами.

  2. SVM - це класифікатори максимальної маржі. Це означає, що алгоритм намагатиметься знайти площину, що розділяє два класи, намагаючись триматися подалі від обох, наскільки це можливо. Знову ж таки, це особливість, що непотрібно збільшує обчислювальні зусилля, оскільки обчислює щось, що не має значення для відповіді на питання про лінійну відокремлюваність.


Скажімо, у вас є набір точок A і B:

введіть тут опис зображення

Тоді вам доведеться мінімізувати 0 для наступних умов:

(Нижче A - це матриця, а не набір точок згори)

введіть тут опис зображення

"Зведення до мінімуму 0" ефективно означає, що вам не потрібно фактично оптимізувати цільову функцію, оскільки це не обов'язково, щоб з'ясувати, чи множини лінійно відокремлюються.

Зрештою ( введіть тут опис зображення) визначає розділову площину.


введіть тут опис зображення

Якщо вас цікавить робочий приклад з R або математичні деталі, перевірте це .


3
SVM - класифікатори з обмеженою маржинальністю ... за винятком випадків, коли ви використовуєте SVM з жорстким запасом. Однак, використання SVM було б таким, як стріляти по муху з гармати.
Marc Claesen

це правильно - хоча багато (а може, і більшість більшості) бібліотек SVM не пропонують такого вибору
Раффаел,

2
С

0

Лінійний Perceptron гарантовано знайде рішення, якщо таке існує. Цей підхід не є ефективним для великих розмірів. Обчислювально найефективнішим способом вирішити, чи лінійно розділяються два набори точок, є застосування лінійного програмування, як згадував @Raffael.

Швидким рішенням було б вирішити перцептрон. Код із прикладом для вирішення використання Perceptron в Matlab є тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.