масштабирование данных тестирования для реализации LIBSVM: MATLAB
в настоящее время я использую версию MATLAB векторной машины поддержки LIBSVM для классификации моих данных. В документации LIBSVM упоминается, что масштабирование перед применением SVM очень важно, и мы должны использовать один и тот же метод для масштабирования данных обучения и тестирования.
" тот же метод масштабирования " объясняется как:
Например, предположим, что мы масштабировали первый атрибут данных обучения из [-10, +10]
to [-1, +1]
. Если первый атрибут тестовых данных лежит в диапазоне [-11, +8]
, мы должны масштабировать данные тестирования до [-1.1, +0.8]
масштабирование данных обучения в диапазоне [0,1]
можно сделать, используя следующий код MATLAB :
(data - repmat(min(data,[],1),size(data,1),1))*spdiags(1./(max(data,[],1)-min(data,[],1))',0,size(data,2),size(data,2))
но я не знаю как правильно масштабировать данные тестирования.
большое спасибо за вашу помощь.
2 ответов
код, который вы даете, по существу вычитает минимум, а затем делит на диапазон. Вам необходимо сохранить минимум и диапазон функций данных обучения.
minimums = min(data, [], 1);
ranges = max(data, [], 1) - minimums;
data = (data - repmat(minimums, size(data, 1), 1)) ./ repmat(ranges, size(data, 1), 1);
test_data = (test_data - repmat(minimums, size(test_data, 1), 1)) ./ repmat(ranges, size(test_data, 1), 1);
код Ричанте, к сожалению, неверен, если есть столбцы, для которых все наблюдения имеют одинаковое значение (что может произойти, если данные разрежены). Пример:
>> data = [1 2 3; 5 2 8; 7 2 100]
data =
1 2 3
5 2 8
7 2 100
>> test_data = [1 2 3; 4 5 6; 7 8 9];
>> minimums = min(data,[],1);
>> ranges = max(data, [], 1) - minimums;
>> data = (data - repmat(minimums, size(data, 1), 1)) ./ repmat(ranges, size(data, 1), 1);
>> data
data =
0 NaN 0
0.6667 NaN 0.0515
1.0000 NaN 1.0000
поэтому вам нужно проверить, есть ли столбцы, которые имеют только одно значение. Но что, если во всем обучающем наборе есть только одно значение, но в тестовом наборе есть несколько значений? И что мы делаем в сценарии "один выход", в котором есть только одно наблюдение в тестовый набор, то если все значения в столбце обучающего набора равны 0, а соответствующее значение в тестовом наборе равно 100 ? Это действительно дегенеративные случаи, но это может произойти. Однако, когда я проверил файл svm_scale.c в библиотеке Libsvm я заметил эту часть:
void output(int index, double value)
{
/* skip single-valued attribute */
if(feature_max[index] == feature_min[index])
return;
if(value == feature_min[index])
value = lower;
else if(value == feature_max[index])
value = upper;
else
value = lower + (upper-lower) *
(value-feature_min[index])/
(feature_max[index]-feature_min[index]);
if(value != 0)
{
printf("%d:%g ",index, value);
new_num_nonzeros++;
}
}
поэтому мы должны игнорировать эти случаи? Я действительно не знаю. Как я уже сказал, Я не авторитет в этом вопросе, поэтому я буду ждать другого ответа, предпочтительно от самих авторов Libsvm, чтобы очистить вещи .....