You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							73 lines
						
					
					
						
							1.8 KiB
						
					
					
				
			
		
		
	
	
							73 lines
						
					
					
						
							1.8 KiB
						
					
					
				| import numpy as np
 | |
| 
 | |
| class RunningStat():
 | |
|   # tracks realtime mean and standard deviation without storing any data
 | |
|   def __init__(self, priors=None, max_trackable=-1):
 | |
|     self.max_trackable = max_trackable
 | |
|     if priors is not None:
 | |
|       # initialize from history
 | |
|       self.M = priors[0]
 | |
|       self.S = priors[1]
 | |
|       self.n = priors[2]
 | |
|       self.M_last = self.M
 | |
|       self.S_last = self.S
 | |
| 
 | |
|     else:
 | |
|       self.reset()
 | |
| 
 | |
|   def reset(self):
 | |
|     self.M = 0.
 | |
|     self.S = 0.
 | |
|     self.M_last = 0.
 | |
|     self.S_last = 0.
 | |
|     self.n = 0
 | |
| 
 | |
|   def push_data(self, new_data):
 | |
|     # short term memory hack
 | |
|     if self.max_trackable < 0 or self.n < self.max_trackable:
 | |
|       self.n += 1
 | |
|     if self.n == 0:
 | |
|       self.M_last = new_data
 | |
|       self.M = self.M_last
 | |
|       self.S_last = 0.
 | |
|     else:
 | |
|       self.M = self.M_last + (new_data - self.M_last) / self.n
 | |
|       self.S = self.S_last + (new_data - self.M_last) * (new_data - self.M)
 | |
|       self.M_last = self.M
 | |
|       self.S_last = self.S
 | |
| 
 | |
|   def mean(self):
 | |
|     return self.M
 | |
| 
 | |
|   def variance(self):
 | |
|     if self.n >= 2:
 | |
|       return self.S / (self.n - 1.)
 | |
|     else:
 | |
|       return 0
 | |
| 
 | |
|   def std(self):
 | |
|     return np.sqrt(self.variance())
 | |
| 
 | |
|   def params_to_save(self):
 | |
|     return [self.M, self.S, self.n]
 | |
| 
 | |
| class RunningStatFilter():
 | |
|   def __init__(self, raw_priors=None, filtered_priors=None, max_trackable=-1):
 | |
|     self.raw_stat = RunningStat(raw_priors, -1)
 | |
|     self.filtered_stat = RunningStat(filtered_priors, max_trackable)
 | |
| 
 | |
|   def reset(self):
 | |
|     self.raw_stat.reset()
 | |
|     self.filtered_stat.reset()
 | |
| 
 | |
|   def push_and_update(self, new_data):
 | |
|     _std_last = self.raw_stat.std()
 | |
|     self.raw_stat.push_data(new_data)
 | |
|     _delta_std = self.raw_stat.std() - _std_last
 | |
|     if _delta_std <= 0:
 | |
|       self.filtered_stat.push_data(new_data)
 | |
|     else:
 | |
|       pass
 | |
|       # self.filtered_stat.push_data(self.filtered_stat.mean())
 | |
| 
 | |
| # class SequentialBayesian():
 | |
| 
 |