Tuesday, October 11, 2016

Bewegende Gemiddelde Array Java

Jou innerlike Want iterating al die skikking so dis hoekom jy altyd dieselfde gemiddelde (die een vir die hele skikking) kry, moet jy Itereer van 0 tot die huidige getal van die buitenste vir plaas. Jou bewegende gemiddelde is opgedateer gebaseer op j van jou innerlike vir wat beteken dat dit sal oorheers vorige waardes elke nuwe lus, moet dit wees in die buitenste vir plaas van die innerlike mens met behulp van i as indeks. Jy verdeel som / j tot gemiddeldes, elke nuwe innerlike lus j sal jy deel met 0 die eerste bedrag te bereken. Ek glo dat jy veronderstel is om J1 plaas gebruik, indeks is nie dieselfde as die huidige lengte Wenke op te los: Vermy die gebruik van veranderlikes om lus skikkings, moet jy gebruik array. length plaas. Vir 'n kwessie van reproduseer jou probleem kan jy ons die geïsoleerde probleem in plaas van jou huidige kode gee. naamlik: Stel jou voor dat die fout is in jou insette, hoe kan ons glo jy regtig gebruik hulle geantwoord 4 Oktober 13 aan 20:54 Jy herhaling oor al die data elke keer. Jy moet vir het (Int J (igtaverageLengthi-averageLength / 2: 0) JLT iaverageLength / 2 ampamp jltnumDataPoints j) (of iets soortgelyks) vir jou binneste gemiddelde. Ook, moet movingAverageisum / j aangepas word om die saak te hanteer wanneer j is 0. In die besonder, moet dit waarskynlik wees movingAverageisum / averageLength en dit toegepas moet word om die movingAveragei slot buite die gemiddelde lus. beantwoord 4 Oktober 13 aan 20:42 Volgende keer, neem die kommentaar oor die opdrag buite die kwessie voordat jy dit plaas. Maar aangesien jy mooi nuwe lyk op hierdie, dink oor hoe jy te werk sal gaan deur die data, en maak dit dit te doen. Jy moet probeer om seker te maak elke lus is stop by die korrekte punt, en onthou dat as jy wil ophou wanneer daar geen getalle meer, (soos wanneer jy doen die innerlike lus en jy kan net kry nog 3 nommers in plaas van 4) die program moet ook ophou. Maak seker dat jou kode is kontrole vir hierdie. beantwoord 4 Oktober 13 aan 20:56 sonder enige bykomende inligting wat moontlik deur 'moet jy 'n ongeweegde bewegende gemiddelde. Op enige punt Ai in die insette array 'n lengte N (met 0ltiltN), dis net die gemiddelde van die vorige K inskrywings van die skikking, tot en met Ai. As daar K sulke waardes Arent, dan Gemiddeld (i1) waardes van A0 deur Ai. inklusiewe. 'N bietjie van denke sal jou wys dat jy dit nie nodig het om elke keer optel al K waardes. Hou net die som en toe beweeg na die volgende punt (dit is 'n bewegende gemiddelde), trek die waarde dis vervang en voeg die nuwe waarde wat dit vervang. (Tydens die eerste K-1 punte, sal jy eenvoudig die nuwe waarde toe te voeg tot die som en die verhoging van jou counter deur 1.) Op enige punt in hierdie proses, die bewegende gemiddelde is die huidige bedrag gedeel deur die huidige telling waarde. beantwoord 4 Oktober 13 aan 21:05 In 'n bewegende gemiddelde, moet jy 'n soort van die venster grootte het. Jou venster grootte is averageLength, sodat dit iets sal kyk: Die for-lus begin by die huidige data en gaan terug averageLength datapunte en voeg hulle op. Jy sal net 'n bewegende gemiddelde wanneer jy jy het wanneer jy genoeg data punte en die gemiddelde sal die som gedeel deur die gemiddelde lengte wees. Let wel: Nie getoets net sudo-kode, maar dit is die idee. beantwoord 4 Oktober 13 aan 21:05 Jou Antwoord 2016 stapel Exchange, Incjas. statistics. functions Klas MovingAverageArrayFunction Hierdie klas bere die gemiddeld van die laaste gegewe aantal waardes in 'n skikking geneem uit 'n data bron. Die gemiddelde funksie terugkeer altyd 'n dubbel waarde, dus is dit implemente die IDoubleSource koppelvlak en die standaard IDoubleSource een. Beskrywing: Java agent-gebaseerde simulasie biblioteek Kopiereg (C) 2002 Michele Sonnessa Hierdie biblioteek is gratis sagteware wat jy kan dit herversprei en / of dit te verander onder die voorwaardes van die GNU Lesser General Public License, soos gepubliseer deur die Free Software Foundation óf weergawe 2.1 van die lisensie, of (as jy wil) enige latere weergawe. Hierdie biblioteek is versprei in die hoop dat dit nuttig sal wees, maar SONDER ENIGE WAARBORG sonder selfs die geïmpliseerde waarborg van VERHANDELBAARHEID of GESKIKTHEID VIR 'N SPESIFIEKE DOEL. Sien die GNU Lesser General Public License vir meer besonderhede. Jy moet 'n afskrif van die GNU Lesser General Public License ontvang het saam met hierdie biblioteek indien nie, skryf aan die Stigting vir Vrye Sagteware, Inc. 59 Tempel Place, Suite 330, Boston, MA 02111-1307, USA. Author: Michele SonnessaA Eenvoudige bewegende gemiddelde Implementering in Java Op verskeie geleenthede Ive wou eenvoudig statistieke te bereken in my Java programme, byvoorbeeld die aantal hits per uur, of foute dwarsdeur 'n tydperk. Terwyl die berekening van eenvoudige statistieke is nie vreeslik moeilik, dit is net ekstra werk en Id eerder daardie tyd op die probleem domein spandeer. Ek was verbaas om enige algemeen aanvaar oplossings vir statistieke in Java vind nie. Ek het vind Statistieke maar dit was 'n bietjie te ingewikkeld en nie goed gedokumenteer - Al wat ek regtig wou hê, was om 'n bewegende gemiddelde bereken. Ek het gedink oor die probleem nog meer en besluit dit is nie 'n moeilike probleem. Hier is my oplossing Dit werk deur die skep van 'n verskeidenheid van die venster / update frekwensie grootte, dan 'n draad sit die telling na die volgende indeks in die skikking op die update frekwensie. Die telling vir die interval is eenvoudig arrayi - arrayi1, wat is die mees onlangse telling minus die oudste telling. Vir 'n 10 minute interval, die oudste telling (i1) is presies 10 minute oud. Om 'n bewegende gemiddelde om ons kode voeg eerste goed moet 'n toonbank, met behulp van AtomicLong. Dit toonbank moet geïnkrementeer gebaseer op die gebeure julle belangstel in berekening (bv POST versoeke vir 'n rus diens). Ons moet die implementering met toegang tot die toonbank gee en wat tot stand gebring deur die GetCount koppelvlak. Hier Siek skep 'n bewegende gemiddelde met 'n 5 minute venster wat elke tweede updates. En om die huidige gemiddelde ons net noem die getAverage metode te kry: 'n sleutel implementering besonderhede is hoe die skikking grootte word bepaal: deur die venster te deel deur die update frekwensie. So 'n groot venster met 'n gereelde update frekwensie kan 'n beduidende hoeveelheid geheue verbruik. In hierdie voorbeeld die skikking grootte redelik 300. Maar as ons 'n 24 uur bewegende gemiddelde geskep met 'n 1 sekonde interval die grootte sou verskeidenheid grootte van 288 wees 86.400 'n meer redelike update frekwensie vir 'n tydperk van 24 uur mag wees elke 5 minute ( ). Nog 'n oorweging van die keuse van die venster en update frekwensie is die venster moet deelbaar wees deur die frekwensie. Byvoorbeeld 'n 2 minute venster met 'n tweede werk frekwensie 6 is ok, maar 'n 7 tweede update frekwensie is nie, aangesien sy nie deelbaar is deur 120 N IllegalArgumentException gegooi indien die venster modulus update frekwensie is nie nul. Dit implementering vereis een draad per bewegende gemiddelde, wat nie baie doeltreffend nie. 'N beter oplossing sou wees om 'n draad oor baie gemiddeldes deel. Opdateer . Ive opgedateer die kode om 'n draad hier te deel. Laastens, Theres 'n aanvanklike toestand probleem: ons moenie data het nog vir die hele venster. Byvoorbeeld, as jy het 'n 5 minute venster en net 15 sekondes van data. Dit implementering terugkeer nul tot ons het 5 minute van data. 'N Ander benadering is om die gemiddelde te bepaal. Gestel ons het 'n telling van 10 in 30 sekondes, dan kan ons die gemiddelde skat as 40 in 2 minute. Daar is egter 'n risiko van wesenlike fout deur ekstrapolering onvolledige data. Byvoorbeeld, as ons 'n sarsie van 20 treffers gehad in 2 sekondes, wed wees beraming 1200 per 2 minute, wat in alle waarskynlikheid is weg off. Moving Gemiddeld - MA afbreek bewegende gemiddelde - MA As SMA voorbeeld, kyk na 'n sekuriteit met die volgende sluitingsdatum pryse meer as 15 dae: Week 1 (5 dae) 20, 22, 24, 25, 23 Week 2 (5 dae) 26, 28, 26, 29, 27 Week 3 (5 dae) 28, 30, 27, 29, 28 A 10-dag MA sou gemiddeld uit die sluitingsdatum pryse vir die eerste 10 dae as die eerste data punt. Die volgende data punt sal daal die vroegste prys, voeg die prys op dag 11 en neem die gemiddelde, en so aan, soos hieronder getoon. Soos voorheen verduidelik, MA lag huidige prys aksie omdat dit gebaseer is op vorige pryse hoe langer die tydperk vir die MA, hoe groter is die lag. So sal 'n 200-dag MA 'n veel groter mate van lag as 'n 20-dag MA het omdat dit pryse vir die afgelope 200 dae bevat. Die lengte van die MA om te gebruik, hang af van die handel doelwitte, met korter MA gebruik vir 'n kort termyn handel en langer termyn MA meer geskik vir 'n lang termyn beleggers. Die 200-dag MA word wyd gevolg deur beleggers en handelaars, met onderbrekings bo en onder hierdie bewegende gemiddelde beskou as belangrike handel seine wees. MA ook mee belangrik handel seine op hul eie, of wanneer twee gemiddeldes kruis. 'N stygende MA dui daarop dat die sekuriteit is in 'n uptrend. terwyl 'n dalende MA dui daarop dat dit in 'n verslechtering neiging. Net so, is opwaartse momentum bevestig met 'n lomp crossover. wat gebeur wanneer 'n korttermyn-MA kruisies bo 'n langer termyn MA. Afwaartse momentum bevestig met 'n lomp crossover, wat plaasvind wanneer 'n kort termyn MA kruisies onder 'n langer termyn MA. Java bewegende gemiddelde Metode As jy op soek is na 'n EMO wat is geskik vir streaming data, afkomstig van 'n lêer of vermelding diens die volgende voorbeeld klas sal jy fyn doen, in teenstelling met die gebruik van brute krag berekeninge. Hierdie benadering is veral nuttig as jy die verwerking van data in real-time. EMAS n spesiale geval van geweegde bewegende gemiddeldes, het die voordeel dat die relatiewe gewigte vir elke daaropvolgende periode verminder word deur 'n konstante faktor F 2 / (N1), waar n die aantal periodes waaroor die EMO is toegepas moet word. Gegewe dat jy die huidige EMO kan bereken (dit wil sê vir die huidige tydperk) met behulp van die volgende iteratiewe formule: Eman fprice (1-F) Eman-1 Die volgende voorbeeld klas implemente hierdie iteratiewe aard van EMO en verminder die computational vereistes oor brute - krag metodes of post-verwerking metodes. private int numPeriods 0 private int totalPeriods 0 private dubbel runningEMA 0.0 private dubbel faktor 0,0 openbare EMO (int numPeriods) this. numPeriods numPeriods faktor 2.0 / (numPeriods 1.0) / Herstel berekeninge om EMO vir die gegewe tydperk te genereer. / Public void herstel (int numPeriods) / Returns EMO vir die tydperk konstruktor definieer. As verwerk tydperke is minder as die EMO reeks, nul is terug. / Openbare dubbel bereken (dubbel prys) runningEMA factorprice (1-faktor) runningEMA as (totalPeriods Dit numPeriods) Van waar jy die prys data en wat jy doen met die EMO resultate is aan jou bron. Byvoorbeeld, as jy die prys data het in 'n skikking en wil 'n EMO in 'n ander reeks te bereken, sal die volgende uit te werk: dubbel pryse. afkomstig van berekeninge, lêer, of vermelding diens dubbel ema nuwe doubleprices. length EMO EMO nuwe EMO (50) // 50 tydperk EMO vir (int idx0 iltprices. length idx) emaidx ema (pricesidx) Sterkte en beste wense vir jou projek .


No comments:

Post a Comment