BFL-implementering av bevegelige gjennomsnitt Denne gjennomføringen virker ikke i det hele tatt optimal Jeg tror at den skal bruke en standard inkremental algoritme, som er uavhengig av vinduets størrelse. I en slik algoritme beholder du en løpende sum av elementer for en vinduestørrelse, og ved hvert trinn trekker du bare det eldste elementet og legger til det nye elementet til summen. Youd så returnere resultatet av divisjon ved vinduets størrelse som gjennomsnittet. Et annet problem synes å være at jeg alltid får resultatet til å være et heltall, selv når tallene mine er ekte. Er det en vei rundt dette Tags: bfl movingaverage avl hana Kedar Swadi 17. september 2013 kl 09:10 Del amp Follow 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. Gode 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 fungere bra hvis du legger noen kodeprøver som ligner på faktisk Java-kode. 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. besvart 30. august kl 14: 49. Forskeren og ingeniørerveiledningen til digital signalbehandling av Steven W. Smith, Ph. D. En enorm fordel ved det bevegelige gjennomsnittsfilteret er at det kan implementeres med en algoritme som er veldig rask. For å forstå denne algoritmen kan du tenke deg å sende et inngangssignal, x, gjennom et syvpunkts glidende gjennomsnittlig filter for å danne et utgangssignal, y. Se nå på hvordan to tilstøtende utgangspunkter, y 50 og y 51, beregnes: Disse er nesten de samme beregningspunktene x 48 til x 53 må legges til y 50 og igjen for y 51. Hvis y 50 allerede er beregnet , den mest effektive måten å beregne y 51 på er: Når y 51 er funnet ved å bruke y 50, kan y 52 beregnes fra prøve y 51 og så videre. Etter at det første punktet er beregnet i y, kan alle de andre punktene bli funnet med bare et enkelt tillegg og subtraksjon per punkt. Dette kan uttrykkes i ligningen: Legg merke til at denne ligningen bruker to kilder til data for å beregne hvert punkt i utgangen: poeng fra inngangen og tidligere beregnet punkter fra utgangen. Dette kalles en rekursiv ligning, noe som betyr at resultatet av en beregning brukes i fremtidige beregninger. (Begrepet rekursiv har også andre betydninger, spesielt i datavitenskap). Kapittel 19 diskuterer en rekke rekursive filtre nærmere. Vær oppmerksom på at det bevegelige gjennomsnittsrekursive filteret er svært forskjellig fra typiske rekursive filtre. Spesielt har de fleste rekursive filtre en uendelig lang impulsrespons (IIR), sammensatt av sinusoider og eksponensialer. Impulsresponsen av det bevegelige gjennomsnittet er en rektangulær puls (endelig impulsrespons, eller FIR). Denne algoritmen er raskere enn andre digitale filtre av flere grunner. For det første er det bare to beregninger per punkt, uavhengig av lengden på filterkjernen. For det andre er tillegg og subtraksjon de eneste matematiske operasjonene som trengs, mens de fleste digitale filtre krever tidkrevende multiplikasjon. For det tredje er indekseringsordningen veldig enkel. Hver indeks i ekv. 15-3 er funnet ved å legge til eller subtrahere heltallkonstanter som kan beregnes før filtreringen starter (dvs. p og q). Fremover kan hele algoritmen utføres med heltallrepresentasjon. Alt etter maskinvaren som brukes, kan heltalene være mer enn en størrelsesorden raskere enn flytpunktet. Overraskende fungerer heltallsrepresentasjon bedre enn flytpunkt med denne algoritmen, i tillegg til å være raskere. Avrundingsfeilen fra flytpunkts aritmetikk kan gi uventede resultater hvis du ikke er forsiktig. For eksempel, tenk at et 10.000 prøvesignal blir filtrert med denne metoden. Den siste prøven i det filtrerte signalet inneholder den akkumulerte feilen på 10 000 tillegg og 10 000 subtraksjoner. Dette vises i utgangssignalet som en drivforskyvning. Heltall har ikke dette problemet fordi det ikke er noen avrundingsfeil i aritmetikken. Hvis du må bruke flytpunkt med denne algoritmen, viser programmet i tabell 15-2 hvordan du bruker en dobbel presisjonsakkumulator for å eliminere denne driften. I statistikk er et enkelt glidende gjennomsnitt en algoritme som beregner uvektet gjennomsnitt av de siste n-prøvene. Parameter n kalles ofte vinduets størrelse, fordi algoritmen kan betraktes som et vindu som skyver over datapunktene. Ved å bruke en rekursiv formulering av algoritmen, reduseres antall operasjoner som kreves per prøve, til ett tillegg, en subtraksjon og en divisjon. Siden formuleringen er uavhengig av vinduets størrelse n. Rundtidskompleksiteten er O (1). dvs. konstant. Den rekursive formelen av det uveide glidende gjennomsnittet er hvor avg er det rullende gjennomsnittet og x representerer et datapunkt. Så når vinduet glir til høyre, faller et datapunkt, halen, ut og ett datapunkt, hodet, beveger seg inn. Implementering En implementering av det enkle glidende gjennomsnittet må ta hensyn til følgende Algoritminitialisering Så lenge som vinduet er ikke fullt fylt med verdier, den rekursive formelen mislykkes. Lagringstilgang til haleelementet er nødvendig, som avhengig av implementeringen krever lagring av n-elementer. Implementeringen min bruker den presenterte formelen når vinduet er fullstendig fylt med verdier, og ellers bytter til formelen, som oppdaterer gjennomsnittet ved å beregne summen av de forrige elementene. Vær oppmerksom på at dette kan føre til numeriske ustabiliteter på grunn av flytende punkt aritmetikk. Når det gjelder minnekonsumtion, bruker implementeringen iteratorer for å holde oversikt over hodet og haleelementene. Dette fører til en implementering med konstante minnekrav uavhengig av vinduets størrelse. Her er oppdateringsprosedyre som skyver vinduet til høyre. I de fleste samlingene ugyldiggjør deres oppregner når den underliggende samlingen er endret. Implementeringen avhenger imidlertid av gyldige opptegnere. Spesielt i streamingbaserte applikasjoner må den underliggende samlingen endres når et nytt element kommer. En måte å håndtere det er å skape en enkel sirkulær fast størrelse samling av størrelse n1 som aldri ugyldiggjør iteratorene og alternativt legge til et element og ring Shift. Jeg skulle ønske jeg kunne finne ut hvordan jeg faktisk kunne implementere dette, da testfunksjonen er veldig forvirrende for meg8230 Trenger jeg å konvertere data til Array, kjør så SMA sma ny SMA (20, array) i en 20-periode SMA Hvordan håndterer jeg? shift () - funksjon Er det nødvendig å implementere konstruktører. (beklager forvirring). Nei du don8217t trenger å konvertere dataene dine til en matrise så lenge dataene dine implementerer IEnumerable1 og den oppnådde typen er dobbel. Når det gjelder dine private meldinger, må du konvertere DataRow til noe som er tallrike av dobbelte verdier. Din tilnærming fungerer. Skift, glir vinduet en posisjon til venstre. For et datasett med si 40 verdier og en 20-årig SMA har du 21 stillinger vinduet passer inn (40 8211 20 1). Hver gang du ringer Shift (), flyttes vinduet til venstre av en posisjon og Gjennomsnitt () returnerer SMA for gjeldende vindusposisjon. Det vil si det uveide gjennomsnittet av alle verdier inne i vinduet. I tillegg tillater implementeringen min å beregne SMA selv om vinduet ikke er fullt fylt i begynnelsen. Så i hovedsak håper dette hjelper. Eventuelle ytterligere spørsmål COPYRIGHT NOTICE Christoph Heindl og cheind. wordpress, 2009-2012. Uautorisert bruk og / eller duplisering av dette materialet uten skriftlig og skriftlig tillatelse fra denne bloggen, er forfatter og / eller eier strengt forbudt. Utdrag og lenker kan brukes, forutsatt at full og klar kreditt er gitt til Christoph Heindl og cheind. wordpress med riktig og spesifikk retning til det opprinnelige innholdet. Siste innlegg
No comments:
Post a Comment