2013-03-11 3 views
1

Это может быть странный запрос, поэтому сначала объясните некоторое объяснение. Недавно я внезапно столкнулся с hd и потерял файл данных, который я использовал для создания файлов модели с помощью libSVM. У меня есть модель SVM и файл масштабирования, который я создал из этого файла данных, и мне было интересно, есть ли способ генерировать файл данных из векторов поддержки в файле модели, что-то вроде model_sv_to_instances(model, &instances), поскольку процесс для получения экземпляров очень дорогостоящий. (Я знаю, что это будет не так, как оригинал, но все же это лучше, чем ничего). Я использую вероятностный SVM с ядром RBF.LIBSVM: Получить векторы поддержки из файла модели

ответ

6

Если открыть данный файл модели в любом текстовом редакторе, вы найдете что-то вроде этого:

svm_type c_svc 
kernel_type sigmoid 
gamma 0.5 
coef0 0 
nr_class 2 
total_sv 4 
rho 0 
label 0 1 
nr_sv 2 2 
SV 
1 1:0 2:0 
1 1:1 2:1 
-1 1:1 2:0 
-1 1:0 2:1 

Где самое интересное для вас после того, как линии с SV.

1 1:0 2:0 
1 1:1 2:1 
-1 1:1 2:0 
-1 1:0 2:1 

Это точки данных, которые были выбраны в качестве векторов поддержки, поэтому вам просто нужно проанализировать файл. Формат выглядит следующим образом: [label] [index1]: [value1] [index2]: [value2] ... [indexn] [оценка]

Например, из моего примера вы можете сделать вывод, что мой учебный набор был:

x y desired val 
0 0  -1 
0 1  1 
1 0  1 
1 1  -1 

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

Еще одна вещь, о которой следует помнить, состоит в том, что это сокращение, скорее всего, изменит проблему, и если вы снова тренируетесь только с помощью SV в качестве точек данных, вы, вероятно, получите совершенно другую модель с полным набором параметров.

Удачи вам!

+0

Большое спасибо за ваш ответ. Я думаю, что SV масштабируется, поэтому мне придется «обмануть» его, чтобы снова получить реальную точку? – vseguip

+0

@vseguip Если вы его предварительно замаскировали ... да, вам нужно будет их раскрыть. Однако библиотека не масштабирует их автоматически, поэтому это будет зависеть от того, как вы построили модель. – Pedrom

+0

Также вы должны обратить внимание на это небольшое оговорку: http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f430 (строка 'label' в файле модели действительно, действительно важный). С другой стороны, вы всегда должны иметь резервную копию для таких мелочей. Dropbox отлично работает, например. –

1

Насколько мне известно, модели SVM в целом и модели libSVM, в частности, состоят только из векторов поддержки. Эти векторы представляют границу между классами; скорее всего, они не представляют подавляющее большинство ваших данных. Поэтому, к сожалению, я не думаю, что есть способ восстановить данные из модели.

Сказав это, я могу представить себе эзотерический случай, где может быть какая-то ценность модели: в таких случаях существуют компании, специализирующиеся на восстановлении данных (например, от разбитых HD-дисков). Однако восстановленные данные иногда имеют пробелы; в некоторых случаях модель может быть обратно спроектирована для заполнения некоторых недостающих пятен. Однако это очень теоретично.

EDIT: как утверждают другие ответы, доля точек данных, представленных векторами поддержки, может варьироваться в зависимости от конкретной проблемы и параметров. Однако, как указано выше, в большинстве распространенных случаев вы сможете восстановить только небольшую часть вашего исходного набора данных.

+0

«Эти векторы представляют границу между классами, а не напрямую ссылаются на какую-либо конкретную точку данных». Вы правы, за исключением того, что векторы поддержки непосредственно связаны с набором тренировок, поскольку они являются точками данных, которые определяют гиперплоскость, которая разделяет классы. – Pedrom

+0

Вы правы, конечно. Отредактировано ... – etov

+0

«К счастью» модель довольно большая, поэтому даже с этим предостережением я смогу восстановить справедливую долю данных. – vseguip

1

В случае с RBF вам повезло. Согласно libsvm FAQ вы можете извлечь векторы поддержки из файла модели:

В файле модель, после параметров и другой информации, таких как этикетки, каждая строка представляет собой вектор поддержки.

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