我正在为 Matlab 使用 Libsvm。
我想为所有训练数据(在更高的 SVM 空间中)构建模型。为此,我假设我所有的训练数据都是正确的并且没有异常值。
我生成随机分布的数据(可能类似于我的真实数据)并为它训练一个一类 SVM。当我预测相同数据的标签时,几乎所有用作支持向量的数据点也被认为是在类之外。这是正确的行为吗?
如何为 SVM 构建一个模型,它认为所有数据都在类中?
下面的代码给出了一个例子。在生成的散点图中,蓝色圆圈是所有数据点,红色是模型使用的支持向量,绿色圆圈是外部点。因此,空的红色圆圈是支持向量,但不在类中。
我试图调整 nu 参数(-n 0.5
默认),但这只会改变数据点/支持向量的比率。支持向量仍然是最出类拔萃的。
data = normrnd(0,1,1000,2);
labels = ones(length(data),1);
% Construct one-class SVM with RDF kernel (Gaussian)
model = svmtrain(labels, data, '-s 2 -t 2');
% Use the same data for label prediction
[predicted_labels] = svmpredict(labels, data, model);
inside_indices = find(predicted_labels > 0);
figure; hold on;
% Scatterplot of all data, blue circles
scatter(data(:,1), data(:,2), 30, 'blue');
% Scatterplot of all support vectors, small red circles
scatter(model.SVs(:,1), model.SVs(:,2), 20, 'red');
% Scatterplot of all data inside the one-classs, small green circles
scatter(data(inside_indices,1), data(inside_indices,2), 10, 'green');
得到的散点图:
编辑: 我可能找到了解决方案;LIBSVM 工具包含“支持向量数据描述”的扩展,用于“查找包含所有数据的最小球体”:http ://www.csie.ntu.edu.tw/~cjlin/libsvmtools/#libsvm_for_svdd_and_finding_the_smallest_sphere_containing_all_data
编辑 2:使用 SVDD 工具确实会有所作为。我进行了训练,-s 5
但对于相同的数据集,我仍然只能获得大约 50% 的准确率。
我的问题仍然存在;如何用一类 SVM 描述所有数据?