# [SciPy-User] adding linear fitting routine

35 messages
12
Open this post in threaded view
|

## [SciPy-User] adding linear fitting routine

 I would like to get some feedback and generate some discussion about a least squares fitting routine I submitted last Friday  [please see adding linear fitting routine (29 Nov 2013)].  I know that everybody is very busy, but it would be helpful to get some feedback and, I hope, eventually to get this routine added to one of the basic numpy/scipy libraries. David Pine _______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: adding linear fitting routine

Open this post in threaded view
|

## Re: adding linear fitting routine

Open this post in threaded view
|

## Re: adding linear fitting routine

 On 04/12/2013 13:43, David J Pine wrote: > linfit does not call a matrix inversion routine.  Instead it calculates > the best fit slope and y-intercept directly.  By contrast, polyfit does > call a matrix inversion routine (numpy.linalg.lstsq), which has a > certain amount of overhead that linfit avoids.  This may be why polyfit > is slower than linfit. A least squares fit is a matrix inversion. What you do is a matrix inversion, except that the notation you use does not make this clear. What you can discuss is the method you use for the inversion.  I would have to have a closer look to the test... > 4. relsigma.  Other than using no weighting at all, there are basically > two ways that people weight data in a least squares fit. >     (a) provide explicit absolute estimates of the errors > (uncertainties) for each data point.  This is what physical scientists > often do.  Setting relsigma=False tells linfit to use this method of > weighting the data.  If the error estimates are accurate, then the > covariance matrix provides estimates of the uncertainties in the fitting > parameters (the slope & y-intercept). >     (b) provide relative estimates of the errors (uncertainties) for > each data point (it's assumed that the absolute errors are not known but > relative uncertainties between difference data points is known).  This > is what social scientists often do.  When only the relative > uncertainties are known, the covariance matrix needs to be rescaled in > order to obtain accurate estimates of the uncertainties in the fitting > parameters.  Setting relsigma=True tells linfit to use this method of > weighting the data. This is not really clear from the docstring (plus it optional but no default value is specified in the docstring), and made even less obvious by the name of the parameter used to specify the uncertainties. I would prefer two independent and mutually exclusive parameters for the two cases, 'sigma' and 'relsigma' are one option if you want to be compatible with the (ugly, IMHO) parameter name used by curve_fit. Cheers, Daniele _______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: adding linear fitting routine

 In reply to this post by David Pine On 04/12/2013 13:43, David J Pine wrote: > 1. Generalization to arbitrary degree polynomials.  This already exists > in numpy.polyfit.  One limitation of polyfit is that it does not > currently allow the user to provide absolute uncertainties in the data, > but there has been some discussion of adding this capability. This is a huge limitation IMHO.  Furthermore, polyfit() allows only to fit polynomials up to an arbitrary order, not polynomials of arbitrary order (it is not possible to fit y = d * x**3 but only y = a + b * x + c * x**2 + d * x**3). Cheers, Daniele _______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: [SciPy-Dev] adding linear fitting routine

 In reply to this post by David Pine On 3 December 2013 11:19, David J Pine wrote: I would like to get some feedback and generate some discussion about a least squares fitting routine I submitted last Friday  On the wishlist level, I would like to see a complete model fitting, considering errors in both axis and correlation, and the option for a robust fitting system. See details, for example, here: http://arxiv.org/abs/1008.4686I haven't really needed it myself, so I haven't taken the time to implement it yet. /David. _______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: adding linear fitting routine

 In reply to this post by Daniele Nicolodi Daniele On Dec 4, 2013, at 1:55 PM, Daniele Nicolodi <[hidden email]> wrote: > On 04/12/2013 13:43, David J Pine wrote: >> linfit does not call a matrix inversion routine.  Instead it calculates >> the best fit slope and y-intercept directly.  By contrast, polyfit does >> call a matrix inversion routine (numpy.linalg.lstsq), which has a >> certain amount of overhead that linfit avoids.  This may be why polyfit >> is slower than linfit. > > A least squares fit is a matrix inversion. What you do is a matrix > inversion, except that the notation you use does not make this clear. > What you can discuss is the method you use for the inversion.  I would > have to have a closer look to the test... I assure you that I understand the mathematics.  Specifically, I understand that you can view the mathematics used in linfit as implementing matrix inversion.  That is not the point.  The point is that polyfit calls a matrix inversion routine, which invokes computational machinery that is slow compared to just doing the algebra directly without calling a matrix inversion routine.  I hope this is clear. > >> 4. relsigma.  Other than using no weighting at all, there are basically >> two ways that people weight data in a least squares fit. >>    (a) provide explicit absolute estimates of the errors >> (uncertainties) for each data point.  This is what physical scientists >> often do.  Setting relsigma=False tells linfit to use this method of >> weighting the data.  If the error estimates are accurate, then the >> covariance matrix provides estimates of the uncertainties in the fitting >> parameters (the slope & y-intercept). >>    (b) provide relative estimates of the errors (uncertainties) for >> each data point (it's assumed that the absolute errors are not known but >> relative uncertainties between difference data points is known).  This >> is what social scientists often do.  When only the relative >> uncertainties are known, the covariance matrix needs to be rescaled in >> order to obtain accurate estimates of the uncertainties in the fitting >> parameters.  Setting relsigma=True tells linfit to use this method of >> weighting the data. > > This is not really clear from the docstring (plus it optional but no > default value is specified in the docstring), and made even less obvious > by the name of the parameter used to specify the uncertainties. It's specified in the function definition: def linfit(x, y, sigmay=None, relsigma=True, cov=False, chisq=False, residuals=False) which is the way it's always done in the online numpy and scipy documentation. However, I can additionally specify it in the docstring under the parameter definition. > > I would prefer two independent and mutually exclusive parameters for the > two cases, 'sigma' and 'relsigma' are one option if you want to be > compatible with the (ugly, IMHO) parameter name used by curve_fit. Here I disagree.  sigmay is an array of error values.  resigma is a boolean that simply tells linfit whether to treat the sigmay values as relative (relsigma=True, the default) or as absolute (relsigma=False). David _______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: adding linear fitting routine

 On Wed, Dec 4, 2013 at 8:58 AM, David Pine <[hidden email]> wrote: > Daniele > > > On Dec 4, 2013, at 1:55 PM, Daniele Nicolodi <[hidden email]> wrote: > >> On 04/12/2013 13:43, David J Pine wrote: >>> linfit does not call a matrix inversion routine.  Instead it calculates >>> the best fit slope and y-intercept directly.  By contrast, polyfit does >>> call a matrix inversion routine (numpy.linalg.lstsq), which has a >>> certain amount of overhead that linfit avoids.  This may be why polyfit >>> is slower than linfit. >> >> A least squares fit is a matrix inversion. What you do is a matrix >> inversion, except that the notation you use does not make this clear. >> What you can discuss is the method you use for the inversion.  I would >> have to have a closer look to the test... > > I assure you that I understand the mathematics.  Specifically, I understand > that you can view the mathematics used in linfit as implementing matrix > inversion.  That is not the point.  The point is that polyfit calls a matrix > inversion routine, which invokes computational machinery that is slow > compared to just doing the algebra directly without calling a matrix > inversion routine.  I hope this is clear. > >> >>> 4. relsigma.  Other than using no weighting at all, there are basically >>> two ways that people weight data in a least squares fit. >>>    (a) provide explicit absolute estimates of the errors >>> (uncertainties) for each data point.  This is what physical scientists >>> often do.  Setting relsigma=False tells linfit to use this method of >>> weighting the data.  If the error estimates are accurate, then the >>> covariance matrix provides estimates of the uncertainties in the fitting >>> parameters (the slope & y-intercept). >>>    (b) provide relative estimates of the errors (uncertainties) for >>> each data point (it's assumed that the absolute errors are not known but >>> relative uncertainties between difference data points is known).  This >>> is what social scientists often do.  When only the relative >>> uncertainties are known, the covariance matrix needs to be rescaled in >>> order to obtain accurate estimates of the uncertainties in the fitting >>> parameters.  Setting relsigma=True tells linfit to use this method of >>> weighting the data. >> >> This is not really clear from the docstring (plus it optional but no >> default value is specified in the docstring), and made even less obvious >> by the name of the parameter used to specify the uncertainties. > > It's specified in the function definition: > > def linfit(x, y, sigmay=None, relsigma=True, cov=False, chisq=False, residuals=False) > > which is the way it's always done in the online numpy and scipy documentation. > However, I can additionally specify it in the docstring under the parameter > definition. > >> >> I would prefer two independent and mutually exclusive parameters for the >> two cases, 'sigma' and 'relsigma' are one option if you want to be >> compatible with the (ugly, IMHO) parameter name used by curve_fit. > > Here I disagree.  sigmay is an array of error values.  resigma is a boolean that simply > tells linfit whether to treat the sigmay values as relative (relsigma=True, the default) > or as absolute (relsigma=False). linfit looks like an enhanced version of linregress, which also has only one regressor, but doesn't have weights http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.htmlrelsigma is similar to the new `absolute_sigma` in curve_fit https://github.com/scipy/scipy/pull/3098I think linregress could be rewritten to include these improvements. Otherwise I keep out of any fitting debates, because I think `odr` is better for handling measurement errors in the x variables, and statsmodels is better for everything else (mainly linear only so far) and `lmfit` for nonlinear LS. There might be a case for stripped down convenience functions or special case functions. Josef > > David > _______________________________________________ > SciPy-User mailing list > [hidden email] > http://mail.scipy.org/mailman/listinfo/scipy-user_______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: adding linear fitting routine

 On Dec 4, 2013, at 3:24 PM, [hidden email] wrote:linfit looks like an enhanced version of linregress, which also hasonly one regressor, but doesn't have weightshttp://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.htmlThe problem with this is that the statistical tests that linregress uses--the r-value, p-value, & stderr-- are not really compatible with the weighted chi-squared fitting that linfit does.  The  r-value, p-value, & stderr are statistical tests that are used mostly in the social sciences (see http://en.wikipedia.org/wiki/Coefficient_of_determination).  Looking at linregress, it's clear that it was written with that community in mind.By contrast, linfit (and curve_fit) use the chi-squared measure of goodness of fit, which is explicitly made to be used with weighted data.  In my opinion, trying to satisfy the needs of both communities with one function will result in inefficient code and confusion in both user communities.  linfit naturally goes with the curve_fit and polyfit functions, and is implemented consistent with those fitting routines.  linregress is really a different animal, with statistical tests normally used with unweighted data, and I suspect that the community that uses it will be put off by the "improvements" made by linfit.relsigma is similar to the new `absolute_sigma` in curve_fithttps://github.com/scipy/scipy/pull/3098That's right.  linfit implements essentially the same functionality that is being implemented in curve_fitI think linregress could be rewritten to include these improvements.Otherwise I keep out of any fitting debates, because I think `odr` isbetter for handling measurement errors in the x variables, andstatsmodels is better for everything else (mainly linear only so far)and `lmfit` for nonlinear LS.There might be a case for stripped down convenience functions orspecial case functions.Josef_______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: adding linear fitting routine

 On Wed, Dec 4, 2013 at 11:29 AM, David Pine <[hidden email]> wrote: > > On Dec 4, 2013, at 3:24 PM, [hidden email] wrote: > > > linfit looks like an enhanced version of linregress, which also has > only one regressor, but doesn't have weights > http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html> > > The problem with this is that the statistical tests that linregress > uses--the r-value, p-value, & stderr-- are not really compatible with the > weighted chi-squared fitting that linfit does.  The  r-value, p-value, & > stderr are statistical tests that are used mostly in the social sciences > (see http://en.wikipedia.org/wiki/Coefficient_of_determination).  Looking at > linregress, it's clear that it was written with that community in mind. > > By contrast, linfit (and curve_fit) use the chi-squared measure of goodness > of fit, which is explicitly made to be used with weighted data.  In my > opinion, trying to satisfy the needs of both communities with one function > will result in inefficient code and confusion in both user communities. > linfit naturally goes with the curve_fit and polyfit functions, and is > implemented consistent with those fitting routines.  linregress is really a > different animal, with statistical tests normally used with unweighted data, > and I suspect that the community that uses it will be put off by the > "improvements" made by linfit. except for setting absolute_sigma to True or relsigma to False and returning redchisq instead of rsquared, there is no real difference. It's still just weighted least squares with fixed or estimated scale. (In statsmodels we have most of the same statistics returned after WLS as after OLS. However, allowing for a fixed scale is still not built in.) You still return the cov of the parameter estimates, so users can still calculate std_err and pvalue themselves in `linfit`. In my interpretation of the discussions around curve_fit, it seems to me that it is now a version that both communities can use. The only problem I see is that linfit/linregress get a bit ugly if there are many optional returns. Josef > > > relsigma is similar to the new `absolute_sigma` in curve_fit > https://github.com/scipy/scipy/pull/3098> > > That's right.  linfit implements essentially the same functionality that is > being implemented in curve_fit > > > > I think linregress could be rewritten to include these improvements. > > Otherwise I keep out of any fitting debates, because I think `odr` is > better for handling measurement errors in the x variables, and > statsmodels is better for everything else (mainly linear only so far) > and `lmfit` for nonlinear LS. > There might be a case for stripped down convenience functions or > special case functions. > > Josef > > > > _______________________________________________ > SciPy-User mailing list > [hidden email] > http://mail.scipy.org/mailman/listinfo/scipy-user> _______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: adding linear fitting routine

 Josef,Ok, so what would you propose?  That we essentially replace linregress with linfit, and then let people calculate std_err and pvalue themselves from the covariance matrix that `linfit` returns?  or something else?  By the way, that's what I chose to do for the estimates of the uncertainties in the fitting parameters--to let the user calculate the uncertainties in the fitting parameters from square roots the diagonal elements of the covariance matrix.  In my opinion, that results in a cleaner less cluttered function. David DavidOn Wed, Dec 4, 2013 at 6:03 PM, wrote: On Wed, Dec 4, 2013 at 11:29 AM, David Pine <[hidden email]> wrote: > > On Dec 4, 2013, at 3:24 PM, [hidden email] wrote: > > > linfit looks like an enhanced version of linregress, which also has > only one regressor, but doesn't have weights > http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html > > > The problem with this is that the statistical tests that linregress > uses--the r-value, p-value, & stderr-- are not really compatible with the > weighted chi-squared fitting that linfit does.  The  r-value, p-value, & > stderr are statistical tests that are used mostly in the social sciences > (see http://en.wikipedia.org/wiki/Coefficient_of_determination).  Looking at > linregress, it's clear that it was written with that community in mind. > > By contrast, linfit (and curve_fit) use the chi-squared measure of goodness > of fit, which is explicitly made to be used with weighted data.  In my > opinion, trying to satisfy the needs of both communities with one function > will result in inefficient code and confusion in both user communities. > linfit naturally goes with the curve_fit and polyfit functions, and is > implemented consistent with those fitting routines.  linregress is really a > different animal, with statistical tests normally used with unweighted data, > and I suspect that the community that uses it will be put off by the > "improvements" made by linfit. except for setting absolute_sigma to True or relsigma to False and returning redchisq instead of rsquared, there is no real difference. It's still just weighted least squares with fixed or estimated scale. (In statsmodels we have most of the same statistics returned after WLS as after OLS. However, allowing for a fixed scale is still not built in.) You still return the cov of the parameter estimates, so users can still calculate std_err and pvalue themselves in `linfit`. In my interpretation of the discussions around curve_fit, it seems to me that it is now a version that both communities can use. The only problem I see is that linfit/linregress get a bit ugly if there are many optional returns. Josef > > > relsigma is similar to the new `absolute_sigma` in curve_fit > https://github.com/scipy/scipy/pull/3098 > > > That's right.  linfit implements essentially the same functionality that is > being implemented in curve_fit > > > > I think linregress could be rewritten to include these improvements. > > Otherwise I keep out of any fitting debates, because I think `odr` is > better for handling measurement errors in the x variables, and > statsmodels is better for everything else (mainly linear only so far) > and `lmfit` for nonlinear LS. > There might be a case for stripped down convenience functions or > special case functions. > > Josef > > > > _______________________________________________ > SciPy-User mailing list > [hidden email] > http://mail.scipy.org/mailman/listinfo/scipy-user > _______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user _______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: adding linear fitting routine

 Josef,Actually, I just rechecked curve_fit and it returns only the optimal fitting parameters and the covariance matrix.  I could pare down linfit so that it returns only those quantities and leave it to the user to calculate chi0squared and the residuals.  I suppose that's the cleanest way to go. DavidOn Wed, Dec 4, 2013 at 6:47 PM, David J Pine wrote: Josef,Ok, so what would you propose?  That we essentially replace linregress with linfit, and then let people calculate std_err and pvalue themselves from the covariance matrix that `linfit` returns?  or something else?  By the way, that's what I chose to do for the estimates of the uncertainties in the fitting parameters--to let the user calculate the uncertainties in the fitting parameters from square roots the diagonal elements of the covariance matrix.  In my opinion, that results in a cleaner less cluttered function. David DavidOn Wed, Dec 4, 2013 at 6:03 PM, wrote: On Wed, Dec 4, 2013 at 11:29 AM, David Pine <[hidden email]> wrote: > > On Dec 4, 2013, at 3:24 PM, [hidden email] wrote: > > > linfit looks like an enhanced version of linregress, which also has > only one regressor, but doesn't have weights > http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html > > > The problem with this is that the statistical tests that linregress > uses--the r-value, p-value, & stderr-- are not really compatible with the > weighted chi-squared fitting that linfit does.  The  r-value, p-value, & > stderr are statistical tests that are used mostly in the social sciences > (see http://en.wikipedia.org/wiki/Coefficient_of_determination).  Looking at > linregress, it's clear that it was written with that community in mind. > > By contrast, linfit (and curve_fit) use the chi-squared measure of goodness > of fit, which is explicitly made to be used with weighted data.  In my > opinion, trying to satisfy the needs of both communities with one function > will result in inefficient code and confusion in both user communities. > linfit naturally goes with the curve_fit and polyfit functions, and is > implemented consistent with those fitting routines.  linregress is really a > different animal, with statistical tests normally used with unweighted data, > and I suspect that the community that uses it will be put off by the > "improvements" made by linfit. except for setting absolute_sigma to True or relsigma to False and returning redchisq instead of rsquared, there is no real difference. It's still just weighted least squares with fixed or estimated scale. (In statsmodels we have most of the same statistics returned after WLS as after OLS. However, allowing for a fixed scale is still not built in.) You still return the cov of the parameter estimates, so users can still calculate std_err and pvalue themselves in `linfit`. In my interpretation of the discussions around curve_fit, it seems to me that it is now a version that both communities can use. The only problem I see is that linfit/linregress get a bit ugly if there are many optional returns. Josef > > > relsigma is similar to the new `absolute_sigma` in curve_fit > https://github.com/scipy/scipy/pull/3098 > > > That's right.  linfit implements essentially the same functionality that is > being implemented in curve_fit > > > > I think linregress could be rewritten to include these improvements. > > Otherwise I keep out of any fitting debates, because I think `odr` is > better for handling measurement errors in the x variables, and > statsmodels is better for everything else (mainly linear only so far) > and `lmfit` for nonlinear LS. > There might be a case for stripped down convenience functions or > special case functions. > > Josef > > > > _______________________________________________ > SciPy-User mailing list > [hidden email] > http://mail.scipy.org/mailman/listinfo/scipy-user > _______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user _______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: adding linear fitting routine

Open this post in threaded view
|

## Re: adding linear fitting routine

Open this post in threaded view
|

## Re: adding linear fitting routine

Open this post in threaded view
|

## Re: adding linear fitting routine

 Hi David, On Wed, Dec 4, 2013 at 1:13 PM, David J Pine <[hidden email]> wrote: > I guess my preference would be to write have linfit() be as similar to > curve_fit() in outputs (and inputs in so far as it makes sense), and then if > we decide we prefer another way of doing either the inputs or the outputs, > then to do them in concert.  I think there is real value in making the user > interfaces of linfit() and curve_fit() consistent--it make the user's > experience so much less confusing. As of right now, I am agnostic about > whether or not the function returns a dictionary of results--although I am > unsure of what you have in mind.  How would you structure a dictionary of > results? > Using    return (pbest, covar)  seems reasonable.  But, if you returned a dictionary, you could include a chi-square statistic and a residuals array. scipy.optimize.leastsq() returns 5 items: (pbest, covar, infodict, mesg, ier) with infodict being a dict with items 'nfev', 'fvec', 'fjac', 'ipvt', and 'qtf'.   I think it's too late to change it, but it would have been nicer (IMHO) if it had returned a single dict instead:    return {'best_values': pbest, 'covar': covar, 'nfev': infodict['nfev'], 'fvec': infodict['fvec'],              'fjac': infodict['fjac'], 'ipvt': infodict['ipvt'], 'qtf': infodict['qtf'],  'mesg': mesg,  'ier': ier} Similarly, linregress() returns a 5 element tuple.  The problem with these is that you end up with long assignments     slope, intercept, r_value, p_value, stderr = scipy.stats.linregress(xdata, ydata) in fact, you sort of have to do this, even for a quick and dirty result when slope and intercept are all that would be used later on. The central problem is these 5 returned values are now in your local namespace, but they are not really independent values.  Instead, you could think about      regression = scipy.stats.linregress(xdata, ydata) and get to any of the values from computing the regression you want.  In short, if you had linfit() return a dictionary of values, you could put many statistics in it, and people who wanted to ignore some of them would be able to do so. FWIW, a named tuple would be fine alternative.  I don't know if backward compatibility would prevent that in scipy.   Anyway, it's just a suggestion.... --Matt _______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: adding linear fitting routine

Open this post in threaded view
|

## Re: adding linear fitting routine

 On 04/12/2013 23:00, David J Pine wrote: > Otherwise, everything is returned, and returned as a dictionary. I'll repeat myself: a named tuple is the way to go, not a dictionary. Cheers, Daniele _______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user
Open this post in threaded view
|

## Re: adding linear fitting routine

 On Wed, Dec 4, 2013 at 5:29 PM, Daniele Nicolodi <[hidden email]> wrote: > On 04/12/2013 23:00, David J Pine wrote: >> Otherwise, everything is returned, and returned as a dictionary. > > I'll repeat myself: a named tuple is the way to go, not a dictionary. namedtuples have the disadvantage that users use tuple unpacking and then it breaks again backwards compatibility if any return is changed in future. Josef > > Cheers, > Daniele > > _______________________________________________ > SciPy-User mailing list > [hidden email] > http://mail.scipy.org/mailman/listinfo/scipy-user_______________________________________________ SciPy-User mailing list [hidden email] http://mail.scipy.org/mailman/listinfo/scipy-user