コード例 #1
0
    def __init__(self, m, n):
        self.M = m
        self.N = n

        d = np.ones((n))

        self.diagH = sparse.diags(d, 0)
        # to reference the element, use diag.data[0,0]

        self.iter = 0
        self.maxfev = 20
        self.ftol = 0.0001
        self.gtol = 0.9
        self.nfun = 1
        self.finish = False
        self.eps = 1.0e-5
        self.iprint = [1, 0]

        self.stpmax = 1e20
        self.stpmin = 1e-20
        self.xtol = 1e-16

        self.mcsrch_instance = Mcsrch()
コード例 #2
0
ファイル: LBFGS.py プロジェクト: ustcblue/mllib
    def __init__(self,m,n):
        self.M = m
        self.N = n
        
        d = np.ones((n))

        self.diagH = sparse.diags(d,0)
        # to reference the element, use diag.data[0,0]

        self.iter = 0
        self.maxfev = 20
        self.ftol = 0.0001
        self.gtol = 0.9
        self.nfun = 1
        self.finish = False
        self.eps = 1.0e-5
        self.iprint = [1,0]
        
        self.stpmax = 1e20
        self.stpmin = 1e-20
        self.xtol = 1e-16
        
        self.mcsrch_instance = Mcsrch()
コード例 #3
0
class LBFGS:
    s = []
    y = []
    phro = []

    q = None

    diagH = None

    M = 0
    N = 0

    iter = 0
    bound = 0

    maxfev = 0
    ftol = 0
    stp1 = 0
    gnorm = 0
    nfun = 0

    yy = 0
    ys = 0

    gtol = 0
    xtol = 0
    maxfev = 0
    stpmin = 0
    stpmax = 0
    finish = False
    eps = 0

    info = [0]
    stp = [0.0]
    nfev = [0]
    iprint = [1, 0]
    mcsrch_instance = None

    #@m : latest m updates
    #@n : dimension of the feature vector
    def __init__(self, m, n):
        self.M = m
        self.N = n

        d = np.ones((n))

        self.diagH = sparse.diags(d, 0)
        # to reference the element, use diag.data[0,0]

        self.iter = 0
        self.maxfev = 20
        self.ftol = 0.0001
        self.gtol = 0.9
        self.nfun = 1
        self.finish = False
        self.eps = 1.0e-5
        self.iprint = [1, 0]

        self.stpmax = 1e20
        self.stpmin = 1e-20
        self.xtol = 1e-16

        self.mcsrch_instance = Mcsrch()

    def push_limit_array(self, array, item, limit):

        array.append(item)
        if len(array) > limit:
            array.pop(0)

    def lb1(self, iprint, nfun, gnorm, x, f, g, eval_mae, eval_auc, stp,
            finish):

        if self.iter == 0:
            print("*************************************************")
            print(
                " n = %d  number of corrections = %d\n   initial values f=%f gnorm=%f"
                % (self.N, self.M, f, gnorm))
            if iprint[2 - 1] >= 1:
                str = " vector x ="
                for i in range(1, self.N, 1):
                    str += ("  %f" % x[i - 1])
                print str

                str = " gradient vector g ="
                for i in range(1, self.N, 1):
                    str += (" %f" % g[i - 1])
                print str
            print("*************************************************")
            print("\ti\tnfn\tfunc\tgnorm\tsteplength\teval_mae\teval_auc")
        else:
            if (iprint[1 - 1] == 0) and (self.iter != 1 and finish != True):
                return
            if iprint[1 - 1] != 0:
                if (self.iter - 1) % iprint[1 - 1] == 0 or finish == True:
                    if iprint[2 - 1] > 1 and self.iter > 1:
                        print(
                            "\ti\tnfn\tfunc\tgnorm\tsteplength\teval_mae\teval_auc"
                        )
                    print("\t%d\t%d\t%f\t%f\t%f\t%f\t%f" %
                          (self.iter, nfun, f, gnorm, stp[0], eval_mae,
                           eval_auc))
                else:
                    return
            else:
                if iprint[2 - 1] > 1 and finish == True:
                    print(
                        "\ti\tnfn\tfunc\tgnorm\tsteplength\teval_mae\teval_auc"
                    )
                print("\t%d\t%d\t%f\t%f\t%f\t%f\t%f" %
                      (self.iter, nfun, f, gnorm, stp[0], eval_mae, eval_auc))

            if iprint[2 - 1] == 2 or iprint[2 - 1] == 3:
                if finish:
                    str = " final point x ="
                else:
                    str = " vector x =  "

                for i in range(1, self.N, 1):
                    str += ("  %f" % x[i - 1])
                print str
                if iprint[2 - 1] == 3:
                    str = (" gradient vector g =")
                    for i in range(1, self.N, 1):
                        str += " %f" % g[i - 1]
                    print str
            if finish:
                print(
                    " The minimization terminated without detecting errors. iflag = 0"
                )
        return

    def lbfgs(self, init_x, eval_func_for_train_set, eval_func_for_test_set):

        f = [0]
        g = [None]
        x = [scipy.mat(init_x).T]

        [f[0], g[0]] = eval_func_for_train_set(x[0])

        [eval_mae, eval_auc] = eval_func_for_test_set(x[0])

        if self.iter == 0:
            si = -self.diagH * g[0]
            self.s.append(si)
            self.gnorm = math.sqrt(g[0].T * g[0])
            self.stp1 = 1 / self.gnorm

            #print self.gnorm
            #print f[0]

            self.lb1(self.iprint, self.nfun, self.gnorm, x[0], f[0], g[0],
                     eval_mae, eval_auc, self.stp, self.finish)

            self.iter = self.iter + 1
            self.bound = self.iter - 1

        while True:

            if self.iter != 1:

                self.push_limit_array(self.phro, 1.0 / self.ys, self.M)

                q = -g[0]

                alpha = [0] * self.bound

                for i in range(self.bound - 1, -1, -1):
                    alpha[i] = (self.s[i].T * q * self.phro[i])[0, 0]
                    q = q - alpha[i] * self.y[i]

                q = self.diagH * q

                for i in range(0, self.bound):
                    beta = self.phro[i] * self.y[i].T * q
                    q = q + self.s[i] * (alpha[i] - beta)

                self.push_limit_array(self.s, q, self.M)

            if self.iter == 1:
                self.stp[0] = self.stp1
            else:
                self.stp[0] = 1

            w = g[0]

            self.nfev[0] = 0

            self.mcsrch_instance.mcsrch(x, f, g, self.s[-1], self.stp,
                                        eval_func_for_train_set, self.ftol,
                                        self.gtol, self.xtol, self.maxfev,
                                        self.stpmin, self.stpmax, self.nfev,
                                        self.info, False)

            [eval_mae, eval_auc] = eval_func_for_test_set(x[0])

            if self.info[0] == -1:
                print self.iter, self.info[0]
                return 1

            if self.info[0] != 1:
                print self.iter, self.info[0]
                return -1

            self.nfun += self.nfev[0]

            self.s[-1] = self.stp[0] * self.s[-1]

            self.push_limit_array(self.y, g[0] - w, self.M)

            self.gnorm = math.sqrt(g[0].T * g[0])
            self.xnorm = math.sqrt(x[0].T * x[0])
            if self.xnorm <= 1.0:
                self.xnorm = 1.0

            if self.gnorm / self.xnorm <= self.eps:
                self.finish = True

            self.lb1(self.iprint, self.nfun, self.gnorm, x[0], f[0], g[0],
                     eval_mae, eval_auc, self.stp, self.finish)

            if self.finish:
                return

            self.iter += 1
            self.info[0] = 0
            self.bound = self.iter - 1

            if self.iter > self.M:
                self.bound = self.M

            self.ys = (self.y[-1].T * self.s[-1])[0, 0]

            self.yy = (self.y[-1].T * self.y[-1])[0, 0]

            d = np.ones((self.N)) * (self.ys / self.yy)
            self.diagH = sparse.diags(d, 0)
