Train the model using the specified initialization strategy
        
        Args:
            fast:		    if true, fast gp is initialized
            scales0:        if not None init_method is set to manual
            fixed0:         initial fixed effects
            init_method:    initialization method \in {random,diagonal,manual} 
            termx:			term for diagonal diagonalisation
            n_times:        number of times the initialization
            perturb:        if true, the initial point is perturbed with gaussian noise
            perturbSize:    size of the perturbation
            verbose:        print if convergence is achieved

def findLocalOptimum(self,fast=False,scales0=None,fixed0=None,init_method=None,termx=0,n_times=10,perturb=True,pertSize=1e-3,verbose=True,lambd=None):
        """
        Train the model using the specified initialization strategy
        
        Args:
            fast:		    if true, fast gp is initialized
            scales0:        if not None init_method is set to manual
            fixed0:         initial fixed effects
            init_method:    initialization method \in {random,diagonal,manual} 
            termx:			term for diagonal diagonalisation
            n_times:        number of times the initialization
            perturb:        if true, the initial point is perturbed with gaussian noise
            perturbSize:    size of the perturbation
            verbose:        print if convergence is achieved
        """

        if init_method==None:
            if self.P==1:	init_method = 'random'
            else:           init_method = 'diagonal'

        if not self.init:		self.initGP(fast=fast)

        if scales0!=None and ~perturb: 	init_method = 'manual'
        
        if init_method=='diagonal':
            scales0 = self._getScalesDiag(termx=termx)
            
        if init_method=='diagonal' or init_method=='manual':
            if not perturb:		n_times = 1

        if fixed0==None:
            fixed0 = SP.zeros_like(self.gp.getParams()['dataTerm'])

        for i in range(n_times):
            if init_method=='random':
                scales1 = self._getScalesRand()
                fixed1  = pertSize*SP.randn(fixed0.shape[0],fixed0.shape[1])
            elif perturb:
                scales1 = scales0+pertSize*self._perturbation()
                fixed1  = fixed0+pertSize*SP.randn(fixed0.shape[0],fixed0.shape[1])
            else:
                scales1 = scales0
                fixed1  = fixed0
            conv = self.trainGP(scales0=scales1,fixed0=fixed1,lambd=lambd)
            if conv:    break
    
        if verbose:
            if conv==False:
                print('No local minimum found for the tested initialization points')
            else:
                print(('Local minimum found at iteration %d' % i))
 
        return conv