很不幸,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)
{
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的作者本人,以澄清事情......