Aș dori să contribui la acest thread un algoritm pe care l-am dezvoltat :
Se bazează pe principiul dispersie : dacă o nouă datapoint este un număr x dat de standard abaterile de la unele medii în mișcare, semnalele de algoritm (numite și scor z ). Algoritmul este foarte robust deoarece construiește o medie și o deviație separate , astfel încât semnalele să nu corupe pragul. Semnalele viitoare sunt, prin urmare, identificate cu aproximativ aceeași precizie, indiferent de cantitatea de semnale anterioare. Algoritmul are 3 intrări: lag = decalajul ferestrei în mișcare
, threshold = scorul z la care semnalele algoritmului
și influențează = 0 și 1) de semnale noi privind deviația medie și standard
. De exemplu, un lag
din 5 va utiliza ultimele 5 observații pentru a netezi datele. Un prag
de 3,5 va semnala dacă o datapoint este de 3,5 abateri standard față de media în mișcare. Și un influence
de 0.5 dă semnale jumătate influenței pe care o au datele de date normale. De asemenea, un influence
de 0 ignoră semnalele complet pentru recalcularea noului prag: o influență de 0 este, prin urmare, cea mai robustă opțiune.
Funcționează după cum urmează:
pseudocod
# Let y be a vector of timeseries data of at least length lag+2
# Let mean() be a function that calculates the mean
# Let std() be a function that calculates the standard deviaton
# Let absolute() be the absolute value function
# Settings (the ones below are examples: choose what is best for your data)
set lag to 5; # lag 5 for the smoothing functions
set threshold to 3.5; # 3.5 standard deviations for signal
set influence to 0.5; # between 0 and 1, where 1 is normal influence, 0.5 is half
# Initialise variables
set signals to vector 0,...,0 of length of y; # Initialise signal results
set filteredY to y(1,...,lag) # Initialise filtered series
set avgFilter to null; # Initialise average filter
set stdFilter to null; # Initialise std. filter
set avgFilter(lag) to mean(y(1,...,lag)); # Initialise first value
set stdFilter(lag) to std(y(1,...,lag)); # Initialise first value
for i=lag+1,...,t do
if absolute(y(i) - avgFilter(i-1)) > threshold*stdFilter(i-1) then
if y(i) > avgFilter(i-1)
set signals(i) to +1; # Positive signal
else
set signals(i) to -1; # Negative signal
end
# Adjust the filters
set filteredY(i) to influence*y(i) + (1-influence)*filteredY(i-1);
set avgFilter(i) to mean(filteredY(i-lag,i),lag);
set stdFilter(i) to std(filteredY(i-lag,i),lag);
else
set signals(i) to 0; # No signal
# Adjust the filters
set filteredY(i) to y(i);
set avgFilter(i) to mean(filteredY(i-lag,i),lag);
set stdFilter(i) to std(filteredY(i-lag,i),lag);
end
end
Demo