是否可以在 OpenCV 3.1.0 中指定 SVM 隐藏层中的节点数?

Is it possible to specify number of nodes in hidden layer of SVM in OpenCV 3.1.0?

我只是想更好地控制 SVM 的结果。

试图搜索文档,但找不到似乎具有相同功能的函数。

可以说 SVM 没有隐藏节点,但这只是部分正确。

SVM,最初被称为支持向量网络(这是 Vapnik 自己的称呼),它们被视为一种具有单个隐藏层的神经网络。由于当时神经网络的流行,直到今天仍有许多人使用 sigmoid "kernel",尽管 它很少是有效的 Mercer 内核 (仅因为 NN 社区如此使用为了使用它,他们开始这样做,即使它没有数学依据)。

那么SVM到底是不是神经网络?是的,它可以看作是一个神经网络。事实上,通过这样的棱镜可以看到很多分类器。然而,真正让 SVM 与众不同的是它们的训练和参数化方式。特别是,支持向量机与 "activation functions" 一起工作,它们是有效的 Mercer 内核(它们在某些 space 中表示点积)。此外,隐藏节点的权重等于训练样本,因此你得到与训练样本相同数量的隐藏单元。在训练期间,SVM 本身通过解决 "prefers" 稀疏解(去除隐藏单元)的优化问题来减少隐藏单元的数量,从而最终得到由 子集组成的隐藏层训练样本,我们称它们为支持向量。需要强调的是,这不是 SVM 的经典观点,但它是一个有效的观点,NN 社区的人可能更容易理解。

那么你能控制这个数字吗?是和不是。不,因为 SVM 需要所有这些隐藏单元才能产生有效的优化问题,并且它会自行删除所有冗余单元。是的,因为有一个替代优化问题,称为 nu-SVM,它使用 nu-hyperparamer,它是 支持向量的下限 ,因此 隐藏单元的下限。不幸的是,您不能直接指定上限。

但我真的需要!如果是这种情况,您可以使用符合您的限制的近似解决方案。您可以使用 H 维采样器,它显式逼近内核 space (http://scikit-learn.org/stable/modules/kernel_approximation.html)。其中一种方法是 Nystroem 方法。简而言之,如果你想拥有“H 隐藏单元”,你只需拟合 Nystroem 模型以产生 H 维输出,你通过它转换你的输入数据,并拟合 线性 SVM 在上面。从数学的角度来看,这是用给定的内核逼近真正的非线性 SVM,但是速度很慢。