2016-12-21 1 views
1

Я использую Libsvm для обнаружения извне (от Java), но мне нужна оценка вероятности не только метки. Я проследил код и обнаружил, что это невозможно. В частности, в функции svm_predict_values ​​(..) Я вижу следующий код:Предоставляет ли одноклассная svm оценку вероятности?

if(model.param.svm_type == svm_parameter.ONE_CLASS) 
     return (sum>0)?1:-1; 
else 
     return sum; 

Я понимаю, что один класс SVM пытается оценить поддержку некоторых распределения вероятностей заданных образцов или точек данных от «нормального» класс. Учитывая новую точку данных и учитывая, что модель узнала поддержку нормального распределения классов, могу ли я получить оценку вероятности того, что новая точка данных будет «нормальной» или «выброшенной»? Похоже, что это невозможно, и именно поэтому Libsvm порождает сумму выше и возвращает только метку членства, но я не понимаю, почему. Если можно получить оценку вероятности из одноклассного svm, я не вижу, как это сделать в Libsvm, потратив много времени на чтение code.

Причина, по которой я прошел этот маршрут, заключается в том, что я не верю, что оценка плотности ядра будет хорошо работать в условиях высокой размерности, но, возможно, svm подвержен той же проблеме.

ответ

1

Я понимаю, что один класс SVM пытается оценить поддержку некоторых распределение вероятностей заданных образцов или точек данных от «нормального» класса

Проблема заключается в предложении ложно для SVM. В общем - да, это был бы хороший вероятностный подход к построению классификатора, взятого такими моделями, как логистическая регрессия, нейронные сети и многие другие. Однако SVM не является одним из них, нет правильной вероятностной интерпретации SVM, он действительно не создает распределение вероятности, а скорее ищет хорошее правило принятия решения. Есть более вероятностные альтернативы, такие как Vector Vector Machines (RVM), которые, однако, не выпуклые. Единственная причина, по которой двоичный SVM может предоставить вам оценки вероятности, заключается в том, что во многих реализациях, созданных Platt, существует небольшой «чит», где вы просто соответствуют другой вероятностной модели поверх SVM - типично логистическая регрессия поверх Проекция SVM.

Итак, что вы можете сделать? Вы можете либо пойти на другую, более вероятностную модель, либо использовать аналогичный чит, а сначала проецировать свои данные через SVM (это то, что «сумма» находится в представленном коде), а затем соответствовать логистической регрессии поверх нее, что будет вашим вероятностная оценка.

+0

ОК, но libsvm предоставляет этот «чит» для мульти-класса svm. Поэтому вопрос в том, почему он не предусмотрен для одноклассного svm? – Kai

+0

нет математической причины не использовать его в одном классе SVM, так почему он не реализован? Одной из причин может быть тот факт, что, как правило, в одном классе оценка вероятности вероятности заключается в обеспечении P (x | положительной), а не P (положительной | x) (которую дает «чит» Platt-масштабирования), и нет хорошего способа для преобразования между этими величинами (поскольку у одного класса SVM нет модели P (x)). Но более вероятной причиной является просто «недостаточно людей, просящих об этом», поскольку одноклассный SVM является второстепенной частью libsvm. – lejlot

+0

хорошо, это хороший ответ. Спасибо. В моем приложении мне действительно нужно p (положительное | x), поэтому расширенная оценка Platt в libsvm, если бы была предусмотрена для одного класса, была бы идеальной. Однако я нашел обходное решение, которое может быть ответом. Оказывается, что параметр nu по существу является верхней границей отношения отвергаемых примеров обучения. Таким образом, новый контрольный пункт должен быть «ближе» к «нормальному» или позитивному по сравнению с отклоненными примерами обучения (хотя они относятся к положительному классу). Это не точно откалиброванная вероятность, но может действовать вместо p (положительная | x). – Kai

Смежные вопросы