Tuesday 1 August 2017

Rekursiv Glidande Medelvärde Algoritm


Jag vill implementera en iterativ algoritm, som beräknar vägt genomsnitt. Den specifika viktlagstiftningen 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 bör inte komma ihåg alla tidigare värden. Det borde bara veta ett nyaste värde och någon aggregerande information om tidigare, som tidigare värden av medelvärdet, summan, räkningen etc. Till exempel kan följande algoritm vara: Det kommer att ge exponentiell minskande vikt, vilket kanske inte är bra. Är det möjligt att få steg minskande vikt eller något Kraven på vägningslag är följande: 1) Vikten minskar till förflutna 2) Jag har viss genomsnittlig eller karakteristisk längd så att värden äldre denna längd är betydligt mindre än nyare 3) Jag bör kunna ställa in denna längd jag behöver följande. Antag att vi är värden, där v1 är den första. Antag också att wi är vikter. Men w0 är senast. Så efter det första värdet kom jag till första genomsnittet Efter det andra värdet v2 kom, borde jag ha genomsnittet Med nästa värde borde jag ha Obs, den viktprofilen rör sig med mig medan jag flyttar längs värdesekvensen. Dvs. varje värde har inte sin egen vikt hela tiden. Mitt mål är att få denna vikt lägre medan man går förbi. Gt Men min uppgift är att ha omräknat genomsnittsvärde varje gång nytt värde kommer att ha gamla värden reweighted. OP Din uppgift är nästan alltid omöjlig, även med exceptionellt enkla viktningsplaner. Du ber att, med O (1) minne, ge medelvärden med ett ändrat viktningsschema. Till exempel, när nya värden skickas in, för vissa nästan vildväxande vikter sekvens. Detta är omöjligt på grund av injicerbarhet. När du slår samman siffrorna ihop förlorar du en enorm mängd information. Till exempel, även om du hade vektvektorn. Du kunde inte återställa originalvärdesvektorn, eller vice versa. Det finns bara två fall som jag kan tänka på var du kunde komma undan med detta: Konstanta vikter som 2,2,2. 2: det här motsvarar en online-algoritm, som du inte vill ha eftersom de gamla värdena inte reweightes. De relativa vikterna av tidigare svar ändras inte. Till exempel kan du göra vikter på 8,4,2,1. Och lägg till i ett nytt element med godtycklig vikt som. 1. men du måste öka allt tidigare med samma multiplikativa faktor, som 16,8,4,21. Således lägger du till en ny godtycklig vikt vid varje steg och en ny godtycklig omkalkning av det förflutna, så du har 2 frihetsgrader (endast 1 om du behöver behålla din punktprodukt normaliserad). De viktvektorer du får kommer att se ut: Således kan ett viktningsschema som du ser ut så fungera (om du inte behöver hålla saken normaliserad med summan av vikter, då måste du sedan dela det nya genomsnittet av det nya Summan, som du kan beräkna genom att bara behålla O (1) minne). Merligen multiplicera det föregående genomsnittet av de nya s (vilket implicit distribuerar över punktprodukten till vikterna) och tack på den nya wnewValue. Svarade mar 29 12 på 21:27 Här antar du att vikterna ska summeras till 1. Så länge du kan skapa en relativ vikt utan att den ändras i framtiden, kan du sluta med en lösning som efterliknar detta beteende. Det är, anta att du definierade dina vikter som en sekvens och definierade inmatningen som sekvens. Tänk på formuläret: summa (s0i0 s1i1 s2i2. Snin) summa (s0 s1 s2. Sn). Observera att det är triviellt möjligt att beräkna detta inkrementellt med ett par aggregeringsräknare: Naturligtvis beräknar viWeightFromCounter () i det här fallet inte att generera vikter som summan till en - tricket här är att vi är genomsnittliga genom att dividera med summan av vikterna Så att i slutändan tycks vikterna nästan vara summa. 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 ha. (Det är svårt att säga eftersom du, som sagt, har lämnat ett ganska öppet problem.) Svarat mar 28 12 kl 21:45 Problemet är att vikterna förändras med varje nytt värde. I ditt fall är de inte det. ndash Suzan Cioc Mar 29 12 kl 14:43 De faktiska använda vikterna förändras med varje nytt värde - kvoten kvot delas med ett successivt större antal, vilket gör att de faktiska använda vikterna alltid summeras till 1. ndash Kaganar mar 29 12 Klockan 14:45 Det här är för länge att posta i en kommentar, men det kan vara användbart att veta. Antag att du har: w0vn. Wnv0 (väl kalla det här w0..nvn..0 för korta) Sedan är nästa steg: w0vn1. Wn1v0 (och detta är w0..n1vn1..0 för kort) Det betyder att vi behöver ett sätt att beräkna w1..n1vn..0 från w0..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å f (zw (x)) zw (x 1) där w (x) är vikten för plats x. Omordna ekvationen, w (x 1) f (zw (x)) z. Tja, w (x 1) är bättre konstant för en konstant x, så f (zw (x)) z är bättre konstant. Därför måste f föra z propagera - det vill säga f (zw (x)) zf (w (x)). Men här har vi igen ett problem. Observera att om z (vilket kan vara vilket som helst nummer) kan sprida sig via f. då kan w (x) säkert. Så f (zw (x)) w (x) f (z). Således f (w (x)) w (x) f (z). Men för en konstant x. W (x) är konstant, och därmed är f (w (x)) bättre också konstant. W (x) är konstant, så f (z) är bättre konstant så att w (x) f (z) är konstant. Således är f (w (x)) w (x) c där c är en konstant. Så, f (x) cx där c är en konstant när x är ett viktvärde. Det vill säga varje vikt är en multipel av det föregående. Vikten tar sålunda formen w (x) mbx. Observera att detta förutsätter att den enda informationen f har är det sista aggregerade värdet. Observera att du vid något tillfälle 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 lagring. Men detta skulle bara vara en approximation. Även om jag inte har bevisat det på ett strikt sätt, är det min slutsats att det 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 (vilket också kan vara O (1) för många praktiska tillämpningar) för att skapa en kvalitativ approximation. Du kan kanske använda ännu mindre. Svarade mar 29 12 kl 23:01 Jag försökte praktiskt taget koda något (i Java). Som sagt har målet inte uppnåtts. Du kan bara räkna medeltal från ett antal senast bortkomna 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ärderingarna exakt och äldre värden endast SUMmed av 5 värden, kom ihåg de senaste 5 SUM. Då är komplexiteten O (2n) för att komma ihåg de senaste nnn-värdena. Detta är en mycket grov approximation. Du kan ändra de senaste valerna 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ågs som aggregerat värde (inte individuellt) och endast de första 5 värdena kommer ihåg individuellt. Utmaning 1. Mitt exempel räknar inte vikter, men jag tror att det inte borde vara problem för dig att lägga till vikter för de senasteAggregatedSummen 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å Det är inte lätt att veta vilken vikt för vilken medlem i gruppen. Kanske kan du modifiera algoritmen för att alltid flytta värden i matrisen istället för att rotera. Då lägger vikter inte vara ett problem. Utmaning 2. Arrayerna initialiseras med 0 värden, och dessa värden räknar med i genomsnitt från början, även när vi inte får tillräckligt med värden. Om du kör algoritmen länge, stör du förmodligen inte att den lär dig någon gång i början. Om du gör det kan du lägga upp en ändring -) svarade jan 21 14 kl 15:59 Ditt svar 2017 Stack Exchange, IncDen huvudsakliga defekten i ditt program är att rekursiv beräkning är felaktig. För att beräkna medelvärdet måste du få summan av det aktuella värdet och de återstående värdena. dividera sedan summan med antalet värden. Antalet värden är num. Det nuvarande värdet är vilket beräkningsnummer () returnerar. Summan av de återstående värdena är num-1 multiplicerad med genomsnittet av de återstående värdena. Medelvärdet av de återstående värdena beräknas genom att göra ett rekursivt samtal till medelvärdet (). Således skriver vi följande: Ett komplett program med den funktionen kan se ut så här: Observera att det här inte är ett mycket bra sätt att beräkna medelvärdet eftersom du förlorar precision varje gång du delar nuvarande summan av num. När detta medel multipliceras igen när det rekursiva samtalet återvänder, återställs inte de signifikanta siffrorna som du förlorade i divisionen. Du förstör information genom att dela och multiplicera summan. För större precision, vill du hålla koll på summan när du går igenom elementen, dividerar sedan i slutet. En annan punkt att tänka på är vad som menas med ett glidande medelvärde. Vad vi har genomfört ovan är inte ett glidande medelvärde men ett fast medelvärde. Det är genomsnittet av ett fast fönstersfönster. Om du flyttar fönstret med ett läge måste du börja om och beräkna summan igen. Det rätta sättet att genomföra ett rörligt fönster är att hålla koll på alla element i fönstret. När du flyttar fönstret en position till höger tar du bort det vänstra elementet från fönstret och subtraherar dess värde från summan och lägger sedan till det nya högsta elementet i fönstret och lägger till dess värde till summan. Det är det som gör det en rörlig summa. Att dela den rörliga summan med antalet element ger dig det rörliga genomsnittet. Det naturliga sättet att genomföra ett rörligt fönster är med en kö eftersom du kan lägga till nya element i huvudet och popa gamla element från svansen. Svarat 22 november 14 kl 17: 44I statistik är ett enkelt glidande medelvärde en algoritm som beräknar det obegripade medelvärdet av de sista n-proverna. Parametern n kallas ofta fönsterstorleken, eftersom algoritmen kan ses som ett fönster som glider över datapunkterna. Genom att använda en rekursiv formulering av algoritmen reduceras antalet operationer som krävs per prov till en addition, en subtraktion och en division. Eftersom formuleringen är oberoende av fönsterstorleken n. runtime komplexiteten är O (1). d. v.s. konstant. Den rekursiva formeln för det obegripade rörliga genomsnittsvärdet är, där avg är det rullande medelvärdet och x representerar en datapunkt. Så, när fönstret glider åt höger, faller en datapunkt, svansen ut och en datapunkt, huvudet rör sig in. Implementering En implementering av det enkla glidande medlet måste ta hänsyn till följande Algoritminitialisering Så länge som Fönstret är inte fullt befolket med värden, den rekursiva formeln misslyckas. Lagring Tillgång till svanselementet krävs, vilket beroende på implementeringen kräver lagring av n-element. Min implementering använder den presenterade formeln när fönstret är helt befolket med värden och annars växlar till formeln, som uppdaterar medelvärdet genom att beräkna summan av de föregående elementen. Observera att detta kan leda till numeriska instabiliteter på grund av flytande punkträkning. När det gäller minneskonsumtion använder implementeringen iteratorer för att hålla reda på huvud och svanselement. Detta leder till en implementering med konstanta minneskrav oberoende av fönsterstorleken. Här är uppdateringsproceduren som glider fönstret till höger. I de flesta samlingarna ogiltigförklaras deras uppräknare när den underliggande samlingen är modifierad. Genomförandet är dock beroende av giltiga uppräknare. Speciellt i streamingbaserade applikationer behöver den underliggande samlingen ändras när ett nytt element kommer fram. Ett sätt att hantera det är att skapa en enkel cirkulär fixformatsamling av storlek n1 som aldrig ogiltigförklarar dess iteratorer och alternativt lägger till ett element och kallar Shift. Jag önskar att jag kunde ta reda på hur man faktiskt implementerar detta, eftersom testfunktionen är mycket förvirrande för mig8230 Behöver jag konvertera data till Array, kör sedan SMA sma ny SMA (20, array) för en 20-årig SMA Hur hanterar jag? shift () funktion Är det nödvändigt att implementera konstruktörer. (förlåt för förvirring). Nej, du don8217t behöver konvertera dina data till en array så länge som dina data implementerar IEnumerable1 och den uppräknade typen är dubbel. Vad beträffar din privata meddelandehantering måste du konvertera DataRow till något som är uppräkningsbart för dubbla värden. Din inställning fungerar. Skift, glider fönstret ett läge till vänster. För en dataset med säg 40 värden och en 20-årig SMA har du 21 positioner som fönstret passar in (40 8211 20 1). Varje gång du ringer Skift () flyttas fönstret till vänster av en position och Average () returnerar SMA för det aktuella fönstret. Det vill säga det obegripade genomsnittet av alla värden inuti fönstret. Dessutom tillåter min implementering att beräkna SMA även om fönstret inte är fullt fyllt i början. Så i huvudsak hoppas det här hjälper. Några ytterligare frågor COPYRIGHT MEDDELANDE Christoph Heindl och cheind. wordpress, 2009-2012. Otillåten användning och / eller duplicering av detta material utan uttryckligt och skriftligt tillstånd från denna blogg är författare andor ägare strängt förbjudet. Utdrag och länkar kan användas, förutsatt att fullständig och tydlig kredit ges till Christoph Heindl och cheind. wordpress med lämplig och specifik riktning till det ursprungliga innehållet. Senaste inläggKöpande trender: Rekursiva glidande genomsnittliga handelsregler och internetaktier Wai Mun Fong. Lawrence H. M. Yong Avdelningen för ekonomi och redovisning, National University of Singapore, 1 Business Link, Kent Ridge, Singapore 117592, Singapore Godkänd 24 juli 2003. Tillgänglig online den 24 mars 2004. Den senaste tidens stigande och fallande internet aktiekurser har lett till populära intryck av en spekulativ bubbla i Internet-sektorn. Vi undersöker huruvida investerare kunde ha utnyttjat fart i Internet-aktier genom att använda enkla röra genomsnittliga handelsregler. Vi simulerar teknisk handel i realtid med hjälp av en rekursiv handelsstrategi som tillämpas på över 800 glidande medelregler. Statistisk inferens tar hänsyn till villkorlig heteroscedasticitet och gemensamma beroende. Inga tecken på betydande handelsvinster finns. De flesta internetaktier uppträder som slumpmässigt går det här, i kombination med hög volatilitet, kan vara orsaken till den ojämna prestationen av de glidande genomsnittliga reglerna. Internet-aktier Flyttande medelregler Rekursiv strategi Bootstrap JEL-klassificering Tabell 6. Fig. 2. Fig 3. Fig. 4. Motsvarande författare. Tel. 65-6874-6693 fax: 65-6779-2083. Copyright 2004 Elsevier B. V. Alla rättigheter förbehållna. Citerande artiklar () Rekommenderade artiklar Relaterat bokinnehåll Copyright 2017 Elsevier B. V. med undantag för visst innehåll från tredje part. ScienceDirect är ett registrerat varumärke som tillhör Elsevier B. V. Cookies används av denna webbplats. För att avböja eller lära dig mer, besök vår Cookies-sida. Logga in via din institution

No comments:

Post a Comment