使用顺序最小优化的支持向量机论文中令人困惑的细节
Confusing details in Support vector machine's papers using Sequential Minimal Optimization
最近我一直在尝试使用Platt(1998)的顺序最小优化来学习支持向量机。这是他们的原始论文:
http://research.microsoft.com/apps/pubs/?id=68391这里是另一个链接:
http://www.cs.iastate.edu/honavar/smo-svm.pdf
第二个链接描述了原始论文的实现细节,包括c++源代码,可以从这里下载:ftp://www.ai.mit.edu/pub/users/tlp/projects/svm/svm-smo/
(代码不会运行,然而,由于一些问题与drand_48()函数只在Linux上可用,但我已经有该函数的源代码,它不会花费很长时间的代码运行)
然而,在它们的实现中有一些奇怪和令人困惑的细节:1)在第10页步骤takeStep (i1,i2)的第一个链接中,有一行:
if |a2 - alpha2 | < eps* (a2 + alpha2 + eps)
return 0;
,其中a2是"新的"拉格朗日乘子,alpha2是"旧的"拉格朗日乘子。我不太明白这行是干什么的。我所知道的是,在这个函数中:首先,它试图找到最小化(或最大化,如在第二个链接中)目标函数的2个拉格朗日乘数,在某些条件下(即y1 * alpha1 + y2 * alpha2 = const),然后它必须根据KKT条件进行检查(2个alpha必须在一个框(0,C)(0,C))。它通过找到一阶导数消失的点,然后检查该点的二阶导数,看看它是否真的是最小值,如果不是,检查目标函数的边界(论文中的L和H)。SMO将拉格朗日乘子移动到具有最小值的端点目标函数。
这是第一篇论文的节选:
"如果目标函数两端相同(舍入误差在一个小的ε范围内),并且核服从Mercer条件,则联合最小化无法进行。"(page8)
我想这就是描述这一行的意思,但我就是不明白它是如何工作的!
2)第一篇论文第8页的(19):6个复杂的公式:我真的不明白它们是什么意思。非常感谢!
12.3 Psuedo code read
if (|a2 - alph2| < eps*(a2+alpa2+eps))
return 0;
eps
为ε, epsilon,舍入误差较小。因此,如果绝对(正)差变得太小,那么下一行将产生一个很小的值
a1 = alph1+s*(alph2-a2)
,因此函数终止,因为函数不能以如此小的增量进行。
- 如何在C++中使用X509证书模在令牌中查找私钥
- constexpr上下文中std::initializer_list的验证
- holeMenuProgram.cpp:38:1 错误:'}'令牌之前的预期主表达式
- C++:"("令牌"之前有预期的非限定 id 指向类中成员函数的指针
- Arduino 用于语句错误。令牌之前的预期')' ';'。如何解决这个问题?
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 在 main.cpp 的上下文中找不到目录(带有 CMake 的快板)
- 错误:令牌 { '{' 之前应存在非限定 ID
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 允许哪些令牌作为 #include 的参数?
- 'using namespace'实现细节的便捷方法(仅标头库)?
- 有时可以在 constexpr 上下文中使用非 constexpr 变量?
- 如何在 assert() 和 static_assert() 之间调度,如果在 constexpr 上下文中依赖?
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 它在 { 令牌之前给了我预期的标识符
- (错误:令牌之前'<<'预期的主表达式)
- 为什么 ## aka 令牌粘贴运算符不适用于 C 和 C++ 中的注释?
- 指向模板上下文中的成员函数或静态函数的指针
- 假设声明中某些上下文中需要的名称查找规则是什么
- 可变参数模板上下文中"..."令牌的规则是什么?