C++ 支持向量机中的混乱细节&x27;s论文的序列最小优化
最近,我一直在学习Platt(1998)使用序列最小优化的支持向量机。这是他们的原稿: 这是另一个链接:C++ 支持向量机中的混乱细节&x27;s论文的序列最小优化,c++,machine-learning,svm,C++,Machine Learning,Svm,最近,我一直在学习Platt(1998)使用序列最小优化的支持向量机。这是他们的原稿: 这是另一个链接: 第二个链接描述了原始文件的实现细节,包括一个C++源代码,可以从这里下载: (但是,由于drand_48()函数仅在Linux上可用,因此代码无法运行,但我已经有了该函数的源代码,代码运行时间不会太长) 然而,在它们的实现中有一些奇怪且令人困惑的细节: 1) 在第一个链接,第10页,步骤步骤(i1,i2)中,有一行: if |a2 - alpha2 | < eps* (a2
第二个链接描述了原始文件的实现细节,包括一个C++源代码,可以从这里下载:
(但是,由于drand_48()函数仅在Linux上可用,因此代码无法运行,但我已经有了该函数的源代码,代码运行时间不会太长) 然而,在它们的实现中有一些奇怪且令人困惑的细节: 1) 在第一个链接,第10页,步骤步骤(i1,i2)中,有一行: if |a2 - alpha2 | < eps* (a2 + alpha2 + eps)
return 0;
if | a2-alpha2 |
其中a2为“新”拉格朗日乘数,alpha2为“旧”乘数。我真的不明白这条线是干什么的。我所知道的是,在这个函数中:首先,它试图找到2个拉格朗日乘数,在某些条件下(即y1*alpha1+y2*alph2=const),使目标函数最小化(或最大化,如在第二个链接中),然后必须对照KKT条件进行检查(2个字母必须在一个框中(0,C)(0,C))。它通过找到一阶导数消失的点,然后检查该点的二阶导数,看它是否真的是最小值,如果不是,检查边界上的目标函数(论文中的L和H)。SMO将拉格朗日乘数移动到具有最小值的端点
目标函数
以下是第一篇论文的摘录:
“如果目标函数两端相同(舍入误差在一个小ε范围内),且核服从Mercer条件,则联合最小化无法取得进展。”(第8页)
我想这就是这句话的意思,但我就是不明白它是如何运作的
2) 第8页的(19):6个复杂的公式,第一篇论文:我真的不明白它们的意思。
多谢各位 12.3 Psuedo代码读取
if (|a2 - alph2| < eps*(a2+alpa2+eps))
return 0;
因此函数终止,因为函数不能以如此小的增量进行。但为什么不只是| a2-alph2 |
a1 = alph1+s*(alph2-a2)