Hi,

I just found a useful description of Jacobian construction with an example:

http://www.mathworks.de/de/help/optim/ug/writing-objective-functions.html#brkjt9_

In our case we have a vector function.  Given a time, the peak
intensity will be returned as

I = I0.exp(-R.t).

Regards,

Edward


On 25 August 2014 17:51, Edward d'Auvergne <[email protected]> wrote:
> They should be the same ordering as the parameter vector, as each
> column is a partial derivative with respect to that parameter.  The
> rows should be the x data or the time points.  Well, I hope this is
> correct, it's been many years since I coded the model-free Jacobian
> matrix.  Rather than using the new C code, maybe a test data set
> should be calculated by hand to determine if the covariance matrix
> calculation, and Jacobian calculation, is correct.
>
> Regards,
>
> Edward
>
>
>
> On 25 August 2014 17:47, Troels Emtekær Linnet <[email protected]> wrote:
>> Is the order of the columns in the Jacobian matrix important?
>>
>> Best
>> Troels
>>
>> 2014-08-25 17:42 GMT+02:00 Edward d'Auvergne <[email protected]>:
>>> That looks correct.  If you calculate:
>>>
>>> linalg.inv(dot(transpose(mat), mat))
>>>
>>> Do you get the covariance matrix?
>>>
>>> Regards,
>>>
>>> Edward
>>>
>>>
>>>
>>> On 25 August 2014 17:35, Troels Emtekær Linnet <[email protected]> 
>>> wrote:
>>>> Let me exemplify:
>>>>
>>>> There is 4 time points.
>>>>
>>>> df_d_i0 = - ( 2. * ( self.values - i0 / exp(r2eff * self.relax_times)
>>>> ) ) / ( exp(r2eff * self.relax_times) * self.errors**2)
>>>> df_d_r2eff = (2 * i0 * self.relax_times * (self.values - i0 /
>>>> exp(r2eff * self.relax_times) ) ) / ( exp(r2eff * self.relax_times) *
>>>> self.errors**2)
>>>>
>>>> Should the return then be:
>>>>
>>>> print df_d_i0.shape, df_d_i0
>>>> (4,) [-0.004826723918314 -0.00033019968656   0.002366308749814
>>>>  -0.000232558176186]
>>>>
>>>> print df_d_r2eff.shape, df_d_r2eff
>>>> (4,) [  0.                  2.66126225080615  -47.678483702132965
>>>>    9.371576058231405]
>>>>
>>>> mat = transpose(array( [df_d_i0, df_d_r2eff ]) )
>>>> print mat.shape, mat
>>>>
>>>>
>>>> (4, 2) [[ -4.826723918313830e-03   0.000000000000000e+00]
>>>>  [ -3.301996865596296e-04   2.661262250806150e+00]
>>>>  [  2.366308749814298e-03  -4.767848370213297e+01]
>>>>  [ -2.325581761857821e-04   9.371576058231405e+00]]
>>>>
>>>>
>>>> Best
>>>> Troels
>>>>
>>>> 2014-08-25 17:27 GMT+02:00 Edward d'Auvergne <[email protected]>:
>>>>> Hi,
>>>>>
>>>>> I may have explained this incorrectly earlier:
>>>>>
>>>>> - The vector of partial derivatives with respect to the chi-squared
>>>>> equation is the gradient.
>>>>> - The vector of partial derivatives with respect to the exponential
>>>>> function is the Jacobian.
>>>>>
>>>>> The equations and code for the exponential partial derivatives are the
>>>>> same in both.  It's just that they are used differently.  Does this
>>>>> help?
>>>>>
>>>>> Regards,
>>>>>
>>>>> Edward
>>>>>
>>>>> On 25 August 2014 17:26, Troels Emtekær Linnet <[email protected]> 
>>>>> wrote:
>>>>>> Hi Edward.
>>>>>>
>>>>>> When writing the Jacobian, do you then derivative according to ( i0 *
>>>>>> exp( -times * r2eff) )
>>>>>> or do you do the derivative according to chi2 function?
>>>>>>
>>>>>> I have a little hard time to figure out the code text.
>>>>>>
>>>>>> From minfx:
>>>>>>     @keyword func:          The function which returns the value.
>>>>>>     @type func:             func
>>>>>>
>>>>>> So, this is the chi2 function.
>>>>>>
>>>>>>     @keyword dfunc:         The function which returns the gradient.
>>>>>>     @type dfunc:            func
>>>>>>
>>>>>> So, this must be the derivative of the chi2 function?
>>>>>>
>>>>>> So in essence.
>>>>>>
>>>>>> Does minfx expect a "dfunc" function which calculate the:
>>>>>>
>>>>>> one gradient chi2 value, subject to the input parameters?
>>>>>>
>>>>>> Or
>>>>>> A jacobian matrix of the form:
>>>>>> m X n matrix, where m is the number of time elements and n is number
>>>>>> of parameters = 2.
>>>>>>
>>>>>> Best
>>>>>> Troels
>>>>>>
>>>>>> 2014-08-25 15:52 GMT+02:00 Edward d'Auvergne <[email protected]>:
>>>>>>> Hi Troels,
>>>>>>>
>>>>>>> Please see below:
>>>>>>>
>>>>>>> On 25 August 2014 13:01, Troels Emtekær Linnet <[email protected]> 
>>>>>>> wrote:
>>>>>>>> 2014-08-25 11:19 GMT+02:00 Edward d'Auvergne <[email protected]>:
>>>>>>>>> Hi Troels,
>>>>>>>>>
>>>>>>>>> Unfortunately you have gone ahead an implemented a solution without
>>>>>>>>> first discussing or planning it.  Hence the current solution has a
>>>>>>>>> number of issues:
>>>>>>>>>
>>>>>>>>> 1)  Target function replication.  The solution should have reused the
>>>>>>>>> C modules.  The original Python code for fitting exponential curves
>>>>>>>>> was converted to C code for speed
>>>>>>>>> (http://gna.org/forum/forum.php?forum_id=1043).  Note that two point
>>>>>>>>> exponentials that decay to zero is not the only way that data can be
>>>>>>>>> collected, and that is the reason for Sebastien Morin's
>>>>>>>>> inversion-recovery branch (which was never completed).  Anyway, the
>>>>>>>>> code duplication is not acceptable.  If the C module is extended with
>>>>>>>>> new features, such as having the true gradient and Hessian functions,
>>>>>>>>> then the Python module will then be out of sync.  And vice-versa.  If
>>>>>>>>> a bug is found in one module and fixed, it may still be present in the
>>>>>>>>> second.  This is a very non-ideal situation for relax to be in, and is
>>>>>>>>> the exact reason why I did not allow the cst branch to be merged back
>>>>>>>>> to trunk.
>>>>>>>>
>>>>>>>> Hi Edward.
>>>>>>>>
>>>>>>>> I prefer not to make this target function dependent on C-code 
>>>>>>>> compilation.
>>>>>>>>
>>>>>>>> Compilation of code on windows can be quite a hairy thing.
>>>>>>>>
>>>>>>>> For example see:
>>>>>>>> http://wiki.nmr-relax.com/Installation_windows_Python_x86-32_Visual_Studio_Express_for_Windows_Desktop#Install_Visual_Studio_Express_2012_for_Windows_Desktop
>>>>>>>>
>>>>>>>> Visua Studio Express is several hundreds of megabyte installation, for
>>>>>>>> just compiling an exponential curve. ?
>>>>>>>> This is way, way overkill for this situation.
>>>>>>>
>>>>>>> The C code compilation has been a requirement in relax since 2006.
>>>>>>> This was added not only for speed, but as a framework to copy for
>>>>>>> other analysis types in the future.  Once a Python target function has
>>>>>>> been fully optimised, for the last speed up the code can be converted
>>>>>>> to C.  This is the future plan for a number of the relax analyses.
>>>>>>> But first the Python code is used for prototyping and for finding the
>>>>>>> fastest implementation/algorithm.
>>>>>>>
>>>>>>> The C compilation will become an even greater requirement once I write
>>>>>>> C wrapper code for QUADPACK to eliminate the last dependencies on
>>>>>>> Scipy.  And the C compilation framework allows for external C and
>>>>>>> FORTRAN libraries to be added to the 'extern' package in the future,
>>>>>>> as there are plenty of open source libraries out there with compatible
>>>>>>> licences which could be very useful to use within relax.
>>>>>>>
>>>>>>>
>>>>>>>>> 2)  Scipy is now a dependency for the dispersion analysis!  Why was
>>>>>>>>> this not discussed?  Coding a function for calculating the covariance
>>>>>>>>> matrix is basic.  Deriving and coding the real gradient function is
>>>>>>>>> also basic.  I do not understand why Scipy is now a dependency.  I
>>>>>>>>> have been actively trying to remove Scipy as a relax dependency and
>>>>>>>>> only had a single call for numeric quadratic intergration via QUADPACK
>>>>>>>>> wrappers left to remove for the frame order analysis.  Now Scipy is
>>>>>>>>> back :(
>>>>>>>>
>>>>>>>> Hi Edward.
>>>>>>>>
>>>>>>>> Scipy is a dependency for trying calculation with 
>>>>>>>> scipy.optimize.leastsq.
>>>>>>>>
>>>>>>>> How could it be anymore different?
>>>>>>>>
>>>>>>>> What you are aiming at, is to add yet another feature for estimating 
>>>>>>>> the errors.
>>>>>>>> A third solution.
>>>>>>>>
>>>>>>>> What ever the third solution would come up with of dependency, would
>>>>>>>> depend on the method implemented.
>>>>>>>> One could also possible imagine to extend this procedures in R, Matlab
>>>>>>>> or whatever.
>>>>>>>>
>>>>>>>> Byt they would also need to meet some dependencies.
>>>>>>>>
>>>>>>>> Of course the best solution would always try to make relax most 
>>>>>>>> independent.
>>>>>>>>
>>>>>>>> But if the desire is to try with scipy.optimize.leastsq, then you are
>>>>>>>> bound with this dependency.
>>>>>>>
>>>>>>> That's why I asked if only the covariance matrix is required.  Then we
>>>>>>> can replace the use of scipy.optimize.leastsq() with a single function
>>>>>>> for calculating the covariance matrix.
>>>>>>>
>>>>>>>
>>>>>>>>> 3)  If the covariance function was coded, then the specific analysis
>>>>>>>>> API could be extended with a new covariance method and the
>>>>>>>>> relax_disp.r2eff_estimate user function could have simply been called
>>>>>>>>> error_estimate.covariance_matrix, or something like that.  Then this
>>>>>>>>> new error_estimate.covariance_matrix user function could replace the
>>>>>>>>> monte_carlo user functions for all analyses, as a rough error
>>>>>>>>> estimator.
>>>>>>>>
>>>>>>>> That would be the third possibility.
>>>>>>>
>>>>>>> ..., that would give the same result, save the same amount of time,
>>>>>>> but would avoid the new Scipy dependency and be compatible with all
>>>>>>> analysis types ;)
>>>>>>>
>>>>>>>
>>>>>>>>> 4)  For the speed of optimisation part of the new
>>>>>>>>> relax_disp.r2eff_estimate user function, this is not because scipy is
>>>>>>>>> faster than minfx!!!  It is the choice of algorithms, the numerical
>>>>>>>>> gradient estimate, etc.
>>>>>>>>> (http://thread.gmane.org/gmane.science.nmr.relax.scm/22979/focus=6812).
>>>>>>>>
>>>>>>>> This sound good.
>>>>>>>>
>>>>>>>> But I can only say, that as I user I meet a "big wall of time
>>>>>>>> consumption", for the error
>>>>>>>> estimation of R2eff via Monte-Carlo.
>>>>>>>>
>>>>>>>> As a user, I needed more options to try out.
>>>>>>>
>>>>>>> The idea of adding the covariance matrix error estimate to relax is a
>>>>>>> great idea.  Despite its lower quality, it is hugely faster than Monte
>>>>>>> Carlo simulations.  It has been considered it before, see
>>>>>>> http://thread.gmane.org/gmane.science.nmr.relax.user/602/focus=629 and
>>>>>>> the discussions in that thread.  But the time required for Monte Carlo
>>>>>>> simulations was never an issue so the higher quality estimate remained
>>>>>>> the only implementation.
>>>>>>>
>>>>>>> What I'm trying to do, is to direct your solution to be general and
>>>>>>> reusable.  I'm also thinking of other techniques at the same time,
>>>>>>> Jackknife simulations for example, which could be added in the future
>>>>>>> by developers with completely different interests.
>>>>>>>
>>>>>>>
>>>>>>>>> 5)  Back to Scipy.  Scipy optimisation is buggy full stop.  The
>>>>>>>>> developers ignored my feedback back in 2003.  I assumed that the
>>>>>>>>> original developers had just permanently disappeared, and they really
>>>>>>>>> never came back.  The Scipy optimisation code did not change for many,
>>>>>>>>> many years.  While it looks like optimisation works, in some cases it
>>>>>>>>> does fails hard, stopping in a position in the space where there is no
>>>>>>>>> minimum!  I added the dx.map user function to relax to understand
>>>>>>>>> these Scipy rubbish results.  And I created minfx to work around these
>>>>>>>>> nasty hidden failures.  I guess such failures are due to them not
>>>>>>>>> testing the functions as part of a test suite.  Maybe they have fixed
>>>>>>>>> the bugs now, but I really can no longer trust Scipy optimisation.
>>>>>>>>>
>>>>>>>>
>>>>>>>> I am sorry to hear about this.
>>>>>>>>
>>>>>>>> And I am totally convinced that minfx is better for minimising the
>>>>>>>> dispersion models.
>>>>>>>> You have proven that quite well in your papers.
>>>>>>>>
>>>>>>>> I do though have a hard time believing that minimisation of an
>>>>>>>> exponential function should be
>>>>>>>> subject to erroneous results.
>>>>>>>>
>>>>>>>> Anyway, this is still left to "freedom of choice" for the user.
>>>>>>>
>>>>>>> The error in the original Scipy optimisation code was causing quite
>>>>>>> different results.  The 3 algorithms, now that I look back at my
>>>>>>> emails from 2003, are:
>>>>>>>
>>>>>>> - Nelder-Mead simplex,
>>>>>>> - Levenberg-Marquardt,
>>>>>>> - NCG.
>>>>>>>
>>>>>>> These are still all present in Scipy, though I don't know if the code
>>>>>>> is different from back in 2003.  The error in the Levenberg-Marquardt
>>>>>>> algorithm was similar to the Modelfree4 problem, in that a lamba
>>>>>>> matrix updating condition was incorrectly checked for.  When the
>>>>>>> gradient was positive, i.e. up hill, the matrix should update and the
>>>>>>> algorithm continue to try to find a downhill step.  If the conditions
>>>>>>> are not correctly checked for, the algorithm thinks that the up hill
>>>>>>> step means that it is at the minimum.  But this is not the case, it is
>>>>>>> just pointing in the wrong direction.  I don't remember what the NCG
>>>>>>> bug was, but that one was much more severe and the results were
>>>>>>> strange.
>>>>>>>
>>>>>>> Failures of optimisation algorithms due to bugs can be quite random.
>>>>>>> And you often don't see them, as you don't know what the true result
>>>>>>> really is.  But such bugs will affect exponential functions, despite
>>>>>>> their simplicity.
>>>>>>>
>>>>>>> Regards,
>>>>>>>
>>>>>>> Edward

_______________________________________________
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