Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LIBSVM测试数据的缩放:MATLAB实现_Matlab_Testing_Input_Scaling_Libsvm - Fatal编程技术网

LIBSVM测试数据的缩放:MATLAB实现

LIBSVM测试数据的缩放:MATLAB实现,matlab,testing,input,scaling,libsvm,Matlab,Testing,Input,Scaling,Libsvm,我目前使用MATLAB版本的LIBSVM支持向量机对我的数据进行分类。LIBSVM文档提到,在应用SVM之前进行缩放非常重要,我们必须使用相同的方法来缩放训练和测试数据 “相同的缩放方法”解释为: 例如,假设我们将训练数据的第一个属性从[-10,+10]缩放到[-1,+1]。如果测试数据的第一个属性位于范围[-11,+8],则必须将测试数据缩放到[-1.1,+0.8] 可以使用以下MATLAB代码在[0,1]范围内缩放训练数据: (data - repmat(min(data,[],1),siz

我目前使用MATLAB版本的LIBSVM支持向量机对我的数据进行分类。LIBSVM文档提到,在应用SVM之前进行缩放非常重要,我们必须使用相同的方法来缩放训练和测试数据

“相同的缩放方法”解释为: 例如,假设我们将训练数据的第一个属性从
[-10,+10]
缩放到
[-1,+1]
。如果测试数据的第一个属性位于范围
[-11,+8]
,则必须将测试数据缩放到
[-1.1,+0.8]

可以使用以下MATLAB代码在
[0,1]
范围内缩放训练数据:

(data - repmat(min(data,[],1),size(data,1),1))*spdiags(1./(max(data,[],1)-min(data,[],1))',0,size(data,2),size(data,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);

不幸的是,如果存在所有观察值都相同的列(如果数据稀疏,则可能发生这种情况),则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
因此,您必须检查是否有只有一个值的列。但是,如果整个训练集中只有一个值,而测试集中有多个值呢?在漏掉一个场景中,测试集中只有一个观察值,那么如果训练集中一列中的所有值都是0,测试集中相应的值是100,我们该怎么办?这些确实是退化的情况,但它可能会发生。但是,当我检查Libsvm库中的文件svm_scale.c时,我注意到以下部分:

 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的作者自己的答案,以澄清问题……

我的问题是,如果将[a,b]范围内的训练数据归一化为[0,1],那么[c,d]范围内的测试数据归一化为哪个范围?@Richante:你的答案非常有用。我只想澄清,“data”这里是训练数据,“test_data”是测试数据??很抱歉,但是对于所有观察值都相同的列(如果数据稀疏,可能会发生这种情况),您的代码将输出NaN。例如,data=[1 2 3;5 2 8;7 2 100]