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

时间:2016-05-31 06:58:01

标签: c++ opencv machine-learning neural-network svm

我很好奇能够更好地控制SVM的结果。

试图搜索文档,但找不到似乎也这样做的函数。

1 个答案:

答案 0 :(得分:2)

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

SVM最初被称为支持向量网络(这是Vapnik自己称之为),它们被视为一种具有单个隐藏层的神经网络。由于神经网络在这个时代的普及,直到今天很多人都使用sigmoid“kernel”,即使它很少是有效的Mercer内核(只是因为NN社区习惯使用它们才开始使用它们)这样做即使它没有数学上的理由)。

SVM是否也是神经网络?是的,可以被视为神经网络。实际上,通过这种棱镜可以看到许多分类器。然而,使SVM真正与众不同的是它们的训练和参数化方式。特别是,SVM使用“激活函数”,它们是有效的Mercer内核(它们在某些空间中表示点积)。此外,隐藏节点的权重等于训练样本,因此您获得与训练示例相同数量的隐藏单位。在训练过程中,SVM本身通过解决“偏好”稀疏解决方案(删除隐藏单元)的优化问题来减少隐藏单元的数量,从而最终得到由训练样本子集组成的隐藏层< / strong>,我们称之为支持向量。为了强调,这不是SVM的经典视图,但它是一个有效的视角,这可能更容易被NN社区的人理解。

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

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