Enkel Bevegelse Gjennomsnittet Algoritme Java


En enkel, flytende gjennomsnittsimplementering i Java Ved flere anledninger ønsket jeg å beregne enkle beregninger i Java-applikasjonene, for eksempel antall treff i timen eller feil over en tidsperiode. Mens beregning av enkle beregninger ikke er veldig vanskelig, er det bare ekstra arbeid og ID heller å 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 bevegelige gjennomsnitt. Jeg tenkte på problemet litt mer og bestemte seg for at det ikke var et vanskelig problem. Heres min løsning Dette virker ved å skape en rekke vindu oppdateringsfrekvens størrelse, og en tråd setter tellingen til neste indeks i arrayet på oppdateringsfrekvensen. Tellingen for intervallet er ganske enkelt arrayi - arrayi1, som er den siste tellingen minus den eldste tellingen. I et 10-minutters intervall er den eldste tellingen (i1) nøyaktig 10 minutter gammel. For å legge til et bevegelige gjennomsnitt til vår kode først trenger du en teller, ved hjelp av AtomicLong. Denne telleren skal økes basert på hendelsene du er interessert i å beregne (for eksempel POST-forespørsler for en REST-tjeneste). Vi må gi implementeringen tilgang til disken, og det er oppnådd gjennom GetCount-grensesnittet. Her lager jeg et glidende 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 et intervall på 1 sekund, vil størrelsen være 86400 En mer fornuftig oppdateringsfrekvens for en 24-timers periode kan være hvert 5. minutt (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 blir kastet 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. Til slutt, det er et opprinnelig statsproblem: vi har ikke data ennå for hele vinduet. For eksempel hvis du har et 5 minutters vindu og kun 15 sekunder med data. Denne implementeringen returnerer null til vi har 5 minutter med data. En annen tilnærming er å anslå gjennomsnittet. Anta at vi har en telling på 10 i 30 sekunder, da kan vi anslå gjennomsnittet som 40 om 2 minutter. Imidlertid er det risiko for betydelig feil ved ekstrapolering av ufullstendige data. For eksempel, hvis vi hadde en utbrudd på 20 treff på 2 sekunder, må vi estimere 1200 per 2 minutter, noe som med all sannsynlighet er langt unna. Simpel flytting Gjennomsnittlig - SMA BREAKING DOWN Enkel Flytende Gjennomsnitt - SMA Et enkelt glidende gjennomsnitt er tilpassbart i at det kan beregnes for et annet antall tidsperioder, ganske enkelt ved å legge til sluttkursen for sikkerheten i et antall tidsperioder og deretter dele denne summen med antall tidsperioder, noe som gir gjennomsnittsprisen på sikkerheten over tidsperiode. Et enkelt glidende gjennomsnitt svekker ut volatiliteten, og gjør det enklere å se prisutviklingen av et sikkerhetssystem. Hvis det enkle glidende gjennomsnittet peker opp, betyr dette at sikkerhetsprisen øker. Hvis det peker ned, betyr det at sikkerhetsprisen faller. Jo lengre tidsramme for glidende gjennomsnitt, jo glattere det enkle glidende gjennomsnittet. Et kortere glidende gjennomsnitt er mer volatilt, men lesingen er nærmere kildedataene. Analytisk betydning Flytende gjennomsnitt er et viktig analytisk verktøy som brukes til å identifisere dagens prisutvikling og potensialet for endring i en etablert trend. Den enkleste formen av å bruke et enkelt bevegelige gjennomsnitts i analyse, bruker det til å raskt identifisere om en sikkerhet er i en opptrinn eller nedtrengning. Et annet populært, om enn litt mer komplekst analytisk verktøy, er å sammenligne et par enkle bevegelige gjennomsnitt med hver dekning forskjellige tidsrammer. Hvis et kortere sikt enkelt glidende gjennomsnitt er over et langsiktig gjennomsnitt, forventes en opptrend. På den annen side signalerer et langsiktig gjennomsnitt over et kortere sikt gjennomsnitt en nedadgående bevegelse i trenden. Populære handelsmønstre To populære handelsmønstre som bruker enkle bevegelige gjennomsnitt inkluderer dødskrysset og et gyldent kors. Et dødskors oppstår når 50-dagers enkelt glidende gjennomsnitt krysser under 200-dagers glidende gjennomsnitt. Dette betraktes som et bearish signal, at ytterligere tap er i butikk. Gullkorset oppstår når et kortsiktig glidende gjennomsnitt bryter over et langsiktig glidende gjennomsnitt. Forsterket av høye handelsvolumer, kan dette signalere ytterligere gevinster i butikken. Jeg trenger å holde oversikt over de siste 7 dagene arbeidstid i en flat filleseløkke. Dens blir brukt til å måle utmattingen av arbeidsroster. Akkurat nå har jeg noe som fungerer, men det virker ganske ordentlig og jeg er ikke sikker på om det er et mønster som er mer kortfattet. Foreløpig har jeg en Java-klasse med et statisk array for å holde de siste x-dagene dataene, da jeg leser gjennom filen, hugger jeg av det første elementet og flytter de andre 6 (for en ukes rullende sum) tilbake av en. Behandlingen av denne statiske matrisen er gjort i sin egen metode, dvs. Mitt spørsmål: er dette en rimelig design-tilnærming, eller er det noe blindingly åpenbart og enkelt å gjøre denne oppgaven Takk gutta spurte Aug 30 11 kl 14:33 Takk mange menn: Jeg har meldingen: bruk et høyere objekt og utnyt relevante metoder eller en sirkulær buffer. Flotte svar, alle av dem. Når du tenker på det, trenger du alltid tilgang til hele oppsettet slik at du kan kvitte deg med den første oppføringen - som jeg ikke var sikker på selv. I39m lettet over at jeg ikke hadde savnet noen liner og var i utgangspunktet på en rimelig, om ikke effektiv og tett spor. Dette er hva jeg elsker om dette nettstedet: høykvalitets, relevante svar fra folk som kjenner deres sht. ndash Pete855217 Aug 30 11 på 15:05 Hvorfor initierer du runningTotal til null Hva er dens type Hvor det er erklært Det ville være bra hvis du legger noen kodeprøver som ligner på den faktiske Java-koden. Fortsett, min kritikk ville være følgende: Funksjonen din gjør for mye. En funksjon, eller metode, skal være sammenhengende. Mer hensiktsmessig, de burde bare gjøre en ting og en ting. Verre fortsatt, hva skjer i din forløp når x 5 Du kopierer runningTotal6 til runningTotal5. men da har du to eksemplarer av samme verdi i posisjon 5 og 6. I designet ditt, flyttes funksjonen din til movesshuffles elementene i din matrise beregner totalt antall utskrifter til standard feil, returnerer summen. Det gjør for mye. Mitt første forslag er ikke å flytte ting rundt i matrisen. I stedet implementere en sirkulær buffer og bruk den i stedet for arrayet. Det vil forenkle ditt design. Mitt andre forslag er å bryte ned tingene i sammenhengende funksjoner: ha en datastruktur (en sirkulær buffer) som lar deg legge til det (og det faller den eldste oppføringen når den når sin kapasitet.) Har datastrukturen implementere en interator har en funksjon som beregner total på iteratoren (du bryr deg ikke om du beregner summen ut av en matrise, liste eller sirkulær bufer.) Ikke ring det totalt. Kaller det summen, som er hva du beregner. Det er det jeg gjør :) Det er flott info luis, men husk at denne funksjonen er en liten del av klassens funksjonalitet, og det ville være overkill å legge til for mye kode for å gjøre det perfekt. Du er teknisk riktig, og jeg forstår at koden min gjør 39 til mye39, men samtidig er det bedre å feile på siden av mindre klarere kode enn å gå for perfekt. Gitt min Java-ferdigheter, selv om du gjør pseudokoden du beskriver kompilere, ville jeg få meg til å blåse budsjettet mitt på dette (), men takk for den klare beskrivelsen. ndash Pete855217 Aug 31 11 på 2:23 Hmmm, det handler ikke om perfeksjon, men om etablerte industripraksis som vi har kjent de siste 3 tiårene. Ren kode er alltid en som er partisjonert. Vi har flere tiår med bevis som tyder på at dette er veien å gå i det generelle tilfellet (når det gjelder kostnadseffektivitet, feilreduksjon, forståelse osv.). med mindre det er kaste bort kode for en engang slags ting. Det er aldri dyrt å gjøre dette når man starter en problemanalyse på denne måten. Koding 101, bryte ned problemet og koden følger, verken overkill eller vanskelig) ndash luis. espinal Aug 31 11 på 15:55 Din oppgave er for enkel og det du har vedtatt, er sikkert bra for jobben. Men hvis du vil bruke en bedre design, må du kvitte deg med all den nummerbevegelsen du bedre bruker en FIFO-kø, og bruk god push - og pop-metoder slik at koden ikke reflekterer databevegelser, bare de to logiske handlingene av nye data og fjern data eldre enn 7 dager. svarte aug 30 11 kl 14:49

Comments

Popular Posts