Glidande medelvärde filter java kod


Jag har i huvudsak en mängd värden som denna. Den ovanstående matrisen är översimplifierad, jag m samlar 1 värde per millisekund i min riktiga kod och jag måste bearbeta utmatningen på en algoritm som jag skrev för att hitta den närmaste toppen före en tidpunkt Logiken misslyckas eftersom i mitt exempel ovan är 0 36 den riktiga toppen, men min algoritm skulle se bakåt och se det sista numret 0 25 som toppen eftersom det sänker till 0 24 före det. Målet är att ta dessa värden Och tillämpa en algoritm för dem som släpper ut dem lite så att jag har mer linjära värden, dvs jag tycker att mina resultat är kurva, inte jaggedy. Jag har fått höra att använda ett exponentiellt glidande medelfilter till mina värden. Hur kan jag gör det här Det är verkligen svårt för mig att läsa matematiska ekvationer. Jag hanterar mycket bättre med kod. Hur bearbetar jag värden i min array och tillämpar en exponentiell glidande genomsnittlig beräkning för att till och med utföra dem. Skal den 8 februari 12 på 20 27. För att beräkna ett exponentiellt glidande medelvärde behöver du hålla någon stat runt och du behöver en inställningsparameter Detta kräver en liten klass om du antar att du använder Java 5 eller senare. Inställning med sönderfallsparametern du vill kan ta tuning ska vara mellan 0 och 1 och använd sedan genomsnittet för att filtrera. När du läser en sida på några matematiska Återkommande, allt du verkligen behöver veta när du gör det till kod är att matematiker gillar att skriva index i arrayer och sekvenser med prenumerationer. De har några andra noteringar också, vilket hjälper inte Emellertid är EMA ganska enkel eftersom du bara behöver att komma ihåg ett gammalt värde, inga komplicerade tillståndsuppställningar krävs. svarade den 8 februari 12 på 20 42. TKKocheran Ganska mycket Det är inte trevligt när saker kan vara enkla Om du börjar med en ny sekvens får du en ny medelvärde Observera att de första villkoren i Den genomsnittliga sekvensen hoppar runt lite på grund av gränseffekter, men du får de med andra glidande medelvärder. En bra fördel är dock att du kan linda den glidande genomsnittliga logiken in i medelvärdet och experimentera utan att störa t han vilar på ditt program för mycket Donal Fellows 9 februari 12 på 0 06. Jag har svårt att förstå dina frågor, men jag kommer att försöka svara ändå.1 Om din algoritm hittat 0 25 istället för 0 36, då är det fel Det är fel eftersom det förutsätter en monotonisk ökning eller minskning som alltid går upp eller alltid går ner, Om du inte vill ha det maximala, om du inte är genomsnittlig ALLA dina data, är dina datapunkter --- som du presenterar dem --- olinjära. värdet mellan två punkter i tid, skära sedan din matris från tmin till tmax och hitta max av den subarray.2 Nu är konceptet för glidande medelvärden mycket enkelt. Föreställ dig att jag har följande lista 1 4, 1 5, 1 4, 1 5, 1 5 Jag kan släpa ut det genom att ta medeltalet av två nummer 1 45, 1 45, 1 45, 1 5 Observera att det första numret är genomsnittet av 1 5 och 1 4 sekund och första siffrorna är den andra nya listan är genomsnittet av 1 4 och 1 5 tredje och andra gamla listan den tredje nya listan i genomsnitt 1 5 och 1 4 fjärde och tredje, och så vidare kunde jag har gjort det period tre eller fyra eller n Observera hur dataen är mycket jämnare Ett bra sätt att se glidande medelvärden på jobbet är att gå till Google Finance, välj ett lager försök Tesla Motors ganska flyktiga TSLA och klicka på technicals längst ner på diagrammet Välj Flyttande medelvärde med en given period och Exponentiell glidande medelvärde för att jämföra deras skillnader. Exponentialt glidande medelvärde är bara en annan utarbetande av detta men viktar de äldre data mindre än de nya data så är det ett sätt att förspänna utjämningen mot baksidan Vänligen läs Wikipedia-posten. Så det här är mer en kommentar än ett svar, men den lilla kommentarrutan var bara för liten lycka till. Om du har problem med matte kan du gå med ett enkelt glidande medel istället för exponentiella Så utgången du får skulle vara de sista x-termerna dividerad med x Otestad pseudokod. Notera att du måste hantera start - och slutdelarna av data eftersom det tydligt är att du inte kan räkna med de senaste 5 termerna när du befinner dig på din andra datapunkt , den Re är effektivare sätt att beräkna denna rörliga genomsnittliga summan summan - äldsta nyaste, men det här är att få konceptet av vad som händer across. answered Feb 8 12 på 20 41. Genomsnittet Enkelt glidande medelvärde. Genomsnittet Enkelt glidande medelvärde Du uppmuntras att Lösa den här uppgiften enligt uppgiftsbeskrivningen och använd något språk som du kan känna till det enkla glidande medlet av en serie tal. Skapa en stateful-funktion klassinstans som tar en period och returnerar en rutin som tar ett tal som argument och ger en enkel rörelse Genomsnittet av dess argument hittills. Ett enkelt glidande medelvärde är en metod för att beräkna ett medelvärde av en ström av siffror genom att endast beräkna de sista P-talen från strömmen, där P är känd som perioden. Det kan implementeras genom att ringa en initialisering rutin med P som sitt argument, IP, som då ska returnera en rutin som när det kallas med enskilda, successiva medlemmar i en ström av tal, beräknar medelvärdet av upp till den sista P av dem, kan vi ringa detta SMA. Ordet stateful i uppgiftsbeskrivningen hänvisar till behovet av SMA att komma ihåg viss information mellan samtal till den. Perioden, P. An beställd behållare av åtminstone de sista P-talen från var och en av sina enskilda samtal. Stabilt betyder också att Successiva samtal till jag, initialiseraren, ska returnera separata rutiner som inte delar sparat tillstånd så att de kan användas på två oberoende dataflöden. Pseudo-kod för en implementering av SMA är. Denna version använder en ihållande kö för att hålla mest Senaste p-värden Varje funktion som returneras från init-moving-genomsnittet har sitt tillstånd i en atom som håller ett kövärde. Denna implementering använder en cirkellista för att lagra siffrorna i fönstret i början av varje iterationspekare hänvisar till listcellen som håller Värdet flytta bara ut ur fönstret och ersättas med det justerade värdet. Använda en avslutningsredigering. För tillfället kan denna sma inte vara nogc eftersom den allokerar en nedläggning på högen. En del escapeanalys kan ta bort h Eap allocation. Using en struktur edit. This versionen undviker hålfördelningen av stängningen hålla data i stapelramen av huvudfunktionen Samma output. To att undvika att floating point approximationerna fortsätter att växa upp och växer kan koden utföra en periodisk summa på hela cirkulärkodserien. Denna implementering producerar två funktionsobjekt delatillstånd Det är idiomatiskt i E för att separera inmatning från utgångsläsning från skriv istället för att kombinera dem i ett objekt. Strukturen är densamma som implementeringen av Standardavvikelse E. Elixirprogrammet nedan genererar en anonym funktion med en inbäddad period p som används som perioden för det enkla glidande medlet. Körningsfunktionen läser numerisk ingång och skickar den till den nyupprettade anonyma funktionen och inspekterar därefter resultatet till STDOUT. Utgången visas nedan, med medelvärdet, följt av den grupperade ingången, som ligger till grund för varje rörligt medelvärde. Längre har stängningar men oföränderliga variabler En lösning då jag S att använda processer och ett enkelt meddelande som passerar baserade API. Matrix-språk har rutiner för att beräkna glidningsavvikelserna för en given sekvens av objekt. Det är mindre effektivt att slinga som i följande kommandon. Behörigt uppmanar till en ingång I som läggs till slutet av en lista L1 L1 kan hittas genom att trycka på 2ND 1 och medelvärden finns i List OPS. Press ON för att avsluta programmet. Function som returnerar en lista som innehåller den genomsnittliga data för det medföljande argumentet. Program som returnerar en enkel Värdet vid varje invocation. list är listan som är genomsnittlig p är perioden 5 återvänder den genomsnittliga listan. Exempel 2 Använda programmet movinav2 i, 5 - Initiera glidande medelberäkningen och definiera perioden 5 movinav2 3, xx - nya data i Listvärdet 3 och resultatet lagras på variabel x och visas movinav2 4, xx - nytt datavärde 4 och det nya resultatet lagras på variabel x och visas 4 3 2.Deskription av funktionen movinavg variabel r - Är resultatet den genomsnittliga lis t som kommer att returneras variabel i - är indexvariabeln och den pekar på slutet av dellistan listan är medelvärdesvariabler z - en hjälparvariabel. Funktionen använder variabel i för att bestämma vilka värden av listan som ska beaktas i nästa genomsnittliga beräkning Vid varje iteration pekar variabeln i till det sista värdet i listan som ska användas i medelberäkningen Så vi behöver bara ta reda på vilka som kommer att vara det första värdet i listan Vanligtvis måste vi överväga p Element, så det första elementet kommer att vara det som indexeras av ip 1 Men vid de första iterationerna kommer denna beräkning vanligen att vara negativ, så följande ekvation undviker negativa index max ip 1,1 eller, ordnar ekvationen, max ip, 0 1 Men antalet element på de första iterationerna kommer också att vara mindre, det korrekta värdet blir slutindex - börja index 1 eller ordna ekvationen, i - max ip, 0 1 1 och sedan, i-max ip, 0 Variabel z har det gemensamma värdet max ip, 0 så börjar indexindexet Vara z 1 och numreringarna kommer att vara iz. mid list, z 1, iz kommer att returnera listan över värde som kommer att vara medelvärde summa summan iz ri kommer att genomsnittsa dem och lagra resultatet på lämpligt ställe i resultatlistan. fp1 skapar en partiell applikation som fixar i det här fallet andra och tredje parametrar. En enkel rörlig genomsnittsimplementering i Java. Vid flera tillfällen ville jag beräkna enkla mätvärden i mina Java-applikationer, till exempel antalet träffar per timme eller fel Under en tidsperiod Det är inte särskilt svårt att beräkna enkla mätvärden men det är bara extra arbete och jag vill hellre spendera den tiden på problemområdet. Jag blev förvånad över att inte hitta några allmänt accepterade lösningar för metrics i Java. Jag hittade Metrics men det verkade lite för komplicerat och inte väl dokumenterat - Allt jag verkligen ville var att beräkna ett glidande medelvärde Jag tänkte på problemet lite mer och bestämde mig att det inte var ett svårt problem Här är min lösning. Det här fungerar genom att skapa en rad fönstret uppdateringsfrekvensstorlek, anger en tråd räkningen till nästa index i matrisen på uppdateringsfrekvensen. Räkningen för intervallet är helt enkelt array i-array i 1, vilket är det senaste räkningen minus det äldsta talet i 10 minuter Intervallet är det äldsta talet i 1 exakt 10 minuter gammalt. För att lägga till ett glidande medelvärde till vår kod först behöver vi en räknare med AtomicLong. Denna räknare bör ökas baserat på händelserna du är intresserad av att använda, t. ex. POST-förfrågningar om en REST service. Vi måste tillhandahålla implementeringen med tillgång till räknaren och det uppnås genom GetCount-gränssnittet Här skapar jag ett glidande medelvärde med ett 5 minuters fönster som uppdaterar varje sekund. För att få det aktuella genomsnittet kallar vi bara getAverage method. A key implementation detalj är hur array storleken bestäms genom att dividera fönstret med uppdateringsfrekvensen Så ett stort fönster med en frekvent uppdateringsfrekvens kan konsumera en betydande mängd minne I det här exemplet e-array-storleken är rimlig 300 Om vi ​​skapade ett 24-timmars glidande medelvärde med ett intervall på 1 sekund, skulle storleken vara 86400 En mer rimlig uppdateringsfrekvens under en 24-timmarsperiod kan vara varje 5-minuters arraystorlek på 288. Annan övervägande att välja Fönstret och uppdateringsfrekvensen är fönstret måste delas med frekvensen. Exempelvis är ett 2-minutersfönster med en 6 sekunders uppdateringsfrekvens ok, men en 7 sekunders uppdateringsfrekvens är inte, eftersom den inte delas med 120 En olagligArgumentException kastas om uppdateringsfrekvensen för fönstermodulen är inte noll. Denna implementering kräver en tråd per rörligt medelvärde, vilket inte är mycket effektivt. En bättre lösning skulle vara att dela en tråd över många medelvärden. Uppdatering Jag har uppdaterat koden för att dela en tråd här. s ett initialt tillståndsproblem vi har inte data ännu för hela fönstret Till exempel om du har ett 5 minuters fönster och bara 15 sekunder data Denna implementering returnerar null tills vi har 5 minuters data Ett annat tillvägagångssätt är att uppskatta genomsnittet. Antag att vi har ett räkning på 10 på 30 sekunder, då kan vi uppskatta genomsnittet som 40 på 2 minuter. Men det finns risk för ett signifikant fel genom att extrapolera ofullständiga data. Till exempel om vi hade en brast på 20 Träffar på 2 sekunder, vi d uppskattar 1200 per 2 minuter, vilket med all sannolikhet är långt ifrån.

Comments