C Gjennomsnittlig
Jeg vet at dette er mulig med boost som per. Men jeg virkelig vil unngå å bruke boost jeg har googled og ikke funnet noen egnede eller lesbare eksempler. Basalt vil jeg spore det bevegelige gjennomsnittet av en pågående strøm av en strøm av flytende punktnumre bruker de nyeste 1000 tallene som en dataprøve. Hva er den enkleste måten å oppnå dette på. Jeg eksperimenterte med å bruke et sirkulært array, eksponentielt glidende gjennomsnitt og et enklere glidende gjennomsnitt og fant ut at resultatene fra den sirkulære gruppen som passer meg, trenger best. asked 12. juni 12 på 4 38. Hvis dine behov er enkle, kan du bare prøve å bruke et eksponentielt bevegelige gjennomsnitt. Du gjør bare en akkumulatorvariabel, og når koden ser på hver prøve, oppdaterer koden akkumulatoren med ny verdi Du velger en konstant alfa som er mellom 0 og 1, og beregner dette. Du trenger bare å finne en verdi av alfa hvor effekten av en gitt prøve bare varer i ca 1000 prøver. Hmm, jeg er ikke sikker på at dette er egnet for deg, nå t hatten jeg har satt den her Problemet er at 1000 er et ganske langt vindu for et eksponentielt glidende gjennomsnitt. Jeg er ikke sikker på at det er en alfa som vil spre gjennomsnittet over de siste 1000 tallene, uten understrøm i flytpunktsberegningen. Men hvis du ønsket et mindre gjennomsnitt, som 30 tall eller så, dette er en veldig enkel og rask måte å gjøre det på. Ansatte Jun 12 12 på 4 44. 1 på ditt innlegg Det eksponentielle glidende gjennomsnittet kan tillate at alfaet er variabelt Så dette tillater det brukes til å beregne tidsbasert gjennomsnitt, f. eks. bytes per sekund Hvis tiden siden den siste akkumulatoroppdateringen er mer enn 1 sekund, lar du alpha være 1 0 Ellers kan du la alfa være usecs siden sist oppdatert 1000000 jxh Jun 12 12 ved 6 21.Basisk vil jeg spore det bevegelige gjennomsnittet av en pågående strøm av en strøm av flytende punktnumre ved å bruke de siste 1000 tallene som en dataprøve. Merk at under oppdateringer summen som elementene som lagt til erstattet, slik at kostbare ON-traverser ikke kan beregnes summen som trengs for th e gjennomsnittlig - på forespørsel. Totalt er det laget en annen parameter fra T for å støtte f. eks. ved å bruke lang lang når det er totalt 1000 lange s, en int for char s eller en dobbel til total float s. Dette er litt feil i at numsamples kunne gå forbi INTMAX - hvis du bryr deg om at du kan bruke en usignert lang lang eller bruke et ekstra bool data medlem til å registrere når beholderen er først fylt mens sykkel numempler rundt arrayet best deretter omdøpt noe uskyldig som pos. answered 12 juni 12 på 5 19.En antar at tomromoperatøren T-prøven faktisk er ugyldig operatør T-prøve, uansett 8. juni kl. 14 på 11 52. oPless ahhh godt oppdaget egentlig, jeg mente det skulle være tomt operatør T-prøve, men selvfølgelig kunne du bruke hvilken som helst notasjon du likte Vil rette, takk Tony D Jun 8 14 på 14 27.Exponential Moving Gjennomsnitt for uregelmessig tidsserie. I tidsserieanalyse er det ofte behov for utjevningsfunksjoner som reagerer raskt på endringer i signalet. I den typiske applikasjonen kan du behandle et inngangssignal i ekte tim e, og vil beregne slike ting som den siste gjennomsnittsverdien, eller få en øyeblikkelig helling for det. Men ekte verdenssignaler er ofte støyende. Noen støyende prøver vil gjøre den nåværende verdien av signalet, eller dets helling varierer mye. Gjennomsnittlig gjennomsnitt . Den enkleste utjevningsfunksjonen er et vindu med glidende gjennomsiktighet. Da prøver kommer inn, tar du gjennomsnittet av de nyeste N-verdiene. Dette vil glatte ut pigger, men introduserer en forsinkelse eller latens. Gjennomsnittet ditt vil alltid bli forsinket med bredden på det bevegelige gjennomsnittet. Eksemplet ovenfor er relativt dyrt å beregne. For hver prøve må du iterere over hele størrelsen på vinduet. Men det er billigere måter å holde summen av alle prøvene i vinduet i en buffer, og juster summen når nye prøver kommer inn. En annen type bevegelige gjennomsnitt er det veide glidende gjennomsnittet som veier for hver posisjon i prøvevinduet Før gjennomsnittet multipliserer hver prøve av vekten av denne vindueposisjonen Teknisk kalles dette en konvolusjon. En t ypical weighting-funksjonen bruker en bellkurve til prøvevinduet Dette gir et signal som er mer innstilt til midten av vinduet, og fortsatt noe tolerant for støyende prøver. I økonomisk analyse bruker du ofte en vektningsfunksjon som verdier nyere prøver mer, for å gi et glidende gjennomsnitt som sporer nyere prøver. Eldre prøver blir gitt gradvis mindre vekt. Dette reduserer noe av latensens virkninger, samtidig som det gir en rimelig god utjevning. Med et veid gjennomsnitt må du alltid iterere over hele vinduets størrelse for hver prøve med mindre Du kan begrense tillatt vekt til bestemte funksjoner. Eksponentiell Moving Average. En annen type gjennomsnitt er eksponentielt glidende gjennomsnitt eller EMA. Dette brukes ofte der latens er kritisk, for eksempel i sanntid finansiell analyse. I dette gjennomsnittet reduserer vektene eksponentielt Hver prøve er verdsatt noe prosent mindre enn neste, nyeste prøve. Med denne begrensningen kan du beregne movin g gjennomsnitt veldig effektivt. Hvor alfa er en konstant som beskriver hvordan vindusvektene reduseres over tid For eksempel hvis hver prøve skulle vektes til 80 av verdien av den forrige prøven, ville du sette alfa 0 2 Den mindre alfa blir lengre Ditt glidende gjennomsnitt er f. eks. det blir jevnere, men mindre reaktivt på nye prøver. Vektene for en EMA med alfa 0 20. Som du kan se, må du bare for hver ny prøve gjennomsnittlig den med verdien av forrige gjennomsnitt. Så beregning er veldig veldig fort. I teorien bidrar alle tidligere prøver til nåværende gjennomsnitt, men deres bidrag blir eksponentielt mindre over tid. Dette er en veldig kraftig teknikk, og sannsynligvis det beste hvis du vil få et glidende gjennomsnitt som reagerer raskt på nye prøver , har gode utjevningsegenskaper og er rask til å beregne. Koden er trivial. EMA for uregelmessig tidsserie. Standard EMA er bra når signalet samples med jevne mellomrom, men hva om dine prøver kommer til uregelmessig intervaller. Imagine et kontinuerlig signal som samples med uregelmessige intervaller Dette er den vanlige situasjonen i økonomisk analyse I teorien er det en kontinuerlig funksjon for verdien av et finansielt instrument, men du kan bare prøve dette signalet når noen faktisk utfører en handel. Så din Datastrømmen består av en verdi, pluss tidspunktet hvor den ble observert. En måte å håndtere dette på er å konvertere det uregelmessige signalet til et vanlig signal ved å interpolere mellom observasjoner og resampling. Men dette mister data, og det gjeninnføres latency. It er mulig å beregne en EMA for en uregelmessig tidsserie directly. In denne funksjonen, passerer du i den nåværende prøven fra signalet ditt, og den forrige prøven, og hvor lang tid som er gått mellom de to, og den forrige verdien returnerte av denne funksjonen. Så hvor bra fungerer dette For å demonstrere at jeg har generert en sinusbølge, så prøvd det med uregelmessige intervaller, og introdusert omtrent 20 støy Det er signalet vil variere tilfeldig - 20 fra det opprinnelige sanne sinus-signal. Hvordan bra det uregelmessige eksponentielle glidende gjennomsnittet gjenopprette signalet. Den røde linjen er den originale sinusbølge samplet med uregelmessige intervaller Den blå linjen er signalet med støyen tilført Den blå linjen er det eneste signalet EMA ser Den grønne linjen er den glatte EMA Du kan se det gjenoppretter signalet ganske bra Litt wobbly, men hva kan du forvente fra et slikt støyende kilde signal. Det blir skiftet rundt 15 til høyre, fordi EMA innfører noe latens The jevnere du vil ha det, jo mer latens vil du se. Men fra dette kan du for eksempel beregne en øyeblikkelig helling for et støyende uregelmessig signal. Hva kan du gjøre med det Hmm. Jeg prøver å beregne det bevegelige gjennomsnittet av et signal. Signalverdi en dobbel er oppdatert i tilfeldige tider Jeg ser etter en effektiv måte å beregne det er tidsvektet gjennomsnitt over et tidsvindu, i sanntid kan jeg gjøre det selv, men det er mer utfordrende enn jeg trodde. De fleste ressursene jeg ve fo og over internett beregner det bevegelige gjennomsnittet av periodisk signal, men mine oppdateringer tilfeldigvis. Det er noen som vet gode ressurser for det. Tricket er følgende Du får oppdateringer i tilfeldige tider via ugyldig oppdatering int tid, flyteverdi. Men du trenger også for å spore når en oppdatering faller utenfor tidsvinduet, slik at du stiller en alarm som kalles på tidspunktet N som fjerner den forrige oppdateringen, fra å bli vurdert igjen i beregningen. Hvis dette skjer i sanntid, kan du be om at operativsystemet skal ringe til en metode for å slippe avbruddstiden i tid. Hvis dette er en simulering, kan du ikke få hjelp fra operativsystemet, og du må gjøre det manuelt. I en simulering vil du ringe metoder med tiden som følger med et argument som ikke korrelerer med sanntid Det er imidlertid en rimelig antagelse at samtalene er garantert å være slik at tidsargumentene øker. I dette tilfellet må du opprettholde en sortert liste over alarmtid v alger, og for hver oppdatering og lese samtale, kontroller du om tidsargumentet er større enn hodet til alarmlisten. Mens det er større, faller den alarmrelaterte behandlingen av den eldste oppdateringen, fjerner hodet og kontrollerer igjen til alle alarmer tidligere til den oppgitte tiden behandles. Gjør så oppdateringen. Jeg har så langt antatt at det er åpenbart hva du ville gjøre for den faktiske beregningen, men jeg vil utarbeide bare dersom jeg antar at du har en metode flyt, les intid tid du bruker til å les verdiene Målet er å gjøre denne anrop så effektiv som mulig, slik at du ikke beregner det bevegelige gjennomsnittet hver gang lesemetoden heter. I stedet forkaster du verdien som for den siste oppdateringen eller den siste alarmen, og justerer denne verdien med en par flytende punkt operasjoner for å regne for tidens gang siden den siste oppdateringen, dvs. et konstant antall operasjoner, bortsett fra kanskje å behandle en liste over stablet alarm. Helt klart er dette klart - dette burde være en ganske enkel algoritme og ganske effektiv. Ytterligere optimalisering er et av de gjenværende problemene hvis et stort antall oppdateringer skjer i tidsvinduet, så det er lang tid som det ikke finnes leser eller oppdateringer, og deretter kommer en lesing eller oppdatering i dette tilfellet. over algoritmen vil være ineffektiv i trinnvis oppdatering av verdien for hver av oppdateringene som faller av Dette er ikke nødvendig fordi vi bare bryr oss om den siste oppdateringen utover tidsvinduet, så hvis det er en måte å effektivt slippe av alle eldre oppdateringer, er det ville hjelpe. For å gjøre dette kan vi endre algoritmen for å gjøre et binært søk på oppdateringer for å finne den nyeste oppdateringen før tidsvinduet. Hvis det er relativt få oppdateringer som må slettes, kan man trinnvis oppdatere verdien for hver falt oppdatering Men hvis det er mange oppdateringer som må slettes, kan man rekomputere verdien fra grunnen etter å ha slått av de gamle oppdateringene. Vedlegg om inkrementell beregning Jeg bør avklare hva jeg mener med økning mental beregning ovenfor i setningen justere denne verdien ved hjelp av et par flytende punkt operasjoner for å regne for tidsovergangen siden den siste oppdateringen. Initial ikke-inkrementell beregning. Det er iterere over relevante oppdateringer i rekkefølge av økende time. movingaverage sum siste oppdaterte ganger i oppdatering av vinduet lengde. Nå Hvis akkurat en oppdatering faller av vinduet, men ingen nye oppdateringer kommer, juster summen som. Legg merke til at det er forhåndsoppdatert som har sin tidsstempel endret til begynnelsen av det siste vinduet begynnelsen. Og hvis akkurat en oppdatering kommer inn i vinduet, men ingen nye oppdateringer faller av, juster summen som. Som det skal være klart, er dette en grov skisse, men forhåpentligvis viser det hvordan du kan opprettholde gjennomsnittet slik at det er O 1 operasjoner per oppdatering på amortisert basis. Men vær oppmerksom på ytterligere optimalisering i forrige avsnitt. Legg også merke til stabilitetsproblemer referert til i et eldre svar, noe som betyr at flytpunktsfeil kan akkumulere over et stort antall inkrementelle operasjoner slik at det er en avvik fra resultatet av den fullstendige beregningen som er vesentlig for applikasjonen. Hvis en tilnærming er OK, og det er en minimal tid mellom prøver, kan du prøve superprøving. Har en matrise som representerer jevnt fordelte tidsintervaller som er kortere enn minimumet, og i hver tidsperiode lagrer du den siste prøven som ble mottatt. Jo kortere intervallet, jo nærmere gjennomsnittet vil være den sanne verdien e Perioden skal ikke være større enn halvparten av minimumet eller det er en sjanse til å mangle en prøve. ansvaret 15. desember kl. 18 12. Takk for svaret En forbedring som ville være nødvendig for å faktisk cache verdien av det totale gjennomsnittet slik at Vi kan ikke løse hele tiden. Det kan også være et mindre punkt, men det ville ikke være mer effektivt å bruke en dekk eller en liste for å lagre verdien, siden vi antar at oppdateringen kommer i riktig rekkefølge. Innsetting ville være raskere enn i kartet Arthur Des 16 11 på 8 55.Ja, du kan cache verdien av summen Trekke verdiene av prøvene du sletter, legg til verdiene av prøvene du legger inn. Også, ja, et deque par Eksempel, Dato kan være mer effektivt Jeg valgte kartet for lesbarhet og det enkle å påkalle kartet overgående. Som alltid, skriv riktig kode først, og profil og måle trinnvise endringer. Rob Dec 16 11 på 15 00. Merknad er dette ikke veien å nærme seg. for referanse om hva som er galt med denne tilnærmingen Sjekk kommentarene. OPP DATED - basert på Oli s kommentar ikke sikker på ustabiliteten han snakker om though. Use et sortert kart over ankomsttider mot verdier. Ved ankomst av en verdi legg til ankomsttid til det sorterte kartet sammen med det s verdi og oppdatere flyttingen average. warning dette er pseudo-kode. Det er ikke fullt fleshed ut, men du får ideen. Ting å notere Som jeg sa ovenfor er pseudokoden Du må velge et passende kart Ikke ta parene som du gjennomfører som du vil ugyldiggjøre iteratoren og må starte igjen Se Oli s kommentar nedenfor also. answered Dec 15 11 på 12 22. Dette virker ikke, det tar ikke hensyn til hvilken andel av vinduslengden hver verdi eksisterer. Også denne tilnærmingen av å legge til og deretter subtrahere er bare stabil for heltalltyper, ikke flyter Oliver Charlesworth 15. desember kl. 12 på 12. 29. OliCharlesworth - beklager jeg savnet noen viktige punkter i beskrivelsen dobbelt og tidsvektet Jeg vil oppdatere Takk Dennis 15. desember kl 12.Tidvekten er dere et annet problem Men det er ikke det jeg snakker om, jeg refererte til det faktum at når en ny verdi først kommer inn i tidsvinduet, er bidraget til gjennomsnittsverdien minimal. Dens bidrag fortsetter å øke til en ny verdi går inn i Oliver Charlesworth 15. desember 11 ved 12 35.
Comments
Post a Comment