Re: changing algorithm, finding residuals w/FindFit

*To*: mathgroup at smc.vnet.net*Subject*: [mg56904] Re: changing algorithm, finding residuals w/FindFit*From*: dh <dh at metrohm.ch>*Date*: Tue, 10 May 2005 03:42:07 -0400 (EDT)*References*: <d59l9q$6h6$1@smc.vnet.net> <42787687.5090305@metrohm.ch> <d5ctld$mcc$1@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

Hi Ed, see below Sincerely, Daniel Edward Peschko wrote: >On Wed, May 04, 2005 at 09:15:19AM +0200, dh wrote: > >>Hi Ed, >>if you want linear least square, you can use the one liner: >>points[[All, 2]] - ( Fit[points, {1, x, x^2}, x] /. x :> points[[All, 1]]) > > >ok, now suppose that I wanted to make a list of points containing both the >residual *and* the x-coordinate associated with that residual. > >The best I've come up with is: > >residuals = Thread > [ > { > points[[All,1]], > points[[All,2]] - (func /. x:> points[[All,1]] ) > } > ] > Your ideas are basically o.k., but the above will not work. Thread takes a FUNCTION, not an EXPRESSION. Take another point of view: Considering the list of points, you want to replace the y values by the residuals. Towards this aim we define a pure function: (...)& and use Map /@: {#[[1]],#[[2]]-fun/.x->#[[1]] }& /@ points This leaves the x value unchanged and replaces the y value by the residual. Further, if you later want to encapsulate everything into a function, it is not convenient to work with expressions like your "func" because you have the arbitrary variable "x" . It is better to use a "pure" function. E.g. fun1=Evaluate[fun/.x -> # ]& this can now be applied like a "real" function. e.g. fun1[2.] With this we can define the function residuals: residuals[points_,fun_]:={#[[1]],#[[2]]-fun[#[[1]]]}& /@ points and you would call it like: residuals[points,fun1] Note that we need a "pure" function now. >where func == 1 + x + 0. x^2. I'm not sure, but this is how I read it: > > 'All' gives a cross-array slice in an array of arrays > All simply means every value of the index. It does not matter if we have a 1,2,.. dimensional array. > '-', given two arrays, applies that operation to each element of that > array > provided the two arrays have the same shape or we have a scalar and an array. > > x:> points[[All, 1]] applies a production rule that substitutes x for > each x value in the cross-array slice. > > the parens group in the second expression so that instead of doing each > combination of evals and getting back > > ( > (y1 - func(x1), y1 - func(x2), y1 - func(x3)), > (y2 - func(x1), y2 - func(x2), y2 - func(x3)), > etc. > ) > > you get back: > > (y1 - func(x1), y2-func(x2), y3 - func(x3)) > > Finally, Thread applied on the whole thing interleaves values to get > > ((x1, y1-func(x1)), (x2, y2 - func(x2)), (x3, y3 - func(x3))) > >Is that basically right? Is there a way to do this in an easier way? > > > >Now... how would you make this into a generic function that took an array of >2D points and a function with one variable? I'd like to be able to call > > Residual[ points, function, ResidualType -> xsquared ] > >and return back a list of points, with their x values and their associated >vertical residuals. And I'd love to be able to expand this later on to have different >types of residuals. And more to the point it would be a great programming exercise. >I would think to be truly production worthy, it would need to be able to: > > 1) query the function, figure out if it is of the form: > > f[x_] = ... > > or is simply a variable that could use /. to substitute for values. > > 2) if it found none or more than one variable, return an exception > > 3) query the points, and see that they are in fact a two dimensional > array of points (ie: validate their data structure) > > 4) return back a list of point pairs. > >Any ideas on how to do on the above? and is there perhaps a good programming >text on mathematica that people would recommend? > I myself learned it by reading the "BOOK". It is long, but for programming you can jump over the type setting stuff. Further,for beginners there is a book from Nancy Blachman (hope I remember the name correctly) or there is the book from Roman Maeder and many others I do no more remember. > > >Ed > > > >(ps - > >>The option "Method" can have following values: >> Possible settings for Method include "ConjugateGradient", "Gradient", >>"LevenbergMarquardt", "Newton" and "QuasiNewton", with the default being >>Automatic. > > >Hmm.. I didn't notice any of this when going through the 'help' icon for >findFit. It just says: > > 'method automatic' > >with no links to point to the various methods. Perhaps the documentation >could be updated? >) > Hi, in the Help for FindFit (version 5.1) you find: "Possible settings for Method are as for FindMinimum. " > >( > pps - another thing with the online help menu - I noticed that the > items that are found by 'go' depend on which tab that is open. > Which I guess makes sense, once you know what you are doing. > > But perhaps a 'search all' button would be helpful (next to the > 'Go' button would help) - if nothing but to remind you that you > are only searching under one tab, not everything. > Sort of an "Search All" is the "Master Index" tab. > > I missed finding all the info on the statistical packages not > knowing this. And who knows what else.. >) > -- Daniel Huber Metrohm Ltd. Oberdorfstr. 68 CH-9100 Herisau Tel. +41 71 353 8585, Fax +41 71 353 8907 E-Mail:<mailto:dh at metrohm.ch> Internet:<http://www.metrohm.ch>