[SciPy-User] SciPy-User Digest, Vol 82, Issue 43
Timothy Kinney
timothyjkinney at gmail.com
Tue Jun 15 11:52:35 EDT 2010
> From: Charles R Harris <charlesr.harris at gmail.com>
> Subject: Re: [SciPy-User] Leastsq questions
>> I am using the scipy leastsq method to fit some cooling data, such
>> that the temperature is defined by an exponential decay function
>> (Newton's Cooling Law). However, there are some other factors which
>> also influence the cooling rate and I am attempting to account for
>> them in the cooling law. I have some questions about leastsq:
>>
>> 1) When I fit the data in Excel I get a different fit than when I fit
>> the same data in Scipy. Why is this? The fits are not very different,
>> but they are consistently different.
>>
> It is impossible to know without a good deal more information, i.e., what is
> your model, how is it parameterized, what is the data, when do the
> iterations stop, and, if the parameters aren't sufficiently independent over
> the data set, what is the required condition number. I suspect the latter is
> coming into play here.
I am using Newton's Cooling Law as the model. It states that the
temperature at time t can be determined as an exponential decay term
modifying the difference in temperature between the body and the
environment:
T(t) = Ta + (T0- Ta)Exp(-kt) where Ta is the ambient temperature, T0
is the temperature at t=0, and k is the cooling constant (determined
empirically, which is what I am doing by regression).
I have temperature and time data points for my sample which I am
plotting in Excel 2003 and Python. I then perform an exponential fit
using the graphical trendline in Excel and using leastsq in Scipy.
The data points (as lists in Python) are:
time = [356, 1476, 1477, 1478, 1480, 1480, 1481, 1482, 1485, 1489]
temp = [600, 50, 46, 43, 40, 39, 38, 37, 36, 35]
In Excel, I get the fit: y = 1416.904401 exp(-0.002406x) with R^2 0.9855
In Python, I get y = 1638.2891 * exp(-0.00251719x) and I'm not sure
what the R^2 is.
>> 2) How do I calculate the goodness of fit (R squared) for the leastsq
>> algorithm? I think it's just the sum of the squared errors divided by
>> something, but shouldn't this be easily called from the output?
>>
>>
> If you are using the function correctly, then you already have an error
> function that returns the residuals. Note that it is also available in the
> full return.
If I call the residuals function with the plsq[0] (the returned
information from calling leastsq), I get an array (abbreviating the
decimals):
[-68.67 10.11 7.21 5.21 3.31 0.42 0.51 -0.49 -1.39 -2.29 -2.19 -2.99
-3.70 -3.60]
If I square each value and sum over the array I get 4956.00, but I
need to divide this by something to calculate the R^2. I see no where
in the documentation for leastsq where this is explained or where this
calculation is callable.
My full return is pasted below but I don't see an R^2 written in
there...maybe it is called something else?
(array([ 1.63828911e+03, -2.51719240e-03]), array([[
2.11286829e-01, -1.68448450e-06],
[ -1.68448450e-06, 2.41312772e-11]]), {'qtf':
array([-0.00033384, 0.00037401]), 'nfev': 16, 'fjac': array([[
3.05684317e+05, 2.36280141e-01, 2.23786930e-01,
2.15345493e-01, 2.06813134e-01, 1.93842627e-01,
1.93842627e-01, 1.89472893e-01, 1.85079918e-01,
1.80663583e-01, 1.80663583e-01, 1.76223829e-01,
1.71760516e-01, 1.71760516e-01],
[ 2.43706858e+00, 2.17552354e+00, 2.48497525e-01,
2.56589204e-01, 2.64756241e-01, 2.77149269e-01,
2.77149269e-01, 2.81318568e-01, 2.85507103e-01,
2.89714982e-01, 2.89714982e-01, 2.93942237e-01,
2.98188985e-01, 2.98188985e-01]]), 'fvec': array([
-5.80026885, 31.45722273, 21.5073541 , 14.16136832,
7.77830677, -2.36621221, -1.36621221, -5.09979308,
-7.84278392, -10.59520846, -9.59520846, -11.35709047,
-12.12845379, -11.12845379]), 'ipvt': array([2, 1])}, 'Both
actual and predicted relative reductions in the sum of squares\n are
at most 0.000000', 1)
> I would like to iterate over a computation where I change one of the
>> values and see how it effects the goodness of the fit. I'm not sure
>> how to calculate the r-squared from the plsq that is returned from
>> leastsq.
> plsq?
Sorry, that's what I named the returned information from calling
leastsq. plsq[0] is the array containing the coefficients for the fit.
This is actually a different fit from the one I am confused about
above. But if I can figure out how to calculate the R^2 from leastsq,
I think I can figure out how to solve that one. Or if not, I'll post
more detailed info about it.
I appreciate any help you can offer.
-Tim
More information about the SciPy-User
mailing list