Масштабирование данных тестирования для LIBSVM: реализация MATLAB

В настоящее время я использую версию MATLAB для векторной машины LIBSVM для классификации моих данных. В документации LIBSVM упоминается, что масштабирование перед применением SVM очень важно, и мы должны использовать тот же метод для масштабирования как данных обучения, так и тестирования.

"Тот же метод масштабирования" объясняется следующим образом: Например, предположим, что мы масштабировали первый атрибут данных обучения от [-10, +10] до [-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))

Но я не знаю, как правильно масштабировать данные тестирования.

Большое спасибо за вашу помощь.

Ответ 1

Код, который вы даете, по существу, вычитает минимум и затем делит на диапазон. Вам необходимо сохранить минимальный и диапазон возможностей обучающих данных.

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);

Ответ 2

Код Richante, к сожалению, неверен, если есть столбцы, для которых все наблюдения имеют одинаковое значение (что может случиться, если данные разрежены). Пример:

>> 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

Итак, вы должны проверить, есть ли столбцы, которые имеют только одно значение. Но что, если во всем наборе тренировок есть только одно значение, но в тестовом наборе есть несколько значений? И что мы делаем в сценарии Leave-one-out, в котором есть только одно наблюдение в тестовом наборе, тогда, если все значения в столбце обучающего набора равны 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, чтобы прояснить ситуацию.....