【问题标题】:Computing Lagrange Multiplers for a simple Support Vector Machine计算简单支持向量机的拉格朗日乘数
【发布时间】:2015-04-13 13:38:43
【问题描述】:

首先,我是支持向量机的初学者,所以如果我以错误的方式解决这个问题,我很抱歉。我正在尝试从头开始实现一个非常简单的 SVM,它使用恒等核函数将线性可分数据分类为两个类之一。作为我将使用的数据类型的示例,请考虑在this document 中看到的下图:

使用点 (1,0), (3, 1) 和 (3, -1) 作为支持向量,我们知道以下关于计算决策平面的情况是正确的(来自同一文档的屏幕截图):

当稍微调整和重新排列时,我们分别得到了 -3.5、0.75 和 0.75 的拉格朗日乘数。

我了解这个代数在纸面上是如何工作的,但是我不确定在实现方面的最佳方法。所以我的问题如下:在实践中如何计算 SVM 的拉格朗日乘数?是否有我缺少的算法能够确定 任意 线性可分支持向量的这些值?我应该使用标准数学库来求解线性方程(我在 java 中实现 SVM)吗?这样的数学库对于大规模学习来说会很慢吗?请注意,这是一个学习练习,所以我不只是在寻找现成的 SVM 库。

任何其他建议将不胜感激!

编辑 1:LutzL 提出了一个很好的观点,即一半的问题实际上是确定哪些点将用作支持向量,所以为了简单起见,假设为了这个问题,他们已经计算过了。

【问题讨论】:

    标签: java math machine-learning svm linear-algebra


    【解决方案1】:

    独立于核函数,系数的确定导致具有线性正性约束的二次优化问题。如果天真地测试所有边界组件,这将具有可怕的复杂性,因此您无法避免高级优化算法,例如障碍或信任区域方法。

    还有一些启发式方法试图通过搜索靠近分隔线的点集并消除最有可能远离分隔线的点来将优化问题保持在低维度。

    【讨论】:

    • 嗨 LutzL,我肯定会在不久的将来研究更高级的优化算法,但是现在我只是在寻找一个简单的实现来让我起步。不过感谢您的回复。
    • 问题是活动点集合的确定。如果它们是已知的,那么确实只需要解决这个方程组。但是,选择拒绝过程的过于幼稚的实现可能会导致无限循环。
    • 等一下,你的意思是如果我知道支持向量,那么我应该只求解方程,即使用库?主要问题是首先确定支持向量?
    • 是的。一旦已知活动约束,即支持向量,拉格朗日函数的导数和活动约束形成一个线性系统,可以简化为您引用的形式。主动约束的有效选择或切换是非凸优化中尚未完全解决的问题。由于 SVM 问题的结构,存在有用的启发式训练-测试算法。