SMO算法伪代码

下面的smo算法伪代码摘自Platt的论文sequence minimal optimization: a fast algorithm for training support vector machines(1998)


if y1 != y2:
L = max(0, alpha2 - alpha1)   H = min(C, C + alpha2 - alpha1)       (*)
else if y1 == y2:
L = max(0, alpha2 + alpha1 - C)   H = min(C, alpha2 + alpha1)       (**)

target = desired output vector
point = training point matrix

procedure takeStep(i1, i2)
    if (i1 == i2) 
        return 0
    alpha1 = 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 (*) and (**)
    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 = alpha2 + 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 = alpha2
    if(|a2 - alpha2| < eps * (a2 + alpha2 + eps))
        return 0
    a1 = alpha1 + s * (alpha2 - 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]
    alpha2 = Lagrange multiplier for i2
    E2 = SVM output on point[i2] - y2 (check in error cache)
    r2 = E2 * y2
    if((r2 < -tol && alpha2 < C) || (r2 > tol && alpha2 > 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

你可能感兴趣的:(机器学习,SVM,SMO)