Moving Genomsnittet Algoritm Genomförandet


BFL-implementering av glidande medelvärde Denna implementering verkar inte alls optimalt Jag tror att den ska använda en standard inkrementalgoritm, som är oberoende av fönsterstorleken. I en sådan algoritm behåller du en löpande summa av element för en fönsterstorlek, och vid varje steg, subtraherar du bara det äldsta elementet och lägger till det nya elementet i summan. Youd returnerar sedan resultatet av delningen av fönsterstorleken som medelvärdet. Ett annat problem verkar vara att jag alltid får resultatet att vara ett heltal, även när mina siffror är riktiga. Finns det ett sätt runt detta Taggar: bfl movingaverage afl hana Kedar Swadi 17 september 2013 kl 09:10 Share amp Följ Jag behöver hålla reda på de senaste 7 dagarna arbetstid i en platt filläsningsling. Det används för att mäta utmattning av arbetsrutiner. Just nu har jag något som fungerar, men det verkar ganska ordentligt och jag är inte säker på om det är ett mönster som är mer kortfattat. För närvarande 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 (för en veckas rullande summa) tillbaka med en. Bearbetningen av denna statiska matris görs i sin egen metod, dvs. Min fråga: Är det här 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 gubbar frågade Aug 30 11 klockan 14:33 Tack många killar: Jag har fått meddelandet: använd ett objekt på högre nivå och utnyttja relevanta metoder eller en cirkulär buffert. Stora svar, alla av dem. När du tänker på det, behöver du alltid tillgång till hela matrisen så att du kan bli av med den första inmatningen - som jag inte var säker på ensam. I39m lättade att jag inte hade missat något liner och var i princip på ett rimligt, om inte effektivt och tätt spår. Det här är vad jag älskar om den här webbplatsen: Högkvalitativa, relevanta svar från personer som känner till deras sht. ndash Pete855217 Aug 30 11 på 15:05 Varför initierar du runningTotal till null Vad är dess typ Var det deklareras Det skulle vara bra om du sätter några kodprover som liknar den faktiska Java-koden. Att fortsätta, min kritik skulle vara följande: din funktion gör för mycket. En funktion eller metod bör vara sammanhängande. Mer lämpligt borde de göra en sak och en sak bara. Värre fortfarande, vad händer i din för loop när x 5 Du kopierar runningTotal6 till runningTotal5. men då har du två kopior av samma värde i position 5 och 6. I din design, flyttar din funktion rörliga objekten i din matris beräknar totalt antal utskrifter till standardfel returnerar summan Det gör för mycket. Mitt första förslag är att inte flytta saker runt i matrisen. I stället implementerar du en cirkulär buffert och använder den i stället för matrisen. Det kommer att förenkla din design. Mitt andra förslag är att bryta ner saker i sammanhängande funktioner: ha en datastruktur (en cirkulär buffert) som gör det möjligt att lägga till det (och det faller den äldsta posten när den når sin kapacitet.) Uppdatera datastrukturen interator har en funktion som beräknar totalvärdet på iteratorn (du bryr dig inte om du beräknar summan av en array, lista eller cirkulär bufer.) Ringer inte det totalt. Ring det summa, vilket är vad du beräknar. Det är vad Id 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 39too mycket39 men samtidigt är det bättre att fel på sidan av mindre, tydligare kod än att gå till perfektion. Med tanke på mina Java-färdigheter kan jag, även om den pseudokod du beskriver beskriver kompilera, få mig att blåsa min budget på detta (), men tack för den tydliga beskrivningen. ndash Pete855217 31 aug 11 kl 2:23 Hmmm, det handlar inte om perfektion, utan om etablerade industripraktik 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 det här är sättet att gå i det allmänna fallet (vad gäller kostnadseffektivitet, defektminskning, förståelse etc.). om det inte är kasta bort koden för en engångsslag. 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 överkill eller svårt) ndash luis. espinal Aug 31 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 emellertid avskaffa all denna rörelse, du använder bättre en FIFO-kö och använder dig av push - och pop-metoder så att koden inte speglar någon datarörelse, bara de två logiska åtgärderna av nya data och ta bort data som är äldre än 7 dagar. svarat 30 aug 11 kl 14: 49 Scientist - och ingenjörguiden till digital signalbehandling av Steven W. Smith, Ph. D. En enorm fördel med det glidande medelfiltret är att det kan implementeras med en algoritm som är mycket snabb. För att förstå denna algoritm, föreställ dig att du skickar en insignal, x, genom ett sjupunkts glidande medelfilter för att bilda en utsignal, y. Se nu hur två närliggande utgångspunkter, y 50 och y 51, beräknas: Dessa är nästan samma beräkningspunkter x 48 till x 53 måste läggas till y 50 och igen för y 51. Om y 50 redan har beräknats , det effektivaste sättet att beräkna y 51 är: När y 51 har hittats med y 50 kan y 52 beräknas från prov y 51 och så vidare. När den första punkten är beräknad i y, kan alla andra punkter hittas med endast ett enda tillägg och subtraktion per punkt. Detta kan uttryckas i ekvationen: Observera att denna ekvation använder två datakällor för att beräkna varje punkt i utgången: poäng från inmatningen och tidigare beräknade punkter från utgången. Detta kallas en rekursiv ekvation, vilket innebär att resultatet av en beräkning används i framtida beräkningar. (Termen rekursiv har också andra betydelser, särskilt i datavetenskap). Kapitel 19 diskuterar en rad olika rekursiva filter mer detaljerat. Var medveten om att det rörliga genomsnittliga rekursiva filtret är väldigt annorlunda än typiska rekursiva filter. I synnerhet har de mest rekursiva filtren ett oändligt långt impulsrespons (IIR), som består av sinusoider och exponentiella. Impulssvaret för det glidande medlet är en rektangulär puls (finitivt impulsrespons eller FIR). Denna algoritm är snabbare än andra digitala filter av flera anledningar. För det första finns det bara två beräkningar per punkt, oberoende av längden på filterkärnan. För det andra är addition och subtraktion den enda matteoperationen som behövs, medan de flesta digitala filter kräver tidskrävande multiplikation. För det tredje är indexeringssystemet mycket enkelt. Varje index i ekv. 15-3 hittas genom tillsats eller subtraktion av heltalskonstanter som kan beräknas före filtreringsstart (dvs p och q). Framåt kan hela algoritmen utföras med heltalrepresentation. Beroende på vilken hårdvara som används kan heltal vara mer än en storleksordning snabbare än flytpunkten. Överraskande fungerar heltalsrepresentation bättre än flytpunkt med denna algoritm, förutom att det blir snabbare. Avrundningsfelet från flytpunktsräkning kan ge oväntade resultat om du inte är försiktig. Tänk dig till exempel att en 10.000 provsignal filtreras med denna metod. Det sista provet i den filtrerade signalen innehåller det ackumulerade felet på 10 000 tillägg och 10 000 subtraheringar. Detta framträder i utsignalen som en drivförskjutning. Helheter har inte detta problem eftersom det inte finns något avrundningsfel i aritmetiken. Om du måste använda flytpunkten med denna algoritm, visar programmet i tabell 15-2 hur du använder en dubbel precisionsackumulator för att eliminera denna drift. I statistiken är ett enkelt rörligt 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. Nya Inlägg

Comments

Popular Posts