Wednesday 15 November 2017

Flytting Gjennomsnitt Matrise Java


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 ble 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 for at det ikke var et vanskelig problem. Her er min løsning. Dette virker ved å skape en rekke vindu oppdateringsfrekvensstørrelse, og en tråd setter tellingen til neste indeks i arrayet på oppdateringsfrekvensen Tellingen for intervallet er ganske enkelt array i-array i 1, som er den siste tellingen minus den eldste tellingen. For et 10-minutters intervall er den eldste tellingen i 1 akkurat 10 minutter gammel. For å legge til en bevegelse gjennomsnittlig til koden vår 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å gi implementeringen tilgang til disken, og det er oppnådd gjennom GetCount-grensesnittet Her vil jeg opprette et glidende gjennomsnitt med et 5 minutters vindu som oppdateres hvert sekund. Og for å få det nåværende gjennomsnittet kalles vi bare getAverage-metoden. En nøkkelimplementeringsdetalj er hvordan arraystørrelsen bestemmes ved å dele vinduet av oppdateringsfrekvensen Så et stort vindu med en hyppig oppdateringsfrekvens kan forbruke en betydelig mengde minne I dette eksemplet er størrelsen på array rimelig 300. Men hvis vi opprettet et 24-timers glidende gjennomsnitt med et sekunds intervall, vil størrelsen være 86400 A mer fornuftig oppdateringsfrekvens for 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å være di synlig av 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 vinduets moduloppdateringsfrekvens ikke er null. Dette implementering krever en tråd per bevegelige gjennomsnitt som ikke er veldig effektiv. En bedre løsning ville være å dele en tråd over mange gjennomsnitt. Oppdatering Jeg har oppdatert koden for å dele en tråd her. Sist, det er et innledende tilstandsproblem vi har ikke data for hele vinduet For eksempel hvis du har et 5 minutters vindu og bare 15 sekunder med 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 i 30 sekunder, da Vi kan anslå gjennomsnittet som 40 i 2 minutter. Det er imidlertid risiko for betydelig feil ved ekstrapolering av ufullstendige data. For eksempel, hvis vi hadde en utbrudd på 20 treff på 2 sekunder, estimerer vi 1200 per 2 minutter, hvem h er i all sannsynlighet langt unna. Din indre for er iterating all array slik at du alltid får det samme gjennomsnittet for hele gruppen, du bør iterere fra 0 til nåværende nummer av det ytre for stedet. Din bevegelse gjennomsnittet blir oppdatert basert på j i ditt indre fordi det betyr at det vil overstyre tidligere verdier hver ny sløyfe, dette bør være inne i det ytre for i stedet for det indre ved hjelp av jeg som indeks. Du deler divisjon j for å beregne gjennomsnitt, hver ny indre loop j du vil dele med 0 den første summen jeg tror du mente å bruke j 1 i stedet, indeksen er ikke den samme som den nåværende lengden. Tips å feilsøke. Unngå å bruke variabler til loop-arrays, bør du bruke instead. For et spørsmål om reprodusere problemet ditt, kan du gi oss det isolerte problemet i stedet for din nåværende kode ie. Imagine hvis feilen er i dine innspillinger, hvordan kan vi tro at du virkelig brukte dem. svaret 4. okt 13 kl 20 54. Du slår over alle dataene hver gang du burde ha for int ji averageLength i - gjennomsnittlig lengde 2 0 ji gjennomsnittlig lengde 2 j numDataPoints j eller noe lignende for ditt innerste gjennomsnitt. Også, movingAverage jeg summen j bør endres for å håndtere saken når j er 0 Spesielt bør det sannsynligvis bevege segAnnen jeg summerer gjennomsnittLengden og den skal brukes til movingAverage i-sporet utenfor gjennomsnittlig loop. answered 4. okt 13 kl 20 42.Neste gang, ta kommentarene til oppgaven ut av spørsmålet før du legger inn det. Men siden du ser litt nytt på dette, tenk på hvordan du ville gå gjennom dataene og få det til å gjøre det. Du bør prøve å sørge for at hver løkke stopper på riktig punkt, og husk at hvis du vil stoppe når det ikke er flere tall, som når du gjør indre sløyfe, og du kan bare få 3 flere tall i stedet for 4 programmet må stoppe også Sørg for at koden din sjekker for this. answered 4. okt 13 kl 20 56.I tillegg til ytterligere detaljer, trenger du sannsynligvis et uvevet glidende gjennomsnitt. På et hvilket som helst punkt A jeg i inngangen matrise A o f lengde N med 0 i N, det er bare middelverdien av de forrige K-oppføringene i arrayet, inntil og med A i Hvis det finnes t K slike verdier, så gjennomsnittlig i 1-verdiene fra A 0 til A i inklusive. En liten tanke vil vise deg at du ikke trenger å legge opp alle K-verdier hver gang Bare hold summen, og når du går videre til neste punkt, er dette et glidende gjennomsnitt, trekker verdien som blir erstattet og legger til den nye verdi som erstatter den I løpet av de første K-1 poengene, vil du ganske enkelt legge til den nye verdien til summen og øke telleren din med 1.At hvilket som helst punkt i denne prosessen er glidende gjennomsnitt gjeldende sum dividert med gjeldende telleverdi. behandlet 4 okt 13 kl 21 05. I et glidende gjennomsnitt må du ha en slags vindu størrelse. Din vindusstørrelse er gjennomsnittligLengde, så det vil se noe ut som dette. For loop starter ved nåværende data og går tilbake gjennomsnittlig lengde datapunkter og legger til dem Du vil bare ha et glidende gjennomsnitt når du har når du har nok datapunkter og gjennomsnittet vil være summen delt med gjennomsnittlig lengde. Notat Ikke testet bare sudo kode, men dette er ideen. ansvaret 4. okt. 13 på 21 05. Ditt svar.2017 Stack Exchange, Inc. Jeg har i hovedsak en rekke av verdier som dette. Ovenstående matrise er oversimplified, jeg m samler 1 verdi per millisekund i min virkelige kode og jeg må behandle utdataene på en algoritme jeg skrev for å finne nærmeste topp før et tidspunkt. Min logikk feiler fordi i min eksempel ovenfor, 0 36 er 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 bruke 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øre dette? Det er virkelig 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. Skrevet 8. februar 12 kl 20 27. For å beregne et eksponentielt glidende gjennomsnitt må du holde noen tilstand rundt og du trenger en tuningsparameter Dette krever en liten klasse forutsatt du bruker Java 5 eller nyere. Installer med desay-parameteren du vil ha, må innstille skal være mellom 0 og 1 og bruk deretter gjennomsnittet for å filtrere. Når du leser en side om matematisk tilbakevending, trenger du alt du trenger når du slår den inn 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 imidlertid ganske enkelt, da du bare trenger å huske en gammel verdi, ingen kompliserte statlige arrays required. answered Feb 8 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 gjennomsnittlig aktør. Merk at de første parvilkårene i gjennomsnittssekvensen vil hoppe litt rundt på grunn av grenseffekter, 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 gjennomsnittsprøven og eksperimentere uten å forstyrre resten av programmet for mye. Donal Fellows 9. februar 12 på 0 06.I 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 antar en monotonisk økning eller reduksjon som alltid går opp eller alltid gå ned med mindre du gjennomsnittlig ALLE dataene dine, datapunktene dine --- som du presenterer dem --- er ikke-lineære Hvis du virkelig vil finne maksimalverdien mellom to poeng i tid, skår du arrayen fra tmin til tmax og finn maksimalt av det subarray.2 Nå er begrepet bevegelige gjennomsnitt veldig enkle. Forestill 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 an d 1 4 andre og første tall Den andre nye listen er gjennomsnittet av 1 4 og 1 5 tredje og andre gamle liste den tredje nye listen gjennomsnittet av 1 5 og 1 4 fjerde og tredje, og så videre kunne jeg ha gjort det 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 i diagrammet Velg Moving Gjennomsnittlig 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. Les Wikipedia så det er mer en kommentar enn et svar, men den lille kommentarboksen var bare for liten lykke. Hvis du har problemer med matematikken, kan du gå med et enkelt bevegelige gjennomsnittssted i stedet for eksponentiell ville være de siste x-vilkårene dividere ed av x Untested pseudocode. Merk at du må håndtere start og slutt deler av dataene siden du klart kan ikke gjennomsnitts de siste 5 vilkårene når du er på ditt andre datapunkt. Det er også flere effektive måter å beregne denne bevegelsen på. gjennomsnittlig sum sum - eldste nyeste, men dette er for å få konseptet om hva som skjer over. Besvart 8. februar 12 kl 20 41.

No comments:

Post a Comment