libsvm代码与理论

 如果你对模式分类有兴趣,并且对svm有一定的理解,此文和接下来的博文或许对你有帮助。

首先libsvm的代码可以在http://www.csie.ntu.edu.tw/~cjlin/libsvm/下载,我在这里介绍的是libsvmclassification部分。这个部分的training部分涉及两个核心过程,选两个alpha和更新这两个algha

上海交通大学的《libsvm2.6程序代码注释》讲解了libsvm的主要类和数据结构,并且对这两个过程也有一定描述,不过代码总是要对应着论文才能自圆其说,不然就是天书。

我在第一部分,介绍一下platt大牛的smo更新两个选中的alpha和如何快速选中最违反kkt条件的两个alpha的过程。在第二部分,基于S.S. Keerthi大牛的paper,介绍smo选两个alpha的改进策略。第三部分介绍libsvm的分类部分是如何贯彻这两位大牛的加速方针。

libsvm代码与理论_第1张图片

libsvm代码与理论_第2张图片

libsvm代码与理论_第3张图片

libsvm代码与理论_第4张图片

libsvm代码与理论_第5张图片

下面贴一段platt大牛的伪码:

target = desired output vector point = trainint point matrix procedure takeStep(i1, i2) if(i1 == i2) return 0; alpha1 = Lagrange multiplier for i1; y1 = target[i1]; y2 = target[i2]; E1 = SVM output on point[i1] - y1; // check in error cache E2 = SVM output on point[i2] - y2; s = y1*y2; compute L, H; // bound for alpha2_new if(L == H) return 0; k11 = kernel(point[i1], point[i1]); k12 = kernel(point[i1], point[i2]); k22 = kernel(point[i2], point[i2]); eta = 2*k12 - k11 - k22; if(eta < 0) { a2 = alhpa2 - y2 * (E1 - E2) / eta; if(a2 < L) a2 = L; else if(a2 > H) a2 = H; } else // violate the positive semi-definite law { Lobj = objective function at a2=L; Hobj = objective function at a2=H; if(Lobj > Hobj + eps) a2 = L; // to choose a higher objective value else if(Lobj < Hobj - eps) a2 = H; else a2 = alpha2; } if(abs(a2 - alpha2) < eps * (a2 + alpha2 + eps)) return 0; // update not very much a1 = alpha * (alpha2 - a2); Update threshold to reflect change in Lagrange multipliers; // update b Update weight vector to reflect change in a1 & a2, if linear SVM; // update w Update error cache using new Lagrange multipliers; // update E Store a1 in the alpha array; Store a2 in the alpha array; return 1; // update succeed

 http://download.csdn.net/source/1824762

这里有相关资料,以上纯粹整理。

你可能感兴趣的:(模式分类,算法)