Jag vet att detta kan uppnås med boost som per. Men jag vill verkligen undvika att använda boost jag har googled och inte hittat några lämpliga eller läsbara exempel. I grund och botten vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punktnummer Använder de senaste 1000 siffrorna som ett dataprov. Vilket är det enklaste sättet att uppnå detta. Jag experimenterade med att använda ett cirkulärt array, exponentiellt glidande medelvärde och ett enklare glidande medelvärde och fann att resultaten från den cirkulära gruppen passade mina behov bäst. asked jun 12 12 på 4 38. Om dina behov är enkla kan du bara försöka använda ett exponentiellt rörligt medelvärde. Du gör bara en ackumulatorvariabel, och när din kod tittar på varje prov uppdaterar koden ackumulatorn med nytt värde Du väljer en konstant alfa som är mellan 0 och 1 och beräknar detta. Du behöver bara hitta ett värde av alfa där effekten av ett visst prov endast varar för cirka 1000 prov. Hmm, jag är inte säker på att det här är Lämplig för dig, nu t Hat jag har lagt den här Problemet är att 1000 är ett ganska långt fönster för ett exponentiellt rörligt medelvärde. Jag är inte säker på att det finns en alfa som skulle sprida genomsnittet över de senaste 1000 talen utan underflöde i flytpunktsberäkningen. Men om du ville ha ett mindre medelvärde, som 30 nummer eller så, det här är ett mycket enkelt och snabbt sätt att göra det. svarade den 12 juni 12 på 4 44. 1 på ditt inlägg Det exponentiella glidande medlet kan låta alfabetet vara variabelt Så det tillåter det Används för att beräkna tidsbasen medelvärden, t. ex. bytes per sekund Om tiden sedan den senaste ackumulatoruppdateringen är mer än 1 sekund, låter du alpha vara 1 0 Annars kan du låta alfa vara usecs sedan senaste uppdateringen 1000000 jxh jun 12 12 vid 6 21.Basiskt vill jag spåra det rörliga genomsnittet av en pågående ström av en ström med flytande punktnummer med de senaste 1000 siffrorna som ett dataprov. Notera att nedanstående uppdaterar summan som element som tillsatt ersatt, så att kostsamma ON-traverser beräknas Summan - behövs för th E genomsnitt - på begäran. Total görs en annan parameter från T för att stödja t ex med lång längd när det är 1000 lång s, en int för char s eller en dubbel till total float s. Detta är lite bristfälligt i att nummemplar kunde Gå förbi INTMAX - om du bryr dig att du kan använda en unsigned long long eller använda en extra bool data medlem att spela in när behållaren fylls första gången cykel nummor runt arrayen bäst sedan bytt namn något harmlöst som pos. answered 12 juni 12 på 5 19.an antar att tomrumsoperatör T-provet är faktiskt tomt operatör T-prov oPlats 8 juni 14 på 11 52. oPless ahhh väl spotted egentligen menade jag att det skulle vara tomt operatör T-prov men självklart kan du använda vilken anteckning du helst vill fixa, tack Tony D Jun 8 14 på 14 27.Exponentiala rörliga medelvärden för oregelbunden tidsserie. I tidsserieanalysen är det ofta ett behov av utjämningsfunktioner som reagerar snabbt på förändringar i signalen. I den typiska applikationen kan du bearbeta en insignal I realtid E och vill beräkna sådana saker som det senaste genomsnittliga värdet eller få en momentan lutning för det Men reala världssignaler är ofta bullriga Några bullriga prover gör det nuvarande värdet av signalen eller dess lutning varierar mycket. . Den enklaste utjämningsfunktionen är ett glidande glidande medelvärde. Eftersom proverna kommer in tar du i genomsnitt de senaste N-värdena. Detta släpper ut spikar, men introducerar en fördröjning eller latens. Medelvärdet kommer alltid att fördröjas med bredden på ditt glidande medelvärde. Exemplet ovan är relativt dyrt att beräkna För varje prov måste du iterera över hela storleken på fönstret Men det finns billigare sätt att hålla summan av alla prover i fönstret i en buffert och justera summan när nya prover kommer in. An annan typ av rörligt medelvärde är det viktade glidande medlet som vikter för varje position i provfönstret Innan medelvärdet multiplicerar du varje prov med vikten av den här fönsterpositionen. Tekniskt kallas detta en konvolvering. En t ypical weighting-funktionen tillämpar en klockkurva i provfönstret Detta ger en signal som är mer avstämd till mitten av fönstret och fortfarande något tolerant för bullriga prover I finansiell analys använder du ofta en viktningsfunktion som värderar de senaste proverna mer för att ge Ett glidande medel som spårar närmare de senaste proverna. Äldre prover ges gradvis mindre vikt. Detta mildrar något av latensens effekter, samtidigt som det ger en relativt bra utjämning. Med ett vägt genomsnitt måste du alltid iterera över hela fönsterstorleken för varje prov såvida inte Du kan begränsa tillåtna vägar till vissa funktioner. Exponentiell rörlig genomsnittsvärde. En annan typ av medelvärde är exponentiell glidande medelvärde, eller EMA. Detta används ofta där latens är kritisk, till exempel i realtidsfinansiell analys. I detta genomsnitt minskar vikterna exponentiellt Varje prov värderas några procent mindre än nästa senaste prov Med denna begränsning kan du beräkna movin G genomsnittligt mycket effektivt. Där är alfa en konstant som beskriver hur fönsterviktarna minskar med tiden. Exempelvis om varje prov skulle vägas till 80 av värdet av föregående prov, skulle du ställa alfa 0 2 Den mindre alfabet blir längre Ditt glidande medelvärde är t ex det blir mjukare, men mindre reaktivt på nya prov. Vikten för en EMA med alfa 0 20. Som du kan se, behöver du bara för varje nytt prov det med det föregående genomsnittets värde Så beräkning Är väldigt mycket snabbt. I teorin bidrar alla tidigare prover till det nuvarande genomsnittet, men deras bidrag blir exponentiellt mindre över tiden. Det här är en mycket kraftfull teknik, och förmodligen det bästa om du vill få ett glidande medelvärde som snabbt svarar på nya prov , Har goda utjämningsegenskaper och är snabb att beräkna. Koden är trivial. EMA för oregelbunden tidsserie. Standarden EMA är bra när signalen samplas med regelbundna tidsintervaller Men vad händer om dina prover kommer på oregelbundna intervaller. Imagine en kontinuerlig signal som samplas med oregelbundna intervaller Detta är den vanliga situationen i finansiell analys I teorin finns det en kontinuerlig funktion för värdet av något finansiellt instrument, men du kan bara prova den här signalen när någon faktiskt driver en handel så din Dataströmmen består av ett värde plus tiden då den observerades. Ett sätt att hantera detta är att omvandla den oregelbundna signalen till en vanlig signal, genom att interpolera mellan observationer och resampling. Men detta förlorar data och det introduceras igen latens. Det är möjligt att beräkna en EMA för en oregelbunden tidsserie direkt. I denna funktion passerar du i det aktuella provet från din signal och det föregående provet och hur mycket tid som har gått mellan de två och föregående värde återvände av denna funktion. Så hur bra fungerar det för att demonstrera att jag har genererat en sinusvåg, samplad den då med oregelbundna intervaller och introducerat omkring 20 ljud Det är signalen varierar slumpmässigt - 20 från den ursprungliga sanna sinus-signalen. Hur bra återställer det oregelbundna exponentiella glidande medlet. Den röda linjen är den ursprungliga sinusvågen samplad med oregelbundna intervaller Den blå linjen är signalen med ljudet tillagt Den blå linjen är den enda signalen EMA Ser Den gröna linjen är den släta EMA Du kan se det återställer signalen ganska bra Lite wobbly, men vad kan du förvänta dig från en sådan bullrig källsignal. Den flyttas ungefär 15 till höger, eftersom EMA introducerar viss latens Ju mjukare du vill ha det, desto mer latens kommer du att se Men du kan till exempel beräkna en momentan lutning för en bullrig oregelbunden signal. Vad kan du göra med det Hmm. Jag försöker beräkna det rörliga genomsnittet av en signal. Signalvärdet En dubbel uppdateras i slumpmässiga tider Jag letar efter ett effektivt sätt att beräkna det s tidsvägd medelvärde över ett tidsfönster, i realtid skulle jag kunna göra det själv, men det är mer utmanande än jag trodde. De flesta resurserna jag Ve fo Und över internet beräknar man glidande medelvärde av periodisk signal, men mina uppdateringar slumpmässigt. Det vet någon bra resurser för det. Tricket är följande Du får uppdateringar i slumpmässiga tider via tomt uppdatering int tid, float värde Men du behöver också För att även spåra när en uppdatering faller utanför tidsfönstret, så du ställer in ett larm som kallas vid tidpunkt N som tar bort den tidigare uppdateringen från att någonsin ses över i beräkningen. Om det händer i realtid kan du begära operativsystemet att Ring ett samtal till en metod omöjlig för att lösa upp tiden. Om det här är en simulering kan du inte få hjälp från operativsystemet och du behöver göra det manuellt. I en simulering skulle du ringa metoder med tiden som levereras som ett argument som inte korrelerar med realtid Men ett rimligt antagande är att samtalen garanteras vara sådan att tidsargumenten ökar. I det här fallet behöver du behålla en sorterad lista över larmtid v Alues och för varje uppdatering och läsavrop kontrollerar du om tidsargumentet är större än huvudet på larmlistan Medan det är större ökar larmrelaterad bearbetning den äldsta uppdateringen, tar bort huvudet och kontrollerar igen tills alla larm tidigare Till den angivna tiden bearbetas Gör sedan uppdateringen call. I har hittills antagit att det är uppenbart vad du skulle göra för den faktiska beräkningen, men jag kommer att utarbeta bara om jag antar att du har en metod float läs int tid som du använder för att Läs värdena Målet är att göra det här samtalet så effektivt som möjligt Så du beräknar inte det glidande genomsnittet varje gång läsmetoden heter. I stället precomputerar du värdet som den senaste uppdateringen eller det senaste larmet och tweakar det här värdet av en Några flytande punktoperationer för att beräkna tidens gång sedan den senaste uppdateringen, dvs ett konstant antal operationer förutom att kanske bearbeta en lista med uppstapade alarm. Helt klart är detta klart - det här borde vara en ganska enkel algoritm och ganska effektiv. Ytterligare optimering Ett av de återstående problemen är om ett stort antal uppdateringar händer i tidsfönstret, då finns det en lång tid som det varken läser eller uppdateringar, och sedan kommer en läsning eller uppdatering att komma fram. I det här fallet ovan algoritmen kommer att vara ineffektiv för att gradvis uppdatera värdet för varje uppdatering som faller av Detta är inte nödvändigt eftersom vi bara bryr oss om den senaste uppdateringen bortom tidsfönstret, så om det finns ett sätt att effektivt släppa bort alla äldre uppdateringar, skulle hjälpa. För att göra det kan vi modifiera algoritmen för att göra en binär sökning av uppdateringar för att hitta den senaste uppdateringen före tidsfönstret Om det finns relativt få uppdateringar som behöver släppas kan man stegvis uppdatera värdet för varje dropp uppdatering Men om det finns många uppdateringar som behöver släppas kan man ompröva värdet från grunden efter att ha släppt bort de gamla uppdateringarna. Bilaga om inkrementell beräkning Jag borde klargöra vad jag menar med öka Mental beräkning ovan i meningen tweak detta värde med ett par flytande punkter operationer för att beräkna tidens gång sedan den senaste uppdateringen Initial icke-inkrementell beräkning. Det deterera över relevanta uppdateringar i syfte att öka tiden. movingaverage summa uppdaterad timesincelastupdate windowlength. Now Om exakt en uppdatering faller utanför fönstret men inga nya uppdateringar ankommer, justera summan som. notera att det är priorupdate som har sin tidstämpel modifierad till början av det sista fönstret och om en exakt uppdatering kommer in i fönstret men inga nya uppdateringar faller av, justera summan as. As det ska vara uppenbart är det här en grov skiss men förhoppningsvis visar det hur du kan upprätthålla medelvärdet så att det är O 1-operationer per uppdatering på avskrivningsbasis. Notera ytterligare optimering i föregående stycke. Observera även stabilitetsproblem som hänvisas till i ett äldre svar, vilket innebär att flytpunktsfel kan ackumuleras över ett stort antal inkrementella operationer så att det finns en avvikelse från resultatet av den fullständiga beräkningen som är signifikant för applikationen. Om en approximation är OK och det är en minimal tid mellan proverna, kan du prova supersampling. Har en matris som representerar jämnt fördelade tidsintervall som Är kortare än minimumet och vid varje tidsperiod lagrar det senaste provet som erhölls. Ju kortare intervallet desto närmre genomsnittet kommer att vara den verkliga värdet E Perioden ska inte vara större än hälften av miniminivån eller det finns en chans att sakna ett prov. ansvarat dec 15 11 på 18 12. Tack för svaret En förbättring som skulle behövas för att faktiskt cache värdet av det totala genomsnittet så Vi går inte hela tiden Det kan också vara en liten punkt, men det skulle inte vara mer effektivt att använda en deque eller en lista för att lagra värdet, eftersom vi antar att uppdateringen kommer i rätt ordning. Infoga skulle vara snabbare än i kartan Arthur Dec 16 11 på 8 55.Ja, du kan cache värdet av summen. Drakta värdena för de prov du raderar, lägg till värdena på de prover du lägger in. Dessutom, ja ett parpar Prov, datumet kan vara effektivare jag valde kartan för läsbarhet och det enkla att påkalla kartan övre delen Som alltid skriver du rätt kod först, sedan profilera och mäta stegvisa förändringar Rob Dec 16 11 på 15 00. Notera Tydligen är det här inte sättet att närma sig detta Lämna den här för referens om vad som är fel med detta tillvägagångssätt Kontrollera kommentarerna. UP DATED - baserat på Oli s kommentar inte säker på instabiliteten som han pratar om though. Use en sorterad karta över ankomsttider mot värden. När du anländer till ett värde lägg till ankomsttiden till den sorterade kartan tillsammans med det s värde och uppdatera rörelsen Average. warning det här är pseudokod. Det är inte helt fleshed ut men du får tanken. Att notera Som jag sa ovanstående är pseudokod Du måste välja en lämplig karta Don t ta bort paren som du iterate genom som du kommer att ogiltiggöra iteratorn och måste startas igen Se Oli s kommentar nedan also. answered Dec 15 11 på 12 22.This worksn t fungerar det tar inte hänsyn till vilken andel av fönstrets längd varje värde finns för. Denna metod Av att lägga till och sedan subtrahera är bara stabil för heltalstyper, inte flyter Oliver Charlesworth dec 15 11 på 12 29. OliCharlesworth - ledsen jag missade några viktiga punkter i beskrivningen dubbel och tidsvägd kommer jag att uppdatera Tack Dennis Dec 15 11 på 12 33 . Tidsvägningen är ye Ett annat problem Men det är inte vad jag pratar om. Jag hänvisade till det faktum att när ett nytt värde först når tidsfönstret är dess bidrag till genomsnittet minimalt. Bidraget fortsätter att öka tills ett nytt värde går in i Oliver Charlesworth 15 dec 11 vid 12 35.
No comments:
Post a Comment