Hi,

You'll probably see that this is also the difference between the
scipy.optimize.leastsq() Levenberg-Marquardt optimisation function and
the other scipy.optimize functions.  There scipy.optimise interfaces
are not standardised.  However if you look at minfx
Levenberg-Marquardt interface:

http://home.gna.org/minfx/minfx.levenberg_marquardt-module.html

You will see the dfunc argument which should be the Jacobian returning
function.  The Levenberg-Marquardt optimisation is quite unique in
requiring additional information about the Jacobian.  None of the
other algorithms in minfx or scipy require this.

Regards,

Edward


On 26 August 2014 13:12,  <[email protected]> wrote:
> Author: tlinnet
> Date: Tue Aug 26 13:12:14 2014
> New Revision: 25285
>
> URL: http://svn.gna.org/viewcvs/relax?rev=25285&view=rev
> Log:
> Got the method of 'Steepest descent' to work properly, by specifying the 
> Jacobian correctly.
>
> The Jacobian was derived according to the chi2 function.
>
> The key point was to evaluate the two derivative arrays for all times points, 
> and
> and then sum each of the two arrays together, before constructing the 
> Jacobian.
>
> This clearly shows the difference between minfx and scipy.optimize.leastsq.
>
> scipy.optimize.leastsq takes as input a function F(x0), which should return 
> the array
> of weighted differences between function value and measured values:
> " 1. / self.errors * (self.calc_exp(self.times, *params) - self.values) "
>
> This will be an array with number of elements 'i' corresponding to number of 
> elements.
> scipy.optimize.leastsq then internally evaluates the sum of squares -> sum[ 
> (O - E)**2 ],
> and minimises this. This is the chi2.
>
> Minfx requires the function to minimise before hand.
> So, the "func" should be chi2.
>
> Then the dfunc, and d2func, should be derivative of chi2, bum all elements in 
> the array should
> still be summed together.
>
> task #7822(https://gna.org/task/index.php?7822): Implement user function to 
> estimate R2eff and associated errors for exponential curve fitting.
>
> Modified:
>     trunk/specific_analyses/relax_disp/estimate_r2eff.py
>
> Modified: trunk/specific_analyses/relax_disp/estimate_r2eff.py
> URL: 
> http://svn.gna.org/viewcvs/relax/trunk/specific_analyses/relax_disp/estimate_r2eff.py?rev=25285&r1=25284&r2=25285&view=diff
> ==============================================================================
> --- trunk/specific_analyses/relax_disp/estimate_r2eff.py        (original)
> +++ trunk/specific_analyses/relax_disp/estimate_r2eff.py        Tue Aug 26 
> 13:12:14 2014
> @@ -134,18 +134,6 @@
>          # Set algorithm.
>          self.min_algor = min_algor
>
> -        # Newton does not work.
> -        #self.min_algor = 'newton'
> -
> -        # Newton-CG does not work.
> -        #self.min_algor = 'Newton-CG'
> -
> -        # Also not work.
> -        #self.min_algor = 'Steepest descent'
> -
> -        # Also not work.#
> -        #self.min_algor = 'Fletcher-Reeves'
> -
>          # Define if constraints should be used.
>          self.constraints = constraints
>
> @@ -164,7 +152,6 @@
>              self.b = array([   0., -200.,    0.])
>
>          else:
> -            self.min_algor = 'simplex'
>              self.min_options = ()
>              self.A = None
>              self.b = None
> @@ -305,16 +292,15 @@
>
>          # Make partial derivative, with respect to r2eff.
>          # d_chi2_d_r2eff = 2.0*i0*times*(-i0*exp(-r2eff*times) + 
> values)*exp(-r2eff*times)/errors**2
> -        d_chi2_d_r2eff = 2.0 * i0 * self.times * ( -i0 * exp( -r2eff * 
> self.times) + self.values) * exp( -r2eff * self.times ) / self.errors**2
> +        d_chi2_d_r2eff = sum( 2.0 * i0 * self.times * ( -i0 * exp( -r2eff * 
> self.times) + self.values) * exp( -r2eff * self.times ) / self.errors**2 )
>
>          # Make partial derivative, with respect to i0.
>          # d_chi2_d_i0 = -2.0*(-i0*exp(-r2eff*times) + 
> values)*exp(-r2eff*times)/errors**2
> -        d_chi2_d_i0 = - 2.0 * ( -i0 * exp( -r2eff * self.times) + 
> self.values) * exp( -r2eff * self.times) / self.errors**2
> +        d_chi2_d_i0 = sum ( - 2.0 * ( -i0 * exp( -r2eff * self.times) + 
> self.values) * exp( -r2eff * self.times) / self.errors**2 )
>
>          # Define Jacobian as m rows with function derivatives and n columns 
> of parameters.
> -        jacobian_matrix = transpose(array( [d_chi2_d_r2eff , d_chi2_d_i0] ) )
> -
> -        #print jacobian_matrix
> +        #jacobian_matrix = transpose(array( [d_chi2_d_r2eff , d_chi2_d_i0] ) 
> )
> +        jacobian_matrix = array( [d_chi2_d_r2eff , d_chi2_d_i0] )
>
>          # Return Jacobian matrix.
>          return jacobian_matrix
> @@ -439,7 +425,7 @@
>  # 'minfx'
>  # 'scipy.optimize.leastsq'
>  # 'scipy.optimize.fmin_cg'
> -def estimate_r2eff(spin_id=None, ftol=1e-15, xtol=1e-15, maxfev=10000000, 
> factor=100.0, method='scipy.optimize.leastsq', verbosity=1):
> +def estimate_r2eff(spin_id=None, ftol=1e-15, xtol=1e-15, maxfev=10000000, 
> factor=100.0, method='minfx', verbosity=1):
>      """Estimate r2eff and errors by exponential curve fitting with 
> scipy.optimize.leastsq.
>
>      scipy.optimize.leastsq is a wrapper around MINPACK's lmdif and lmder 
> algorithms.
> @@ -782,7 +768,24 @@
>      x0 = asarray( E.estimate_x0_exp() )
>
>      # Set the min_algor.
> -    E.set_settings_minfx(min_algor='simplex')
> +    #min_algor='simplex'
> +
> +    # Steepest descent uses the gradient.
> +    min_algor = 'Steepest descent'
> +    max_iterations = 1000
> +
> +    # Newton does not work.
> +    # min_algor = 'newton'
> +
> +    # Newton-CG does not work.
> +    # min_algor = 'Newton-CG'
> +
> +
> +
> +    # Also not work.#
> +    # min_algor = 'Fletcher-Reeves'
> +
> +    E.set_settings_minfx(min_algor=min_algor, max_iterations=max_iterations)
>
>      # Define function to minimise for minfx.
>      if match('^[Ss]implex$', E.min_algor):
> @@ -791,7 +794,7 @@
>          dfunc = None
>          d2func = None
>      else:
> -        func = E.func_exp_chi2
> +        func = E.func_exp
>          dfunc = E.func_exp_grad
>          d2func = E.func_exp_hess
>
>
>
> _______________________________________________
> relax (http://www.nmr-relax.com)
>
> This is the relax-commits mailing list
> [email protected]
>
> To unsubscribe from this list, get a password
> reminder, or change your subscription options,
> visit the list information page at
> https://mail.gna.org/listinfo/relax-commits

_______________________________________________
relax (http://www.nmr-relax.com)

This is the relax-devel mailing list
[email protected]

To unsubscribe from this list, get a password
reminder, or change your subscription options,
visit the list information page at
https://mail.gna.org/listinfo/relax-devel

Reply via email to