马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
platt论文:[PDF] Sequential Minimal Optimization : A Fast Algorithm for Training Support Vector Machines | Semantic Scholar
算法优化:[PDF] Improvements to Platt's SMO Algorithm for SVM Classifier Design | Semantic Scholar
包罗个人platt版SMO代码实现、SMO 优化算法、libsvm:yanzhi0922/SVM: 2024.07.12 (github.com)
数据集获取:LIBSVM Data: Classification, Regression, and Multi-label (ntu.edu.tw)
platt原论文SMO伪代码:
- target = desired output vector
- point = training point matrix
- procedure takeStep(i1,i2)
- if (i1 == i2) return 0
- alph1 = Lagrange multiplier for i1
- y1 = target[i1]
- E1 = SVM output on point[i1] – y1 (check in error cache)
- s = y1*y2
- Compute L, H via equations (13) and (14)
- if (L == H)
- return 0
- k11 = kernel(point[i1],point[i1])
- k12 = kernel(point[i1],point[i2])
- k22 = kernel(point[i2],point[i2])
- eta = k11+k22-2*k12
- if (eta > 0)
- {
- a2 = alph2 + y2*(E1-E2)/eta
- if (a2 < L) a2 = L
- else if (a2 > H) a2 = H
- }
- else
- {
- Lobj = objective function at a2=L
- Hobj = objective function at a2=H
- if (Lobj < Hobj-eps)
- a2 = L
- else if (Lobj > Hobj+eps)
- a2 = H
- else
- a2 = alph2
- }
- if (|a2-alph2| < eps*(a2+alph2+eps))
- return 0
- a1 = alph1+s*(alph2-a2)
- Update threshold to reflect change in Lagrange multipliers
- Update weight vector to reflect change in a1 & a2, if SVM is linear
- Update error cache using new Lagrange multipliers
- Store a1 in the alpha array
- Store a2 in the alpha array
- return 1
- endprocedure
- procedure examineExample(i2)
- y2 = target[i2]
- alph2 = Lagrange multiplier for i2
- E2 = SVM output on point[i2] – y2 (check in error cache)
- r2 = E2*y2
- if ((r2 < -tol && alph2 < C) || (r2 > tol && alph2 > 0))
- {
- if (number of non-zero & non-C alpha > 1)
- {
- i1 = result of second choice heuristic (section 2.2)
- if takeStep(i1,i2)
- return 1
- }
- loop over all non-zero and non-C alpha, starting at a random point
- {
- i1 = identity of current alpha
- if takeStep(i1,i2)
- return 1
- }
- loop over all possible i1, starting at a random point
- {
- i1 = loop variable
- if (takeStep(i1,i2)
- return 1
- }
- }
- return 0
- endprocedure
- main routine:
- numChanged = 0;
- examineAll = 1;
- while (numChanged > 0 | examineAll)
- {
- numChanged = 0;
- if (examineAll)
- loop I over all training examples
- numChanged += examineExample(I)
- else
- loop I over examples where alpha is not 0 & not C
- numChanged += examineExample(I)
- if (examineAll == 1)
- examineAll = 0
- else if (numChanged == 0)
- examineAll = 1
- }
复制代码 以上算法根本原理雷同,效果雷同,优化是时间复杂度上的优化 ,libsvm时间复杂度最优
|