commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mark R. Diggory" <mdigg...@latte.harvard.edu>
Subject Re: [math] exceptions or NaN from Univariate
Date Wed, 14 May 2003 14:04:54 GMT


Phil Steitz wrote:
> Mark R. Diggory wrote:
> 
>>
>>
>> Phil Steitz wrote:
>>
>>>
>>> A useful extension to Univariate would be to support a "rolling" 
>>> capability, as follows:
>>>
>>> Add a property called something like "windowSize" and change the 
>>> contract to mean that getMean(), getVariance, etc. always return 
>>> statistics on values {n, n-1, ... n-windowSize+1}.  Have the default 
>>> windowSize "infinity" (i.e., no restriction).  This would be useful 
>>> in applications (e.g simulation monitors) that need to compute 
>>> "rolling averages".
>>>
>>> Obviously, we would want to do this without storing all of the values 
>>> {n, n-1, ... n-windowSize+1}.
>>>
>>> Phil
>>>
>> Is there a strategy to do this without storing all the values of the 
>> current window? if your just storing sum and sumsq, I'm not sure how 
>> you would "back out" of the computation at the end of the window. Of 
>> course, I may be missing something.
>>
> 
> I have not actually implemented this, so of course *I* may be missing 
> something, but is seems to me that you could just hold on to value 
> number n-windowSize+1 and adjust the sums as new values get added. You 
> would also have to hold onto some additional values for min, max to 
> handle the case where the value being "rolled off" is the current min or 
> max.
> 
> Phil
> 

This is where I draw a blank, to hold on to value number n-windowSize+1, 
it would seem you need to retain {n, n-1, ... n-windowSize+1} this is 
because in the next roll {n --> n-1 , n-1 --> n-2, ... n-windowSize  --> 
n-windowsize+1}. this means that an array of values {n to 
n-windowsize+1} would need to be retained so you would be able to do the 
following calculations

sum = sum - values[windowsize];

sumsq = sumsq - Math.pow(values[windowsize], 2);

Then the array would get rolled where

for(int i = windowsize; i > 0 ;i--){
	values[i] = values[i-1]
}

and the new value added to it:

values[0] = n;

sum = sum + values[0];

sumsq = sumsq + Math.pow(values[0], 2);

So, from what I can see, if the window isn't infinite, some storage 
needs to occur. (But again, I could easily be missing something really 
obvious here).

-Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Mime
View raw message