def fmin(self, **kws): """ Use Nelder-Mead (simplex) minimization Parameters ---------- kws : dict Minimizer options to pass to the scipy.optimize.fmin minimizer. """ self.prepare_fit() fmin_kws = dict(full_output=True, disp=False, retall=True, ftol=1.e-4, xtol=1.e-4, maxfun=5000 * (self.nvarys + 1)) fmin_kws.update(kws) ret = scipy_fmin(self.penalty, self.vars, **fmin_kws) xout, fout, niter, funccalls, warnflag, allvecs = ret self.nfev = funccalls self.chisqr = self.residual = self.__residual(xout) self.ndata = 1 self.nfree = 1 if isinstance(self.residual, ndarray): self.chisqr = (self.chisqr**2).sum() self.ndata = len(self.residual) self.nfree = self.ndata - self.nvarys self.redchi = self.chisqr / self.nfree self.unprepare_fit() return
def fmin(self, **kws): """ Use Nelder-Mead (simplex) minimization Parameters ---------- kws : dict Minimizer options to pass to the scipy.optimize.fmin minimizer. """ self.prepare_fit() fmin_kws = dict(full_output=True, disp=False, retall=True, ftol=1.e-4, xtol=1.e-4, maxfun=5000 * (self.nvarys + 1)) fmin_kws.update(kws) ret = scipy_fmin(self.penalty, self.vars, **fmin_kws) xout, fout, niter, funccalls, warnflag, allvecs = ret self.nfev = funccalls self.chisqr = self.residual = self.__residual(xout) self.ndata = 1 self.nfree = 1 if isinstance(self.residual, ndarray): self.chisqr = (self.chisqr**2).sum() self.ndata = len(self.residual) self.nfree = self.ndata - self.nvarys self.redchi = self.chisqr/self.nfree self.unprepare_fit() return
def fmin(self, **kws): """ use nelder-mead (simplex) minimization """ self.prepare_fit() fmin_kws = dict(full_output=True, disp=False, retall=True, ftol=1.e-4, xtol=1.e-4, maxfun = 5000 * (self.nvarys + 1)) fmin_kws.update(kws) ret = scipy_fmin(self.penalty, self.vars, **fmin_kws) xout, fout, iter, funccalls, warnflag, allvecs = ret self.nfev = funccalls self.chisqr = (self.penalty(xout)**2).sum()
def fmin(self, **kws): """ use nelder-mead (simplex) minimization """ self.prepare_fit() fmin_kws = dict(full_output=True, disp=False, retall=True, ftol=1.e-4, xtol=1.e-4, maxfun = 5000 * (self.nvarys + 1)) fmin_kws.update(self.kws) fmin_kws.update(kws) # ugly hack to get number of data ndata - it causes 1 extra # func evaluation. Given the structure of the class it has to # happen *before* fitting, otherwise wipes best fit pars def ret_ndata(params): "custom function just to get the number of data points, because fmin doesn't do that" r = self.__residual(params) return len(r) self.ndata = ret_ndata(self.vars) # is this the simplest way? def penalty(params): "local penalty function -- eval sum-squares residual" r = self.__residual(params) if isinstance(r, ndarray): r = (r*r).sum() return r ret = scipy_fmin(penalty, self.vars, **fmin_kws) xout, fout, iter, funccalls, warnflag, allvecs = ret # RS: part hacked sum_sqr = fout self.chisqr = sum_sqr self.residual = -99 # FIXME: residula not implemented yet # - it is bit tricky to get to it self.nfree = (self.ndata - self.nvarys) self.redchi = sum_sqr / self.nfree self.nfev = funccalls # self.set_fitmethod('simplex') self.fitmethod='simplex'
def fmin(self, **kws): """ use nelder-mead (simplex) minimization """ self.prepare_fit() fmin_kws = dict(full_output=True, disp=False, retall=True, ftol=1.e-4, xtol=1.e-4, maxfun = 5000 * (self.nvarys + 1)) fmin_kws.update(kws) def penalty(params): "local penalty function -- eval sum-squares residual" r = self.__residual(params) if isinstance(r, ndarray): r = (r*r).sum() return r ret = scipy_fmin(penalty, self.vars, **fmin_kws) xout, fout, iter, funccalls, warnflag, allvecs = ret self.nfev = funccalls