Monday, 16 October 2017

Flytte Gjennomsnittet Effektiv Implementering


Jeg har i hovedsak en rekke verdier som dette. Ovenstående matrise er oversimplified, jeg samler 1 verdi per millisekund i min ekte kode og jeg må behandle utdataene på en algoritme jeg skrev for å finne nærmeste topp før et tidspunkt logikken feiler fordi i mitt eksempel ovenfor er 0 36 den virkelige toppen, men min algoritme vil se bakover og se det siste tallet 0 25 som toppen, da det er en reduksjon til 0 24 før det. Målet er å ta disse verdiene og bruk en algoritme til dem som vil glatte dem ut litt, slik at jeg har mer lineære verdier, det vil si at resultatene mine skal være svingete, ikke ekgedy. Jeg har blitt fortalt å bruke et eksponentielt glidende gjennomsnittsfilter til mine verdier. Hvordan kan jeg gjør dette Det er veldig vanskelig for meg å lese matematiske ligninger. Jeg behandler mye bedre med kode. Hvordan behandler jeg verdier i mitt array, og bruker en eksponentiell glidende gjennomsnittlig beregning for å utjevne dem ut. Skrevet 8. februar 12 kl 20 27. For å beregne et eksponentielt glidende gjennomsnitt må du holde noen tilstand rundt og du trenger en innstillingsparameter Dette krever en liten klasse forutsatt at du bruker Java 5 eller nyere. Installer med nedbrytingsparameteren du vil ha, må innstille skal være mellom 0 og 1 og bruk deretter gjennomsnittlig for å filtrere. Når du leser en side på noen matematiske gjentagelse, alt du virkelig trenger å vite når du setter det i kode er at matematikere liker å skrive indekser i arrays og sekvenser med abonnementer. De har også noen andre notasjoner, men det hjelper ikke. EMA er ganske enkelt som du bare trenger å huske en gammel verdi ingen kompliserte statlige arrays required. answered 8 februar 12 på 20 42. TKKocheran Ganske mye Er det ikke bra når ting kan være enkelt Hvis du starter med en ny sekvens, får du en ny bruker. Legg merke til at de første begrepene i gjennomsnittlig sekvens vil hoppe rundt litt på grunn av grenseeffekter, men du får de med andre bevegelige gjennomsnitt også. En god fordel er imidlertid at du kan pakke den bevegelige gjennomsnittlige logikken inn i gjennombrukeren og eksperimentere uten å forstyrre t han hviler på programmet for mye Donal Fellows 9 februar 12 på 0 06. Jeg har det vanskelig å forstå dine spørsmål, men jeg vil prøve å svare uansett.1 Hvis algoritmen din fant 0 25 i stedet for 0 36, så er det feil Det er feil fordi det forutsetter en monotonisk økning eller reduksjon som alltid går opp eller alltid går ned, med mindre du gjennomsnittlig ALLE dine data, dine datapunkter --- som du presenterer dem --- er ikke-lineære Hvis du virkelig vil finne maksimum verdi mellom to poeng i tid, så skjær din rekkefølge fra tmin til tmax og finn maksimum for det subarray.2 Nå er begrepet bevegelige gjennomsnitt veldig enkle å forestille at jeg har følgende liste 1 4, 1 5, 1 4, 1 5, 1 5 Jeg kan glatte det ut ved å ta gjennomsnittet av to tall 1 45, 1 45, 1 45, 1 5 Legg merke til at det første tallet er gjennomsnittet av 1 5 og 1 4 sekund og første nummer den andre nye listen er gjennomsnittet av 1 4 og 1 5 tredje og andre gamle liste den tredje nye listen gjennomsnittet 1 5 og 1 4 fjerde og tredje, og så videre kunne jeg har gjort det perioden tre eller fire, eller n Legg merke til hvordan dataene er mye jevnere En god måte å se glidende gjennomsnitt på jobben, er å gå til Google Finance, velg et lager, prøv Tesla Motors ganske flyktige TSLA og klikk på technicals nederst på diagrammet Velg Moving Average med en gitt periode, og eksponentiell glidende gjennomsnitt for å sammenligne forskjellene deres. Eksponentielt glidende gjennomsnitt er bare en annen utbygging av dette, men veier de eldre dataene mindre enn de nye dataene, dette er en måte å forvirre utjevningen mot baksiden Vennligst les Wikipedia-oppføringen. Så dette er mer en kommentar enn et svar, men den lille kommentarboksen var bare for liten Lykke til. Hvis du har problemer med matematikken, kan du gå med et enkelt glidende gjennomsnitt i stedet for eksponentiell. Så utdataene du får vil være de siste x-vilkårene delt med x Ikke-testet pseudokode. Merk at du må håndtere start - og sluttdelene av dataene, siden du tydeligvis ikke kan t gjennomsnitts de siste 5 vilkårene når du er på ditt andre datapunkt. , den re er mer effektive måter å beregne denne glidende gjennomsnittlige summen - eldste nyeste, men dette er å få konseptet om hva som skjer overfor. Ansatt 8. februar kl. 20 41. En enkel, flytende gjennomsnittsimplementering i Java. Ved flere anledninger har jeg ønsket å beregne enkle beregninger i mine Java-programmer, for eksempel antall treff i timen eller feil i løpet av en tidsperiode. Mens beregning enkle beregninger ikke er veldig vanskelig, er det bare ekstra arbeid, og jeg vil helst bruke den tiden på problemdomenet Jeg var overrasket over å ikke finne noen allment aksepterte løsninger for beregninger i Java. Jeg fant Metrics, men det virket litt for komplisert og ikke godt dokumentert. Alt jeg virkelig ønsket, var å beregne et glidende gjennomsnitt. Jeg tenkte på problemet litt mer og bestemte meg det er ikke et vanskelig problem Her er min løsning. Dette virker ved å opprette en rekke vindu oppdateringsfrekvensstørrelse, og en tråd angir tellingen til neste indeks i arrayet på oppdateringsfrekvensen. Tellingen for intervallet er bare array i-array i 1, som er den siste tellingen minus den eldste tellingen. For et 10-minutters intervall er den eldste tellingen jeg 1 akkurat 10 minutter gammel. For å legge til et bevegelige gjennomsnitt for vår kode først trenger vi en teller, ved hjelp av AtomicLong. Denne telleren skal økes basert på hendelsene du er interessert i databehandling, for eksempel POST-forespørsler om en REST-tjeneste. Vi må sørge for implementeringen med tilgang til disken og som oppnås gjennom GetCount-grensesnittet. Her vil jeg skape en bevegelse gjennomsnitt med et 5 minutters vindu som oppdateres hvert sekund. Og for å få det nåværende gjennomsnittet kaller vi bare getAverage-metoden. En nøkkelimplementeringsdetalj er hvordan arraystørrelsen bestemmes ved å dele vinduet med oppdateringsfrekvensen. Så et stort vindu med en hyppig oppdateringsfrekvens kan forbruke en betydelig mengde minne I dette eksemplet er arraystørrelsen rimelig 300. Men hvis vi opprettet et 24-timers glidende gjennomsnitt med 1 sekunds intervall, vil størrelsen være 86400 En mer reasonabl e-oppdateringsfrekvensen i en 24-timers periode kan være hver 5-minutters arraystørrelse på 288. En annen vurdering av valg av vindu og oppdateringsfrekvens er at vinduet må deles med frekvensen. For eksempel er et 2-minutters vindu med en 6 sekunders oppdateringsfrekvens ok , men en 7 sekunders oppdateringsfrekvens er ikke, siden den ikke er delelig med 120 En ulovligArgumentException kastes hvis oppdateringsfrekvensen for vindumodul ikke er null. Denne implementeringen krever en tråd per glidende gjennomsnitt, noe som ikke er veldig effektivt. En bedre løsning ville være å dele en tråd over mange gjennomsnitt Oppdater Jeg har oppdatert koden for å dele en tråd her. Sist, det er et opprinnelig tilstandsproblem vi har ikke data ennå for hele vinduet. For eksempel hvis du har et 5 minutters vindu og bare 15 sekunder av data Denne implementeringen returnerer null til vi har 5 minutter data En annen tilnærming er å anslå gjennomsnittet. Antag at vi har en telling på 10 på 30 sekunder, da kan vi anslå gjennomsnittet som 40 i 2 minutter. Hvordan Alltid er det risiko for betydelig feil ved å ekstrapolere ufullstendige data. For eksempel, hvis vi hadde en utbrudd på 20 treff på 2 sekunder, anslår vi 1200 per 2 minutter, som med all sannsynlighet er langt unna. 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. 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 data sample. What er den enkleste måten å oppnå dette på. Jeg eksperimenterte med å bruke et sirkulært array, eksponentielt glidende gjennomsnitt og et mer enkelt glidende gjennomsnitt og fant ut at resultatene fra det sirkulære arrayet passer mine behov best. asked 12. juni 12 klokka 4 38. Hvis dine behov er enkle, kan du bare prøve å bruke et eksponentielt glidende gjennomsnitt. Du gjør bare en akkumulatorvariabel, og når koden ser på hver prøve, oppdaterer koden akkumulatoren med den nye verdien. Du velger en konstant alfa at er mellom 0 og 1, og beregne 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 egentlig ikke sikker på at dette passer for deg, nå som jeg har sett det 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 flytende punktberegning. Men hvis du ville ha en mindre gjennomsnittlig, som 30 tall eller så, dette er en veldig enkel og rask måte å gjøre det. Ansatt 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 tidsbasen 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 på 6 21. Basisk jeg vil spore det bevegelige gjennomsnittet av en pågående strøm av en strøm av floati ng punkt tall ved å bruke de siste 1000 tallene som en dataprøve. Merk at under oppdaterer summen som elementene som lagt til erstattet, og unngår kostbare ON-traverser for å beregne summen som trengs for gjennomsnittet - på etterspørsel. Totalt er det laget en annen parameter fra T for å støtte, for eksempel ved å bruke lang lang når det er totalt 1000 lange s, en int for char s eller en dobbel til total flyt s. Dette er litt feil i at numsamples kan gå forbi INTMAX - hvis du bryr deg om at du kan bruke en usignert lang lenge eller bruk et ekstra bool data medlem til å registrere når beholderen er først fylt mens syklings numsamples rundt array best deretter omdøpt noe uskyldig som pos. answered 12 juni 12 på 5 19.one antar at tomrom operatør T prøven er faktisk tom operatør T prøve oPless 8 juni 14 på 11 52. oPless ahhh godt oppdaget egentlig mente jeg at det skulle være tomt operatør T-prøve, men selvfølgelig kunne du bruke hvilken som helst notat du likte vil fikse, takk Tony D Jun 8 14 på 14 27.

No comments:

Post a Comment