了解线性分类 SVM

Understanding an linear classification SVM

我正在尝试了解线性分类 SVM 的工作原理(如用于 HOG people detection 的那个)。我觉得我缺少一个重要的部分,我害怕我找不到一个清晰的描述来更好地理解它。我知道有现成的实现,最后我可能会使用其中之一,但我想了解我在做什么。

据我所知,支持向量机接受了许多特征向量和正确分类的训练。训练后,SVM 被完全定义为一组超平面(维数是特征向量的长度),通常是一个非常小的数字。我希望(天真地?)我训练有素的支持向量机是这样的:

ax >=b: 0
ax < b: 1

其中 x 是特征向量,ax = b 是超平面。这里我 运行 遇到问题是因为:

  1. 我不明白在 aforementioned paper 他们如何最终得到一个 1.7GB 的训练有素的 SVM。我的应该是 (64 bit/float * (特征向量的长度 + 1)).
  2. 使用此 SVM 进行分类很简单,一个点积和一个比较。尽管我似乎找不到太多关于使用 SVM 进行匹配需要多长时间的信息,但人们似乎正在寻找快速实现。

我确定在某些时候我误解了我所读的内容,但是我想知道我的想法哪里出了问题。我想我只是陷入了错误的心态,因为我对 SVM 的了解越多,我就越能看到上面的描述得到证实,这是不对的。

线性SVM是general soft margin kernel SVM的一个特例,模型可以表示为单个权重向量w和偏置b,所以分类由y = w'*x+b (这是决策值;您可以像以前一样用零作为阈值,或者选择另一个值进行权衡 precision/recall)。在一般情况下,模型由其支持向量及其权重来描述,因此其大小取决于找到的 SV 的数量,并且可能非常大。

一些软件库,如 libsvm,没有专门的代码来处理线性 SVM 分类,因此模型表示和分类功能在内存和 运行宁时间方面效率低下。但是,您可以通过使用存储的 SV 权重计算所有 SV 的加权和,轻松地将模型表示转换为上述线性分类器。然后你可以编写你自己的线性分类函数,使用任何你想让它运行快速的方法(例如矢量化代码)

在论文中他们似乎需要 1.7 GB 的 RAM 来训练分类器。为此,他们必须加载大约 14000 个 64x128 RGB 图像块。当使用整数存储时,最终大小约为 1.5 GB。

一旦分类器计算正确,只需要一个权重向量来检查给定样本位于超平面的哪一侧。