масштабирование данных тестирования для реализации 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, чтобы очистить вещи .....