Esempio n. 1
0
int takeStep(int i, int j, F2D* a, float C, F2D* e, F2D* Y, F2D* X, float eps, float* b, int N, int dim)
{
    int ret=1;
    float s;
    int m, n, k;
    float Ei, Ej, gamma, L, H;
    F2D *a_old;
    float k11, k12, k22, eta;
    F2D *temp, *temp1, *temp2;
    float t, t1, t2;
    float bnew, delta_b;
    float c1, c2, Lobj, Hobj;
    
    if(i==j)
        return 0;
        
    a_old = fDeepCopy(a);
    
    if( asubsref(a_old,i)>0 && asubsref(a_old,i)<C ) 
        Ei = asubsref(e,i);
    else
        Ei = cal_learned_func(i, a, b, N, Y, X, dim) - asubsref(Y,i);

    if( asubsref(a_old,j)>0 && asubsref(a_old,j)<C ) 
        Ej = asubsref(e,j);
    else
        Ej = cal_learned_func(j, a, b, N, Y, X, dim) - asubsref(Y,j);

    s = asubsref(Y,i) * asubsref(Y,j);

    if( asubsref(Y,i) == asubsref(Y,j) )
    {
        gamma = asubsref(a_old,i) + asubsref(a_old,j);
        if(gamma > C)
        {
            L = gamma - C;
            H = C;
        }
        else
        {
            L = 0;
            H = gamma;
        }
    }
    else
    {
        gamma = asubsref(a_old,i) - asubsref(a_old,j);
        if(gamma > 0)
        {
            L = 0;
            H = C - gamma;
        }
        else
        {
            L = -gamma;
            H = C;
        }
    }
    

    if(L==H)
    {
        fFreeHandle(a_old);
        return 0;
    }
           
    temp = fMallocHandle(1, X->width);
    temp1 = fMallocHandle(1, X->width);

    for(m=0; m<X->width; m++)
    {
        asubsref(temp,m) = subsref(X,i,m);
        asubsref(temp1,m) = subsref(X,j,m);
    }

    k11 = polynomial(3, temp, temp, dim);
    k12 = polynomial(3, temp, temp1, dim);
    k22 = polynomial(3, temp1, temp1, dim);
    eta = 2 * k12 - k11 - k22;

    fFreeHandle(temp1);
    fFreeHandle(temp);

    if(eta<0)
    {
        asubsref(a,j) = asubsref(a_old,j) + asubsref(Y,j) * (Ej-Ei)/eta;
        if( asubsref(a,j) < L)
            asubsref(a,j) = L;
        else if( asubsref(a,j) > H )
            asubsref(a,j) = H;
    }
    else
    {
        c1 = eta/2;
        c2 = asubsref(Y,j) * (Ei-Ej) - eta * asubsref(a_old,j);
        Lobj = c1 * L * L + c2 * L;
        Hobj = c1 * H * H + c2 * H;

        if (Lobj > (Hobj+eps))
            asubsref(a,j) = L;
        else if (Lobj < (Hobj-eps))
            asubsref(a,j) = H;
        else
            asubsref(a,j) = asubsref(a_old,j);
    }
    
    if( fabsf( asubsref(a,j)- asubsref(a_old,j) ) < (eps* (asubsref(a,j) + asubsref(a_old,j) +eps)) )
    {
        fFreeHandle(a_old);
        return 0;
    }

    asubsref(a,i) = asubsref(a_old,i) - s * ( asubsref(a,j) - asubsref(a_old,j) );

    if( asubsref(a,i) < 0)
    {
        asubsref(a,j) = asubsref(a,j) + s * asubsref(a,i);
        asubsref(a,i) = 0;
    }
    else if (asubsref(a,i) > C)
    {
        t = asubsref(a,i) - C;
        asubsref(a,j) = asubsref(a,j) + s * t;
        asubsref(a,i) = C;
    }

    /** Update threshold to react change in Lagrange multipliers **/

    if( asubsref(a,i) > 0 && asubsref(a,i) < C )
        bnew = arrayref(b,0) + Ei + asubsref(Y,i) * (asubsref(a,i) - asubsref(a_old,i)) * k11 + asubsref(Y,j) * (asubsref(a,j) - asubsref(a_old,j)) * k12;
    else
    {
        if( asubsref(a,j) > 0 && asubsref(a,j) < C )
            bnew = arrayref(b,0) + Ej + asubsref(Y,i) * (asubsref(a,i) - asubsref(a_old,i)) * k12 + asubsref(Y,j) * (asubsref(a,j) - asubsref(a_old,j)) * k22;
        else
        {
            float b1, b2;
            b1 = arrayref(b,0) + Ei + asubsref(Y,i) * (asubsref(a,i) - asubsref(a_old,i)) * k11 + asubsref(Y,j) * (asubsref(a,j) - asubsref(a_old,j)) * k12;
            b2 = arrayref(b,0) + Ej + asubsref(Y,i) * (asubsref(a,i) - asubsref(a_old,i)) * k12 + asubsref(Y,j) * (asubsref(a,j) - asubsref(a_old,j)) * k22;
            bnew = (b1 + b2) / 2;
        }
    }
    delta_b = bnew - arrayref(b,0);
    arrayref(b,0) = bnew;

    /** Update error cache using new Lagrange multipliers 24ai **/

    t1 = asubsref(Y,i) * (asubsref(a,i)-asubsref(a_old,i));
    t2 = asubsref(Y,j) * (asubsref(a,j)-asubsref(a_old,j));

    temp = fMallocHandle(1, X->width);
    temp1 = fMallocHandle(1, X->width);
    temp2 = fMallocHandle(1, X->width);

    for (k=0; k<N; k++)
    {
        if (0 < asubsref(a_old,i) && asubsref(a_old,i) < C )
        {

            for(m=0; m<X->width; m++)
            {
                asubsref(temp,m) = subsref(X,i,m);
                asubsref(temp1,m) = subsref(X,k,m);
                asubsref(temp2,m) = subsref(X,j,m);
            }

            asubsref(e,k) = asubsref(e,k)+t1 * polynomial(3, temp, temp1, dim) + t2 * polynomial(3, temp2, temp1, dim) - delta_b;
            asubsref(e,i) = 0;
            asubsref(e,j) = 0;
        }
    }
    
    fFreeHandle(a_old);
    fFreeHandle(temp);
    fFreeHandle(temp1);
    fFreeHandle(temp2);
    ret = 1;
    return ret;
}
Esempio n. 2
0
alphaRet* getAlphaFromTrainSet(int N, F2D* trn1, F2D* trn2, int iterations)
{
    float tolerance, C, eps, *b;
    F2D *a_result, *b_result;
    int NumChanged, r, ExamineAll, cnt, d, dim, ret, iter, i;
    F2D *X, *Y;
    F2D *a, *e;

    b = malloc(sizeof(float));
    alphaRet* alpha;
    alpha = (alphaRet*)malloc(sizeof(alphaRet));
    tolerance = 0.001;
    C = 0.05;
    d = -1;
    dim = 256;
    eps = 0.001;
    a_result = fSetArray(iterations, N, 0);
    b_result = fSetArray(iterations, 1, 0);
    ret = 0;
    
    X = usps_read_partial( trn1, trn2, 0, 1, (N/iterations), iterations);
    
    for(iter=0; iter<iterations; iter++)
    {
        Y = usps_read_partial( trn1, trn2, iter, 0, N/iterations, iterations);
        
        a = fSetArray(N, 1, 0);
        arrayref(b,0) = 0;                  /** check if ptr **/
        e = fSetArray(N, 1, 0);
        ExamineAll = 1;
        cnt = 0;
        NumChanged = 0;

        while(NumChanged>0 || ExamineAll == 1)
        {
            cnt = cnt + 1;
            NumChanged = 0;
            if(ExamineAll == 1)
            {
                for(i=0; i<N; i++)
                {
                    ret = examineExample(i, a, b, C, e, X, Y, tolerance, N, eps, dim);
                    NumChanged = NumChanged + ret;
                }
            }
            else
            {
                for(i=0; i<N; i++)
                {
                    if( asubsref(a,i) > 0 && asubsref(a,i) <C )
                    {
                        ret = examineExample(i, a, b, C, e, X, Y, tolerance, N, eps, dim);
                        NumChanged = NumChanged + ret;
                    }
                }
            }
            if(ExamineAll == 1)
                ExamineAll = 0;
            else if(NumChanged == 0)
                ExamineAll = 1;
        }

        for(r=0; r<N; r++)
            subsref(a_result,iter,r) = asubsref(a,r);   /** a_result has size iteration,N .. Check **/
        asubsref(b_result,iter) = arrayref(b,0);

        fFreeHandle(Y);
        fFreeHandle(e);
        fFreeHandle(a);
    }
  
    alpha->C = C;
    alpha->d = d;
    alpha->dim = dim;
    alpha->eps = eps;
    alpha->a_result = a_result;
    alpha->b_result = b_result;
    alpha->a = a;
    alpha->b = arrayref(b,0);
    alpha->X = X;
    alpha->tolerance = tolerance;
    alpha->ret;
    
    free(b);
   
    return alpha; 

}
Esempio n. 3
0
 ArrayConstRef result_uref() final {
     compute();
     return arrayref(std17::as_const(_result));
 }