我使用 LibSVM 来对一些文档进行分类。最终结果显示,这些文档似乎有点难以分类。然而,在训练我的模型时,我注意到了一些事情,那就是:如果我的训练集例如有1000个样本,其中大约800个被选为支持向量。我到处寻找答案,想知道这是好事还是坏事。我的意思是,支持向量的数量与分类器的性能之间是否有关系?我已经阅读了之前的帖子,但我正在进行参数选择,并且我确定特征向量中的属性都是有序的。我只需要知道它们之间的关系。谢谢。附注:我使用的是线性核函数。
回答:
支持向量机是一种优化问题。它们试图找到一个超平面,以最大的间隔将两个类别分开。支持向量是落在这一间隔内的点。理解这一点的最简单方法是从简单到复杂逐步构建。
硬间隔线性SVM
在数据线性可分的训练集中,如果使用硬间隔(不允许松弛),支持向量是位于支持超平面上的点(这些超平面与分隔超平面平行,位于间隔的边缘)。
所有的支持向量都正好位于间隔上。无论维度数量或数据集大小如何,支持向量的数量可能少至2个。
软间隔线性SVM
但是,如果我们的数据集不是线性可分的呢?我们引入了软间隔SVM。我们不再要求数据点位于间隔之外,我们允许一定数量的数据点越过线进入间隔。我们使用松弛参数C来控制这一点(在nu-SVM中是nu)。这为我们提供了更宽的间隔和训练数据集上的更大误差,但提高了泛化能力和/或允许我们找到非线性可分数据的线性分隔。
现在,支持向量的数量取决于我们允许的松弛量和数据的分布。如果我们允许大量的松弛,我们将会有大量的支持向量。如果我们允许很少的松弛,我们将会有很少的支持向量。准确性取决于为所分析的数据找到合适的松弛水平。对于某些数据,可能无法获得高水平的准确性,我们必须找到我们能找到的最佳拟合。
非线性SVM
这让我们进入了非线性SVM。我们仍然试图线性地分隔数据,但现在我们试图在更高维度的空间中这样做。这是通过核函数完成的,核函数当然有自己的一套参数。当我们将结果转换回原始特征空间时,结果是非线性的:
现在,支持向量的数量仍然取决于我们允许的松弛量,但它也取决于我们模型的复杂性。我们输入空间中最终模型的每一个扭曲和转折都需要一个或多个支持向量来定义。最终,SVM的输出是支持向量和一个alpha,本质上定义了该特定支持向量对最终决策的影响程度。
在这里,准确性取决于高复杂度模型(可能过拟合数据)和大间隔(为了更好的泛化而错误分类一些训练数据)之间的权衡。支持向量的数量可以从非常少到每一个数据点,如果你完全过拟合你的数据。这种权衡是通过C以及通过选择核函数和核函数参数来控制的。
我假设你说到的性能是指准确性,但我还想谈谈计算复杂性方面的性能。为了使用SVM模型测试一个数据点,你需要计算每个支持向量与测试点的点积。因此,模型的计算复杂度与支持向量的数量成线性关系。支持向量越少,测试点的分类速度就越快。
一个好的资源:支持向量机用于模式识别的教程