Viktat glidande medelvärde algoritm


Jag vill implementera en iterativ algoritm som beräknar vägat medelvärde. Den specifika viktlagen spelar ingen roll, men den borde vara nära 1 för de nyaste värdena och nära 0 till de äldsta. Algoritmen ska vara iterativ dvs det ska inte komma ihåg alla tidigare värden Det borde bara veta ett nyaste värde och eventuell aggregerande information om tidigare, som tidigare värden av medelvärdet, summan, räkningen etc. För exempel kan följande algoritm vara. Det kommer att ge exponentiell minskande vikt, vilket kanske inte är bra. det är möjligt att få steg med minskande vikt eller något. Kraven på vägning är följande.1 Vikten minskar till tidigare 2 Jag har viss genomsnittlig eller karakteristisk varaktighet så att värden äldre denna varaktighet är betydligt mindre än nyare 3 Jag borde kunna För att bestämma denna duration. I need the following Anta att vi är värden, där v1 är den första. Antag också att wi är vikter. Men w0 är LAST. Så, efter att första värdet kom, har jag första genomsnittet. Efter den andra v Alue v2 kom, jag borde ha genomsnitt. Med nästa värde borde jag ha. Notera, den viktprofilen rör sig med mig, medan jag flyttar längs värdesekvensen. Jag har varje värde inte sin egen vikt hela tiden. Mitt mål Är att ha den här vikten lägre medan du går till förflutna. Men min uppgift är att ha en genomsnittlig omräkning varje gång nytt värde kommer att ha gamla värderingar omvägda OP. Your uppgift är nästan alltid omöjlig, även med exceptionellt enkla viktningsplaner. Du ber att, med O 1-minne, ger medelvärden med ett växlande viktningsschema Till exempel, när nya värden skickas in, för vissa nästan godtyckligt förändrade viktsekvenser Detta är omöjligt på grund av injiceringsförmåga När du slår samman siffrorna ihop förlorar du en stor mängd information Till exempel, även om du hade viktvektorn kunde du inte återställa den ursprungliga värdet vektorn eller vice versa Det finns bara två fall jag kan tänka på var du kunde komma undan med detta. Konstanta vikter som 2,2,2 2 detta är ekvivalent t o en online-algoritm som du inte vill ha eftersom de gamla värdena inte reweighted. The relative vikter av tidigare svar ändras inte till exempel Du kan göra vikter på 8,4,2,1 och lägga till en ny element med godtycklig vikt som 1 men du måste öka allt tidigare med samma multiplikativa faktor, som 16,8,4,2 1 Således lägger du vid varje steg en ny godtycklig vikt och en ny godtycklig omkalkning av det förflutna, så du har bara 2 frihetsgrader 1 om du behöver hålla din prickprodukt normaliserad. De viktvektorer du får kommer att se ut. Som alla viktningsscheman du kan se ut så fungerar det om du inte behöver behålla saken normaliserad Av summan av vikter, i så fall måste du dela det nya medlet av det nya summan som du kan beräkna genom att bara hålla O 1-minne. Merely multiplicera det föregående genomsnittet av de nya s som implicit distribuerar över punktprodukten till vikterna och tack på den nya w newValue. answered 29 mars 12 på 21 27.Här jag antar att du vill att vikterna summeras till 1 Så länge du kan generera en relativ vikt utan att den ändras i framtiden, kan du sluta med en lösning som efterliknar detta beteende. Det antar att du definierade dina vikter som en sekvens och definierade inmatningen som sekvens. Tänk på formulär summan s0 i0 s1 i1 s2 i2 sn i summan s0 s1 s2 sn Observera att det är triviellt möjligt att beräkna detta inkrementellt med ett par aggregeringsräknare. CalculateWeightFromCounter i det här fallet borde inte generera vikter som summan till en - tricket här är det vi genomsnittar genom att dividera med summan av vikterna så att i slutändan tycks vikterna nästan vara summa till ett. Det verkliga tricket är hur du Gör calculateWeightFromCounter Du kan helt enkelt återvända räknaren själv, till exempel notera att det sista viktiga numret inte skulle vara nära summan av räknarna nödvändigtvis, så du kanske inte hamnar med de exakta egenskaperna du vill. Det är svårt att säga sedan, Som sagt, du ve lämnade ett ganska öppet problem. svarade den 28 mars 12 på 21 45. Problemet är att vikterna förändras med varje nytt värde. I ditt fall är de inte Suzan Cioc 29 mar 12 på 14 43. De faktiska använda vikterna ändras med varje nytt värde - vikterna delas med ett successivt större antal, vilket gör att de faktiska använda vikterna alltid summan uppgår till 1 Kaganar 29 mar 12 på 14 45. Detta är för långt att posta i en kommentar, men det kan vara användbart att veta. Anta att du har w0 vn wn v0 vi ska kalla detta w 0 nvn 0 för short. Then är nästa steg w0 vn1 wn1 v0 och det här är w 0 n1 v n1 0 för short. This betyder att vi behöver ett sätt att beräkna w 1 n1 Vn 0 från w 0 nvn 0. Det är säkert möjligt att vn 0 är 0 0, z, 0 0 där z är på någon plats x. Om vi ​​inte har någon extra lagring, då fzwxzwx 1 där wx är vikten för platsen x. Reformera ekvationen, wx 1 fzwxz Tja, wx 1 är bättre konstant för en konstant x, så fzwxz bättre vara konstant, därför måste f låta z sprida sig - det vill säga, fzwxzfw x. But här igen har vi ett problem Observera att om z som kan vara vilket tal som helst kan propagera genom f så kan wx säkert Så fzwxwxfz Således fwxwxfz Men för en konstant xwx är konstant, och därmed fwx bättre vara konstant, för wx är konstant , Så fz bättre vara konstant så att wxfz är konstant Således fwxwxc där c är en konstant. Så, fxcx där c är en konstant när x är ett viktvärde. Det är varje vikt en multipel av föregående. Således tar vikterna formuläret wxmb x. Notera att detta förutsätter att den enda informationen f har det sista aggregerade värdet. Observera att du vid någon tidpunkt kommer att reduceras till detta fall om du inte är villig att lagra en icke-konstant mängd data som representerar din inmatning. Du kan inte representera en oändlig längdvektor av reella tal med ett reellt tal men du kan approximera dem på något sätt i en konstant, ändlig mängd lagringsutrymme. Men detta skulle bara vara en approximation. Selv om jag inte har strikt bevisat det är det min slutsats Vad du vill ha är omöjligt att göra med en hög grad av precision, men du kan kanske använda log n-utrymme som också kan vara O 1 för många praktiska tillämpningar för att skapa en kvalitetsnäring. Du kan kanske använda ännu mindre. svarade mar 29 12 på 23 01. Jag försökte praktiskt taget koda något i Java Som sagt är ditt mål inte uppnåbart. Du kan bara räkna medeltal från ett antal senast minnas värden Om du inte behöver vara exakt kan du approximera De äldre värdena jag försökte göra det genom att komma ihåg de senaste 5 värdena exakt och äldre värden endast SUMmed av 5 värden, kom ihåg de senaste 5 SUM: erna Sedan är komplexiteten O 2n för att komma ihåg de senaste nnn-värdena Detta är en mycket grov approximation. You kan modifiera de senaste valarna och lasAggregatedSums array-storlekarna som du vill Se den här ascii-art-bilden som försöker visa en graf över de senaste värdena, vilket visar att de första kolumnerna äldre data kommer ihåg som aggregerat värde inte individuellt och endast de tidigaste 5 värdena återfinns D individuellt. Utmaning 1 Mitt exempel täger inte vikter, men jag tror att det inte borde vara problem för dig att lägga till vikter för de sistaAggregatedSummen på lämpligt sätt. Det enda problemet är att om du vill ha lägre vikter för äldre värden skulle det vara svårare, Eftersom matrisen roterar så är det inte enkelt att veta vilken vikt för vilken matrismedlem kanske du kan ändra algoritmen för att alltid skifta värden i matrisen istället för att rotera. Därför bör lägga vikter inte vara ett problem. Utmaning 2 Arrayerna initialiseras med 0 värden, och dessa värden räknar med medeltalet från början, även när vi inte har tillräckligt med värden. Om du kör algoritmen under en längre tid, förmodar du nog inte att det lär sig någon gång i början Om du gör det, du kan lägga upp en modifiering. svarad jan 21 14 på 15 59. Ditt svar.2017 Stack Exchange, Inc. Vågat rörande medelvärden Grunderna. Under åren har tekniker funnit två problem med det enkla glidande medeltalet Det första problemet ligger i tidsramen för glidande medeltalet MA De flesta tekniska analytiker tror att prisåtgärder öppnings - eller stängningspriset inte räcker för att bero på att förutsäga köp - eller försäljningssignaler för MAs crossover-åtgärder. För att lösa detta Problem, fördelar analytiker nu mer vikt till de senaste prisuppgifterna med hjälp av det exponentiellt jämnaste glidande genomsnittet EMA Lär dig mer när du utforskar det exponentiellt vägda rörliga genomsnittsvärdet. Ett exempel Exempelvis använder en analytiker en slutkurs med en 10-dagars MA av den 10: e dagen och multiplicera det här numret med 10, den nionde dagen med nio, den åttonde dagen med åtta och så vidare till den första av MA. När väl totalen har bestämts, dividerar analytikern sedan numret genom tillsatsen av multiplikatorer Om du lägger till multiplikatorerna i 10-dagars MA-exemplet är numret 55 Denna indikator kallas det linjärt viktade glidande medelvärdet. För relaterad avläsning, kolla in Enkla rörliga medelvärden, gör trenderna stannade. Y tekniker är fasta troende i det exponentiellt slätade glidande genomsnittet EMA Denna indikator har förklarats på så många olika sätt att det både förvirrar studenter och investerare. Den kanske bästa förklaringen kommer från John J Murphy s tekniska analys av finansmarknaderna, publicerad av New York Institute of Finance, 1999. Det exponentiellt slätade glidande genomsnittet adresserar båda problemen i samband med det enkla glidande medlet För det första tilldelas det exponentiellt jämnda genomsnittet en större vikt till de senaste dataen. Därför är det ett viktat glidande medelvärde. Men medan det tilldelas mindre betydelse för tidigare prisdata inkluderar den i sin beräkning alla data i instrumentets livslängd. Dessutom kan användaren justera viktningen för att ge större eller mindre vikt till det senaste dagens pris, vilket läggs till Till en procentsats av värdet för föregående dag s Summan av båda procentvärdena lägger till 100. Till exempel kan priset för sista dagen s vara ett ssigned en vikt av 10 10, vilket läggs till föregående dagsvikt 90 90 Detta ger den sista dagen 10 av totalvikten Detta skulle motsvara ett 20-dagarsmedelvärde genom att ge sista dagens pris ett mindre värde av 5 05.Figure 1 Exponentially Sloothed Moving Average. Ovanstående diagram visar Nasdaq Composite Index från den första veckan i aug 2000 till 1 juni 2001. Som du tydligt kan se, EMA, som i detta fall använder slutkursdata över en nio dagarsperiod har bestämda säljsignaler den 8 september markerad med en svart nedåtpil. Det här var den dag då indexet bröt under 4000-nivån. Den andra svarta pilen visar ett annat nedåtgående ben som tekniker faktiskt förväntade sig. Nasdaq kunde inte generera tillräckligt med volym och intresse från detaljhandeln för att bryta markeringen på 3 000. Därefter dyker du ner igen till botten ut på 1619 58 den 4 april. Uppgången av 12 april markeras med en pil. Här stängdes indexet 1961 46, och tekniker började se institutionella fondförvaltningen R börjar börja hämta några fynd som Cisco, Microsoft och några av de energirelaterade frågorna Läs våra relaterade artiklar Flytta genomsnittliga kuvert Raffinera ett populärt handelsverktyg och flytta genomsnittlig studsa. En undersökning gjord av Förenta staternas presidium för arbetsstatistik för att hjälpa till att mäta lediga platser Det samlar in uppgifter från arbetsgivare. Det högsta beloppet av pengar som Förenta staterna kan låna. Skuldtaket skapades enligt Second Liberty Bond Act. Räntan vid vilken ett förvaltningsinstitut lånar medel som förvaras i Federal Reserve till en annan depositarinstitution. 1 En statistisk mått på spridningen av avkastningen för ett visst värdepapper eller marknadsindex. Volatiliteten kan antingen mätas. En akt vidtog den amerikanska kongressen 1933 som Banking Act, som förbjöd kommersiella banker att delta i investment. Nonfarm lön hänvisar till någon jobb utanför gårdar, privata hushåll och icke-vinstdrivande sektorn. Arbetsförmedlingen i USA. Jag behöver hålla reda på de senaste 7 dagarna K timmar i en platt filavläsningsling Det används för att mäta utmattning av arbetsroster. Rätt nu har jag något som fungerar, men det verkar ganska ordentligt och jag är inte säker på om det finns ett mönster som är mer kortfattat. Samtidigt har jag en Java-klass med en statisk matris för att hålla de senaste x-dagarna data, då jag läser igenom filen, hugger jag av det första elementet och flyttar de andra 6 i en veckas rullande summa tillbaka av en Processen av den här statiska matrisen är klar i sin egen metod, dvs. My fråga är detta ett rimligt design-tillvägagångssätt eller är det något som är bländande självklart och enkelt att göra den här uppgiften Tack killar. asked aug 30 11 på 14 33. Tack många killar jag har fått meddelandet använda en högre - nivå objekt och utnyttja relevanta metoder eller en cirkulär buffert. Bra svar, alla av dem När du funderar på det behöver du alltid tillgång till hela matrisen så att du kan bli av med den första inmatningen - vilket jag inte var säker på på min egen Jag är ledsen att jag inte hade missat en liner och var basicall y på ett rimligt, om inte effektivt och sparsamt spår Det här är vad jag älskar om den här sidan av högkvalitativa, relevanta svar från personer som känner till deras sh t. Pete855217 Aug 30 11 på 15 05. Varför startar du runningTotal till null Vad är dess typ där det deklareras Det skulle vara bra om du lägger några kodprover som liknar den faktiska Java-koden. Att tänka på, min kritik skulle vara följande, din funktion gör för mycket En funktion eller metod ska vara sammanhängande Mer lämpligt bör de göra en sak och en sak only. Worse fortfarande, vad händer i din för loop när x 5 Du kopierar runTotal 6 till runTotal 5 men då har du två kopior av samma värde i position 5 och 6. I din design, din funktion. moves shuffles objekten i din array. calculates total. prints saker till standard error. returns summan. Det gör för mycket. My första förslaget är att inte flytta saker runt i matrisen istället implementera en cirkulär buffert och använd den istället för Array Det kommer att förenkla din design My Det andra förslaget är att bryta ner saker i funktioner som är sammanhängande. Har en datastruktur en cirkulär buffert som låter dig lägga till den och det faller den äldsta posten när den når sin kapacitet. Har datastrukturen implementerar en interator. har en funktion som beräknar summan på iteratorn du inte bryr dig om du beräknar summan av en array, lista eller cirkulär bufer. don t kalla det totalt Ring det summa, vilket är vad du beräknar. Det är vad jag gör. Det är bra info luis men kom ihåg att den här funktionen är en liten del av klassens funktionalitet, och det skulle vara overkill att lägga till för mycket kod för att göra den perfekt. Du är tekniskt korrekt och jag förstår min kod gör för mycket, men på Samtidigt är det bättre att radera på sidan av mindre, tydligare kod än att gå till perfektion Med tanke på mina Java-färdigheter, skulle även jag få min budget på detta, även om den pseudokod du beskriver beskriver, men tack för den tydliga beskrivningen Pete855217 Aug 31 1 1 på 2 23.Hmmm det handlar inte om perfektion men om etablerade industripraxis som vi har känt för de senaste tre decennierna. Ren kod är alltid en som är partitionerad. Vi har årtionden av bevis som visar att detta är vägen att gå i generellt fall när det gäller kostnadseffektivitet, defektminskning, förståelse mm, såvida det inte är kasta bort koden för en engångsartad sak. Det är aldrig dyrt att göra detta när man startar någon problemanalys på detta sätt kodning 101, bryta ner problemet och koden följer, varken overkill eller svårt 31 aug 11 på 15 55. Din uppgift är för enkel och det som du har antagit är säkert bra för jobbet. Om du vill använda en bättre design måste du dock få avlägsna all den där rörelsen använder du bättre en FIFO-kö och använder sig av push - och popmetoder så att koden inte speglar någon data-rörelse, bara de två logiska åtgärderna för nya data och ta bort data som är äldre än 7 dagar. 11 vid 14 49.

Comments