Tuesday 3 October 2017

Rekursiv Bevegelig Gjennomsnitt Algoritme


Jeg vil implementere en iterativ algoritme, som beregner vektet gjennomsnitt. Den spesifikke vektloven spiller ingen rolle, men den bør være nær 1 for de nyeste verdiene og nær 0 til den eldste. Algoritmen skal være iterativ. dvs. det bør ikke huske alle tidligere verdier. Den skal bare kjenne en nyeste verdi og eventuelle aggregerende opplysninger om fortid, som tidligere verdier av gjennomsnittet, summer, teller etc. For eksempel kan følgende algoritme være: Det vil gi eksponentiell avtagende vekt, noe som kanskje ikke er bra. Er det mulig å få trinn som minker vekten eller noe Kravene til veierett er følgende: 1) Vekten minker inn i fortiden 2) Jeg har noen gjennomsnittlig eller karakteristisk varighet, slik at verdier eldre denne varigheten betyr mye mindre enn nyere 3) Jeg bør kunne angi denne varigheten jeg trenger følgende. Anta at vi er verdier, hvor v1 er den første. Anta også at wi er vekter. Men w0 er den siste. Så etter at første verdi kom, fikk jeg første gjennomsnitt Etter at den andre verdien v2 kom, burde jeg ha gjennomsnittet. Med neste verdi skulle jeg ha Merk, at vektprofilen beveger seg med meg mens jeg beveger seg langs verdifølgen. Dvs. hver verdi har ikke sin egen vekt hele tiden. Målet mitt er å ha denne vekten lavere mens du går forbi. gt Men min oppgave er å ha gjennomsnittlig omberegnet hver gang ny verdi kommer til å ha gamle verdier reweighted. OP Din oppgave er nesten alltid umulig, selv med svært enkle veier. Du ber om, med O (1) minne, gi gjennomsnitt med en endringsvekteskjema. For eksempel, når nye verdier blir sendt inn, for noen nesten vilkårlige endringer i vekter-sekvensen. Dette er umulig på grunn av injeksjonsevne. Når du slår sammen tallene sammen, mister du en enorm mengde informasjon. For eksempel, selv om du hadde vektvektoren. du kunne ikke gjenopprette den opprinnelige verdien vektoren, eller omvendt. Det er bare to tilfeller jeg kan tenke på hvor du kunne komme unna med dette: Konstante vekter som 2,2,2. 2: Dette tilsvarer en gjennomsnittlig algoritme på nettet, som du ikke vil, fordi de gamle verdiene ikke blir reweighted. Relativviktene til tidligere svar endres ikke. For eksempel kan du gjøre vekter på 8,4,2,1. og legg til i et nytt element med vilkårlig vekt som. 1. men du må øke alle tidligere med samme multiplikative faktor, som 16,8,4,21. På hvert trinn legger du til en ny vilkårlig vekt og en ny vilkårlig rescaling av fortiden, slik at du har 2 frihetsgrader (kun 1 hvis du trenger å beholde dotproduktet normalisert). Vektvektorer du får vil se ut: Således kan en vektingsplan som du ser slik ut, fungere (med mindre du trenger å holde saken normalisert med summen av vekter, da må du da dele det nye gjennomsnittet med det nye sum, som du kan beregne ved å bare holde O (1) minne). Bare multipliser det forrige gjennomsnittet av de nye s (som vil implisitt distribuere over prikkproduktet i vekter), og takk på den nye wnewValue. svarte 29. mars kl 21:27 Her antar du at vektene skal summe til 1. Så lenge du kan generere en relativ vekt uten at den endres i fremtiden, kan du ende opp med en løsning som etterligner denne oppførselen. Det vil si at du har definert dine vekter som en sekvens og definert inngangen som sekvens. Vurder skjemaet: sum (s0i0 s1i1 s2i2. Snin) sum (s0 s1 s2. Sn). Vær oppmerksom på at det er trivielt mulig å beregne dette trinnvis med et par aggregerings tellere: Selvfølgelig, beregneWeightFromCounter () i dette tilfellet bør ikke generere vekter som summerer til ett - trikset her er det vi gjennomsnittlig ved å dividere med summen av vekter slik at i slutten synes vekter nesten å summe til en. Det virkelige trikset er hvordan du beregnerWeightFromCounter (). Du kan bare returnere telleren selv, for eksempel, vær oppmerksom på at det siste vektede tallet ikke ville være nær summen av tellerne nødvendigvis, slik at du kanskje ikke ender opp med de nøyaktige egenskapene du vil ha. (Det er vanskelig å si siden du har forlatt et ganske åpent problem.) Besvart 28. mar 12 kl 21:45 Problemet er at vekter endrer seg med hver ny verdi. I ditt tilfelle er de ikke. ndash Suzan Cioc Mar 29 12 kl 14:43 De faktiske brukte vektene endrer seg med hver ny verdi - kvotenesquot blir delt med et suksessivt større tall, og derved styrker at de faktiske brukte vektene alltid belaster til 1. ndash Kaganar Mar 29 12 klokken 14:45 Dette er for lang tid å legge inn i en kommentar, men det kan være nyttig å vite. Anta at du har: w0vn. wnv0 (vel ring dette w0..nvn..0 for kort) Så er neste trinn: w0vn1. wn1v0 (og dette er w0..n1vn1..0 for kort) Dette betyr at vi trenger en måte å beregne w1..n1vn..0 fra w0..nvn..0. Det er sikkert mulig at vn..0 er 0. 0, z, 0. 0 hvor z er på noe sted x. Hvis vi ikke har ekstra lagringsplass, så er f (zw (x)) zw (x 1) hvor w (x) er vekten for plassering x. Omarrangere ligningen, w (x 1) f (zw (x)) z. Vel, w (x 1) bedre være konstant for en konstant x, så f (zw (x)) z er bedre konstant. Derfor må f la z propagere - det vil si f (zw (x)) zf (w (x)). Men her igjen har vi et problem. Merk at hvis z (som kan være et hvilket som helst tall) kan forplante seg gjennom f. så kan w (x) sikkert. Så f (zw (x)) w (x) f (z). Dermed f (w (x)) w (x) f (z). Men for en konstant x. w (x) er konstant, og dermed er f (w (x)) bedre også konstant. w (x) er konstant, så f (z) er bedre konstant slik at w (x) f (z) er konstant. Dermed er f (w (x)) w (x) c hvor c er en konstant. Så, f (x) cx hvor c er en konstant når x er en vektverdi. Det vil si, hver vekt er et flertall av det forrige. Vektene tar således formen w (x) mbx. Merk at dette forutsetter at kun informasjonen f har den siste aggregerte verdien. Merk at du på et tidspunkt vil bli redusert til denne saken med mindre du er villig til å lagre en ikke-konstant mengde data som representerer innspillet. Du kan ikke representere en uendelig lengdevektor med ekte tall med et reelt tall, men du kan omtrentlige dem på en eller annen måte i en konstant, endelig mengde lagringsplass. Men dette ville bare være en tilnærming. Selv om jeg ikke har fastslått det, er det min konklusjon at det du vil ha, er umulig å gjøre med en høy grad av presisjon, men du kan muligens bruke log (n) plass (som også kan være O (1) for mange praktiske bruksområder) for å skape en tilnærmet kvalitet. Du kan kanskje bruke enda mindre. svarte mar 29 12 kl 23:01 Jeg prøvde å praktisk talt kode noe (i Java). Som det er sagt, er målet ditt ikke oppnåelig. Du kan bare telle gjennomsnittet fra noen antall sist huskete verdier. Hvis du ikke trenger å være nøyaktig, kan du omtrentlige de eldre verdiene. Jeg prøvde å gjøre det ved å huske de siste 5 verdiene nøyaktig og bare eldre verdier SUMmed av 5 verdier, husker de siste 5 SUMene. Da er kompleksiteten O (2n) for å huske de siste nnn-verdiene. Dette er en veldig grov tilnærming. Du kan endre de siste valgene og lasAggregatedSums array størrelsene som du vil. Se dette ascii-art-bildet, og prøv å vise en graf over de siste verdiene, som viser at de første kolonnene (eldre data) blir husket som samlet verdi (ikke individuelt), og bare de tidligste 5 verdiene blir husket individuelt. Utfordring 1. Mitt eksempel teller ikke vekter, men jeg tror det burde ikke være et problem for deg å legge til vekter for de sisteAggregatedSumene på riktig måte - det eneste problemet er at hvis du vil ha lavere vekter for eldre verdier, ville det være vanskeligere fordi arrayet roterer, så Det er ikke greit å vite hvilken vekt for hvilket medlem som er medlem. Kanskje du kan endre algoritmen for alltid å skifte verdier i matrisen i stedet for å rotere. Da legger vektene ikke være et problem. Utfordring 2. Arrayene initialiseres med 0 verdier, og disse verdiene teller til gjennomsnittet fra begynnelsen, selv når vi ikke har fått nok verdier. Hvis du kjører algoritmen i lang tid, vil du sannsynligvis ikke bry deg om at den lærer for en tid i begynnelsen. Hvis du gjør det, kan du legge inn en endring -) besvart jan 21 14 kl 15:59 Ditt svar 2017 Stack Exchange, IncDen viktigste feilen i programmet er at rekursiv beregning er feil. For å beregne gjennomsnittet må du få summen av gjeldende verdi og de gjenværende verdiene. så del den summen av antall verdier. Antall verdier er num. Den nåværende verdien er uansett beregningsnummer () returnerer. Summen av de gjenværende verdiene er num-1 multiplisert med gjennomsnittet av de gjenværende verdiene. Gjennomsnittet av de gjenværende verdiene beregnes ved å lage et rekursivt anrop til gjennomsnittet (). Dermed skriver vi følgende: Et komplett program som bruker den funksjonen kan se slik ut: Merk at dette ikke er en veldig god måte å beregne gjennomsnittet fordi du mister presisjon hver gang du deler nåværende sum ved num. Når dette gjennomsnittet blir multiplisert igjen når det rekursive samtalen returnerer, blir de betydelige tallene du mistet i divisjonen ikke gjenopprettet. Du ødelegger informasjon ved å dele og deretter multiplisere summen. For større presisjon, vil du ha lyst til å holde oversikt over summen mens du går gjennom elementene, og deretter deles på slutten. Et annet poeng å vurdere er hva som menes med et glidende gjennomsnitt. Hva vi har implementert ovenfor er ikke et bevegelige gjennomsnitt, men et fast gjennomsnitt. Det er gjennomsnittet av et fast vindu av elementer. Hvis du flytter vinduet med en posisjon, må du starte over og beregne summen igjen. Den riktige måten å implementere et bevegelig vindu på, er å holde oversikt over alle elementene i vinduet. Når du flytter vinduet en posisjon til høyre, fjerner du det venstre elementet fra vinduet og trekker dets verdi fra summen, deretter legger du til det nye høyeste elementet i vinduet og legger til verdien til summen. Det er det som gjør det til en flytende sum. Å dele den bevegelige summen med antall elementer gir deg det bevegelige gjennomsnittet. Den naturlige måten å implementere et bevegelig vindu på er med en kø fordi du kan legge til nye elementer i hodet og pope gamle elementer fra halen. besvart 22. november 14 kl 17: 44I statistikk er et enkelt glidende gjennomsnitt en algoritme som beregner det uveide gjennomsnittet 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. Nylige innleggSkikkende trender: rekursive flytte gjennomsnittlige handelsregler og internett aksjer Wai Mun Fong. Lawrence H. M. Yong Institutt for finans og regnskap, National University of Singapore, 1 Business Link, Kent Ridge, Singapore 117592, Singapore Godkjent 24. juli 2003. Tilgjengelig online 24. mars 2004. Den siste økningen og fallet av aksjekursene i Internett har ført til at folk har en imponerende inntrykk av spekulativ boble i Internett-sektoren. Vi undersøker om investorer kunne ha utnyttet fart i Internett-aksjer ved hjelp av enkle, flytende gjennomsnittlige (MA) handelsregler. Vi simulerer sanntids teknisk handel ved hjelp av en rekursiv handelsstrategi som brukes på over 800 bevegelige gjennomsnittlige regler. Statistisk inferens tar hensyn til betinget heteroscedasticitet og felles avhengigheter. Ingen bevis på vesentlig handelsgevinst er funnet. De fleste Internett-aksjer oppfører seg som tilfeldig går dette, kombinert med høy volatilitet, kan være årsaken til den dårlige ytelsen til de bevegelige gjennomsnittlige reglene. Internett-aksjer Flytte gjennomsnittlige regler Rekursiv strategi Bootstrap JEL-klassifisering Tabell 6. Fig. 2. Fig. 3. Fig. 4. Tilsvarende forfatter. Tlf. 65-6874-6693 faks: 65-6779-2083. Copyright 2004 Elsevier B. V. Alle rettigheter reservert. Siterer artikler () Anbefalte artikler Beslektet bokinnehaver Copyright 2017 Elsevier B. V. unntatt visst innhold levert av tredjepart. ScienceDirect er et registrert varemerke for Elsevier B. V. Informasjonskapsler brukes av dette nettstedet. For å avvise eller lære mer, besøk vår Cookies-side. Logg inn via din institusjon

No comments:

Post a Comment