It seems you form: self.xk = x0 self.I = identity(len(self.xk))
p = self.I So self.I will be 2 x 2 matrix. And a is 4x4. Best Troels 2014-08-25 19:55 GMT+02:00 Troels Emtekær Linnet <[email protected]>: > Hi Ed. > > I get: > results = newton(func=func, dfunc=dfunc, d2func=d2func, args=args, > x0=x0, min_options=min_options, func_tol=func_tol, grad_tol=grad_tol, > maxiter=maxiter, full_output=full_output, print_flag=print_flag, > print_prefix=print_prefix) > File > "/sbinlab2/software/python-enthought-dis/canopy-1.4.0-full-rh5-64/Canopy_64bit/User/lib/python2.7/site-packages/minfx/newton.py", > line 51, in newton > results = min.minimise() > File > "/sbinlab2/software/python-enthought-dis/canopy-1.4.0-full-rh5-64/Canopy_64bit/User/lib/python2.7/site-packages/minfx/base_classes.py", > line 262, in minimise > self.new_param_func() > File > "/sbinlab2/software/python-enthought-dis/canopy-1.4.0-full-rh5-64/Canopy_64bit/User/lib/python2.7/site-packages/minfx/newton.py", > line 169, in new_param_func > self.pk = self.get_pk() > File > "/sbinlab2/software/python-enthought-dis/canopy-1.4.0-full-rh5-64/Canopy_64bit/User/lib/python2.7/site-packages/minfx/base_classes.py", > line 668, in gmw > return gmw(self.dfk, self.d2fk, self.I, self.n, self.mach_acc, > self.print_prefix, self.print_flag, return_matrix) > File > "/sbinlab2/software/python-enthought-dis/canopy-1.4.0-full-rh5-64/Canopy_64bit/User/lib/python2.7/site-packages/minfx/hessian_mods/gmw81.py", > line 101, in gmw > a = dot(p, dot(a, p)) > ValueError: matrices are not aligned > > > print p.shape = (2, 2) > print a.shape = (4, 4) > > Do you know what is wrong? > > Best > Troels > > 2014-08-25 19:15 GMT+02:00 Edward d'Auvergne <[email protected]>: >> Hi, >> >> Maybe to help work out what is happing both in Scipy and in relax, a >> simple test data set could be created. For example if you set I0 to >> 1000, R to 1, and then pick the time points 0, 1, 2, 3, 4, you would >> then have the intensity data: >> >> 0 1000.0 >> 1 367.879441171 >> 2 135.335283237 >> 3 49.7870683679 >> 4 18.3156388887 >> >> It might take some Bootstrapping simulations to obtain intensity >> errors. Just randomise I0 and R with a Gaussian distribution a large >> number of times, then work out the intensity SD values for each time >> point. >> >> Then you could pass the data and errors into the Scipy and relax code >> paths and see what you get for a covariance matrix. That might show >> if the double R2eff error is a bug or a failure of the covariance >> matrix error estimate. As it is synthetic data, you will know the >> exact parameter values. And you will know the exact error values to >> search for in the covariance matrix. >> >> Regards, >> >> Edward >> >> >> >> On 25 August 2014 18:02, Edward d'Auvergne <[email protected]> wrote: >>> 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