コード例 #4
0
ファイル: LBFGS.py プロジェクト: ustcblue/mllib
class LBFGS:
    s = []
    y = []
    phro = []

    q = None
    
    diagH = None
    
    M = 0
    N = 0

    iter = 0
    bound = 0

    maxfev = 0
    ftol = 0
    stp1 = 0
    gnorm = 0
    nfun = 0

    yy = 0
    ys = 0

    gtol = 0
    xtol = 0
    maxfev = 0
    stpmin = 0
    stpmax = 0
    finish = False
    eps = 0
    
    info = [0]
    stp = [0.0]
    nfev = [0]
    iprint = [1,0]
    mcsrch_instance = None

    #@m : latest m updates
    #@n : dimension of the feature vector
    def __init__(self,m,n):
        self.M = m
        self.N = n
        
        d = np.ones((n))

        self.diagH = sparse.diags(d,0)
        # to reference the element, use diag.data[0,0]

        self.iter = 0
        self.maxfev = 20
        self.ftol = 0.0001
        self.gtol = 0.9
        self.nfun = 1
        self.finish = False
        self.eps = 1.0e-5
        self.iprint = [1,0]
        
        self.stpmax = 1e20
        self.stpmin = 1e-20
        self.xtol = 1e-16
        
        self.mcsrch_instance = Mcsrch()

    def push_limit_array(self,array,item,limit):
        
        array.append(item)
        if len(array) > limit:
            array.pop(0)
    
    def lb1 ( self, iprint , nfun , gnorm , x , f , g , eval_mae, eval_auc, stp , finish ):

        if self.iter == 0:
            print( "*************************************************" )
            print( " n = %d  number of corrections = %d\n   initial values f=%f gnorm=%f"  % (self.N,self.M,f,gnorm))
            if  iprint [ 2 -1] >= 1:
                str = " vector x =" 
                for  i in range(1,self.N,1):
                    str += ( "  %f" % x[i-1] )
                print str
                
                str = " gradient vector g =" 
                for i in range(1,self.N,1):
                    str += (" %f" % g[i-1] )
                print str
            print( "*************************************************" )
            print( "\ti\tnfn\tfunc\tgnorm\tsteplength\teval_mae\teval_auc" )
        else:
            if ( iprint [ 1 -1] == 0 ) and ( self.iter != 1 and finish != True ):
                return
            if iprint [ 1 -1] != 0:
                if  (self.iter - 1) % iprint [ 1 -1] == 0 or finish == True:
                    if  iprint [ 2 -1] > 1 and self.iter > 1 :
                        print( "\ti\tnfn\tfunc\tgnorm\tsteplength\teval_mae\teval_auc" );
                    print( "\t%d\t%d\t%f\t%f\t%f\t%f\t%f" % (self.iter,nfun,f,gnorm,stp[0],eval_mae, eval_auc ) )
                else:
                    return
            else:
                if iprint [ 2 -1] > 1 and finish == True: 
                        print( "\ti\tnfn\tfunc\tgnorm\tsteplength\teval_mae\teval_auc" )
                print( "\t%d\t%d\t%f\t%f\t%f\t%f\t%f" % (self.iter,nfun,f,gnorm,stp[0], eval_mae, eval_auc) )

            if  iprint [ 2 -1] == 2 or iprint [ 2 -1] == 3:
                if finish:
                    str = " final point x =" 
                else:
                    str = " vector x =  " 
                
                for i in range(1,self.N,1):
                    str += ( "  %f" % x[i-1] )
                print str
                if  iprint [ 2 -1] == 3 :
                    str = ( " gradient vector g =" )
                    for i in range(1,self.N,1):
                        str += " %f" % g[i-1]
                    print str
            if finish:
                print( " The minimization terminated without detecting errors. iflag = 0" );
        return
    
    def lbfgs(self, init_x, eval_func_for_train_set, eval_func_for_test_set):
        
        f = [0]
        g = [None]
        x = [scipy.mat(init_x).T]
        
        [f[0], g[0]]= eval_func_for_train_set(x[0])

        [eval_mae, eval_auc] = eval_func_for_test_set(x[0])

        if self.iter == 0:
            si = - self.diagH * g[0]
            self.s.append(si)
            self.gnorm = math.sqrt( g[0].T * g[0] )
            self.stp1 = 1/self.gnorm

            #print self.gnorm
            #print f[0]
            
            self.lb1(self.iprint, self.nfun, self.gnorm, x[0], f[0], g[0], eval_mae, eval_auc, self.stp, self.finish)
            
            self.iter = self.iter + 1
            self.bound = self.iter - 1

        while True:

            if self.iter != 1:
                
                self.push_limit_array(self.phro,1.0/self.ys,self.M)
                
                q = - g[0]

                alpha = [ 0 ] * self.bound

                for i in range(self.bound-1,-1,-1):
                    alpha[i] = (self.s[i].T * q * self.phro[i])[0,0]
                    q = q - alpha[i] * self.y[i]

                q = self.diagH * q

                for i in range(0,self.bound):
                    beta = self.phro[i] * self.y[i].T * q
                    q = q + self.s[i] * (alpha[i] - beta)

                self.push_limit_array(self.s,q,self.M)
                
            if self.iter == 1:
                self.stp[0] = self.stp1
            else:
                self.stp[0] = 1

            w = g[0]

            self.nfev[0] = 0
            
            self.mcsrch_instance.mcsrch(x, f, g, self.s[-1], self.stp, eval_func_for_train_set, self.ftol, self.gtol, self.xtol, self.maxfev, self.stpmin, self.stpmax, self.nfev, self.info,False)

            [eval_mae, eval_auc] = eval_func_for_test_set(x[0])

            if self.info[0] == -1:
                print self.iter,self.info[0]
                return 1

            if self.info[0]!= 1:
                print self.iter,self.info[0]
                return -1

            self.nfun += self.nfev[0]

            self.s[-1] = self.stp[0] * self.s[-1]
            
            self.push_limit_array(self.y,g[0]-w,self.M)

            self.gnorm = math.sqrt(g[0].T * g[0])
            self.xnorm = math.sqrt(x[0].T * x[0])
            if self.xnorm <= 1.0:
                self.xnorm = 1.0
            
            if self.gnorm / self.xnorm <= self.eps:
                self.finish = True
            
            self.lb1(self.iprint, self.nfun, self.gnorm, x[0], f[0], g[0], eval_mae, eval_auc, self.stp, self.finish)
            
            if self.finish:
                return
            
            self.iter += 1
            self.info[0] = 0
            self.bound = self.iter - 1

            if self.iter > self.M:
                self.bound = self.M
            
            
            self.ys = (self.y[-1].T * self.s[-1])[0,0]
            
            self.yy = (self.y[-1].T * self.y[-1])[0,0]

            d = np.ones((self.N)) * (self.ys / self.yy)
            self.diagH = sparse.diags(d,0)