Friday 28 July 2017

การย้าย ค่าเฉลี่ย อาร์เรย์ Java


การใช้งานง่ายใน Java ในหลาย ๆ ครั้งฉันต้องการคำนวณเมตริกแบบง่ายๆในแอปพลิเคชัน Java ของฉันเช่นจำนวนการเข้าชมต่อชั่วโมงหรือข้อผิดพลาดตลอดช่วงเวลาขณะที่การคำนวณเมตริกแบบง่ายไม่ใช่เรื่องยากมากนักเพียงเท่านี้ ทำงานพิเศษและฉันค่อนข้างใช้เวลาในโดเมนปัญหาที่ฉันรู้สึกประหลาดใจที่ไม่พบโซลูชันที่ยอมรับอย่างกว้างขวางสำหรับตัวชี้วัดใน Java ฉันได้พบ Metrics แต่ดูเหมือนบิตซับซ้อนเกินไปและไม่ดี documented - ทั้งหมดที่ฉันต้องการคือการ คำนวณค่าเฉลี่ยเคลื่อนที่ฉันคิดเกี่ยวกับปัญหาบางอย่างมากขึ้นและตัดสินใจว่าไม่ใช่ปัญหาที่ยากนี่คือโซลูชันของฉันนี่ทำงานได้โดยการสร้างอาร์เรย์ของขนาดความถี่การอัปเดตของหน้าต่างจากนั้นชุดข้อความจะนับเป็นดัชนีถัดไปในอาร์เรย์บน ความถี่การอัพเดตนับเป็นเพียงอาร์เรย์ i - array i 1 ซึ่งนับเป็นจำนวนล่าสุดนับจากจำนวนที่เก่าที่สุดนับเป็นระยะเวลา 10 นาทีจำนวนที่เก่าที่สุด i 1 เท่ากับ 10 นาที old. To เพิ่มการเคลื่อนย้าย ค่าเฉลี่ยของรหัสของเราเป็นอันดับแรกเราจำเป็นต้องมีตัวนับโดยใช้ AtomicLong ตัวนับนี้ควรเพิ่มขึ้นตามเหตุการณ์ที่คุณสนใจในการคำนวณเช่นคำขอ POST สำหรับเซอร์วิส REST เราจำเป็นต้องจัดเตรียมการเข้าถึงโดยใช้เคาน์เตอร์และนั่นคือ ทำได้โดยใช้อินเตอร์เฟซ GetCount นี่ฉันจะสร้างค่าเฉลี่ยเคลื่อนที่โดยใช้หน้าต่าง 5 นาทีที่อัปเดตทุกวินาทีและเพื่อให้ได้ค่าเฉลี่ยในปัจจุบันเราเพียงแค่เรียกเมธอด getAverage รายละเอียดการใช้คีย์หลักคือขนาดของอาร์เรย์จะพิจารณาจากการหารหน้าต่าง ด้วยความถี่ในการอัพเดตดังนั้นหน้าต่างขนาดใหญ่ที่มีความถี่ในการอัพเดตบ่อย ๆ จึงสามารถใช้หน่วยความจำจำนวนมากได้ตัวอย่างเช่นขนาดอาร์เรย์มีความสมเหตุสมผล 300 แต่ถ้าเราสร้างค่าเฉลี่ยเคลื่อนที่ 24 ชั่วโมงโดยใช้ช่วงเวลา 1 วินาทีขนาดจะเท่ากับ 86400 A ความถี่การอัพเดตที่เหมาะสมมากขึ้นสำหรับช่วงเวลา 24 ชั่วโมงอาจเป็นทุกๆ 5 นาทีขนาดอาร์เรย์ของ 288 การพิจารณาการเลือกหน้าต่างและความถี่ในการอัปเดตเป็นหน้าต่างจะต้องเป็น di มองเห็นได้ตามความถี่ตัวอย่างเช่นหน้าต่าง 2 นาทีที่มีความถี่การอัพเดต 6 วินาทีก็ใช้ได้ แต่ความถี่ในการอัพเดตครั้งที่ 7 ไม่ใช่เพราะไม่มีการหารด้วย 120 ข้อผิดพลาด IllegalArgumentException จะถูกโยนออกถ้าความถี่ในการอัปเดตโมดูลโมดูลัสของหน้าต่างไม่เป็นศูนย์ การดำเนินการต้องมีเธรดต่อค่าเฉลี่ยเคลื่อนที่ซึ่งไม่ได้มีประสิทธิภาพมากการแก้ปัญหาที่ดีกว่าคือการแชร์เธรดในหลาย ๆ ครั้งอัพเดตฉันได้อัปเดตโค้ดเพื่อแชร์เธรดที่นี่แล้วมีปัญหาสถานะเริ่มต้นที่เราไม่มีข้อมูล แต่สำหรับหน้าต่างทั้งหมดตัวอย่างเช่นถ้าคุณมีหน้าต่าง 5 นาทีและเพียง 15 วินาทีของข้อมูลการดำเนินการนี้จะส่งกลับค่า null จนกว่าเราจะมีข้อมูล 5 นาทีวิธีอื่นคือการประมาณค่าเฉลี่ยสมมติว่าเรามีจำนวน 10 ใน 30 วินาทีจากนั้น เราสามารถประมาณค่าเฉลี่ยได้ 40 ใน 2 นาทีอย่างไรก็ตามความเสี่ยงของข้อผิดพลาดที่สำคัญคือการคาดการณ์ข้อมูลที่ไม่สมบูรณ์อย่างมากตัวอย่างเช่นถ้าเรามีการระเบิด 20 ครั้งใน 2 วินาทีเราต้องประมาณ 1200 ต่อ 2 นาทีซึ่ง h ในความเป็นไปได้ทั้งหมดเป็นวิธี off. Your ด้านในของคุณคือ iterating อาร์เรย์ทั้งหมดเพื่อให้เป็นเหตุผลที่คุณมักจะได้รับค่าเฉลี่ยเดียวกันสำหรับอาร์เรย์ทั้งคุณควรย้ำจาก 0 เป็นจำนวนปัจจุบันของนอกสำหรับแทนคุณย้าย ค่าเฉลี่ยจะถูกปรับปรุงตามใน j ของภายในของคุณสำหรับว่าหมายความว่าจะแทนที่ค่าก่อนหน้านี้ทุกวงใหม่นี้ควรจะอยู่ภายในภายนอกแทนด้านในใช้ i เป็น index. You จะหาร sum j คำนวณค่าเฉลี่ยทุกใหม่ j วงด้านในคุณจะหารด้วย 0 ผลรวมครั้งแรกที่ผมเชื่อว่าคุณหมายถึงการใช้ j 1 แทนดัชนีไม่ได้เป็นเช่นเดียวกับความยาวปัจจุบันเคล็ดลับในการแก้ไขปัญหาหลีกเลี่ยงการใช้ตัวแปรในวงอาร์เรย์คุณควรใช้แทนสำหรับเรื่องของ ทำซ้ำปัญหาของคุณคุณสามารถให้เราแยกปัญหาแทน ie. Imagine รหัสปัจจุบันของคุณหากข้อผิดพลาดอยู่ในปัจจัยการผลิตของคุณว่าเราอาจเชื่อว่าคุณใช้พวกเขาจริงๆตอบ 4 ตุลาคมที่ 20 54.You จะวนรอบข้อมูลทั้งหมด ทุกครั้งที่คุณควรมีสำหรับ int ji averageLength i - averageLength 2 0 ji averageLength 2 j NumDataPoints j หรือบางอย่างที่คล้ายกันสำหรับค่าเฉลี่ยด้านบนสุดของคุณนอกจากนี้ movingAverage i sum j ควรได้รับการแก้ไขเพื่อจัดการกับกรณีเมื่อ j มีค่าเป็น 0 โดยเฉพาะอย่างยิ่งควรจะเป็น movingAverage i sum averageLength และควรใช้ ไปที่ช่อง movingAverage i ด้านนอก loop. ver เฉลี่ย 4 ตุลาคม 13 ที่ 20 42.Next เวลาใช้ความคิดเห็นเกี่ยวกับงานออกจากคำถามก่อนที่คุณจะโพสต์ แต่เนื่องจากคุณดูเหมือนสวยใหม่ที่นี้คิดเกี่ยวกับวิธีการที่คุณจะไป ผ่านข้อมูลและทำให้มันทำที่คุณควรพยายามที่จะตรวจสอบให้แน่ใจว่าแต่ละวงจะหยุดที่จุดที่ถูกต้องและจำไว้ว่าถ้าคุณจะหยุดเมื่อไม่มีตัวเลขมากขึ้นเช่นเมื่อคุณกำลังทำห่วงด้านในและคุณสามารถเท่านั้น รับ 3 หมายเลขเพิ่มเติมแทน 4 โปรแกรมต้องหยุดเกินไปตรวจสอบให้แน่ใจว่ารหัสของคุณกำลังตรวจสอบสำหรับ this. answered 4 ตุลาคม 13 at 20 56 นอกเหนือจากรายละเอียดเพิ่มเติมใด ๆ คุณอาจต้องมีค่าเฉลี่ยที่ไม่มีการชั่งน้ำหนักที่จุด A ใน input อาร์เรย์ o f ยาว N กับ 0 i N ซึ่งหมายถึงค่าเฉลี่ยของรายการ K ก่อนหน้าของอาร์เรย์ถึงและรวมถึง A i ถ้ามีค่า t aren t K ให้ค่าเฉลี่ย i 1 จาก a ถึง a รวม นิด ๆ หน่อย ๆ ของความคิดจะแสดงให้คุณเห็นว่าคุณ don t ต้องเพิ่มขึ้นทุกค่า K ทุกครั้งเพียงแค่เก็บผลรวมและเมื่อย้ายไปยังจุดถัดไปนี้เป็นค่าเฉลี่ยเคลื่อนที่ลบค่าที่ถูกแทนที่และเพิ่มใหม่ มูลค่าที่จะแทนที่ในช่วงแรก K-1 คะแนนคุณเพียงแค่เพิ่มมูลค่าใหม่เพื่อผลรวมและเพิ่มเคาน์เตอร์ของคุณโดย 1.At จุดใดในกระบวนการนี้ค่าเฉลี่ยเคลื่อนที่เป็นผลรวมปัจจุบันหารด้วยค่านับปัจจุบัน . ตอบ 4 ตุลาคม 13 ที่ 21 05. ในค่าเฉลี่ยเคลื่อนที่คุณต้องมีขนาดหน้าต่างบางขนาดหน้าต่างของคุณมีค่าเฉลี่ยความยาวดังนั้นจึงจะมีลักษณะคล้ายกับนี้สำหรับลูปเริ่มต้นที่ข้อมูลปัจจุบันและย้อนกลับไป averageLength จุดข้อมูลและเพิ่มพวกเขาขึ้นคุณจะมีค่าเฉลี่ยเคลื่อนที่เมื่อคุณมีเมื่อมีเพียงพอ จุดข้อมูลและค่าเฉลี่ยจะเป็นผลรวมหารด้วยความยาวเฉลี่ยหมายเหตุไม่ได้ทดสอบเพียงรหัส sudo แต่นี่คือ idea. answered 4 ตุลาคม 13 ที่ 21 05.Your Answer.2017 Stack Exchange, Inc. I เป็นหลักมีอาร์เรย์ ของค่าเช่นนี้อาร์เรย์ข้างต้นเป็น oversimplified I m เก็บ 1 ค่าต่อมิลลิวินาทีในรหัสจริงของฉันและฉันต้องดำเนินการออกในขั้นตอนฉันเขียนเพื่อหาจุดสูงสุดที่ใกล้เคียงที่สุดก่อนจุดในเวลาตรรกะของฉันล้มเหลวเพราะในของฉัน ตัวอย่างข้างต้น 0 36 เป็นยอดจริง แต่อัลกอริธึมของฉันจะมองย้อนกลับไปและดูจำนวนที่มากที่สุด 0 25 เป็นจุดสูงสุดเนื่องจากมี sa ลดลงเหลือ 0 24 ก่อนหน้านี้เป้าหมายคือการใช้ค่าเหล่านี้และใช้อัลกอริทึมเพื่อ พวกเขาซึ่งจะเรียบพวกเขาออกบิตเพื่อให้ฉันมีค่าเชิงเส้นมากขึ้นเช่นฉันต้องการผลของฉันจะ curvy ไม่ jaggedy. I เคยได้รับการบอกให้ใช้ตัวกรองเฉลี่ยชี้แจงค่าเฉลี่ยกับค่าของฉันฉันจะทำสิ่งนี้ได้จริงๆ ยากสำหรับฉันที่จะอ่านสมการทางคณิตศาสตร์ที่ฉันจัดการดีมากกับรหัสฉันจะดำเนินการ ค่าในอาร์เรย์ของฉันใช้การคำนวณค่าเฉลี่ยเคลื่อนที่ที่อธิบายถึงแม้พวกเขา out. asked 8 ก. พ. 12 ที่ 20 27. เพื่อคำนวณค่าเฉลี่ยเคลื่อนที่ที่ชี้แจงคุณต้องให้รัฐบางรอบและคุณต้องมีพารามิเตอร์การปรับค่านี้เรียกระดับเล็กน้อยสมมติว่า คุณกำลังใช้ Java 5 ขึ้นไปโปรดระบุค่าพารามิเตอร์การสลายตัวที่คุณต้องการโดยการปรับค่าควรอยู่ระหว่าง 0 ถึง 1 และใช้ค่าเฉลี่ยในการกรองเมื่ออ่านหน้าเว็บเกี่ยวกับการกลับเป็นซ้ำคณิตศาสตร์บางสิ่งที่คุณจำเป็นต้องรู้จริงๆเมื่อเปลี่ยนเป็น รหัสคือ mathematicians ต้องการเขียนดัชนีเป็นอาร์เรย์และลำดับกับ subscripts พวกเขา ve notations อื่น ๆ ไม่กี่ที่ดีซึ่ง doesn t ช่วยอย่างไรก็ตาม EMA สวยเรียบง่ายที่คุณจะต้องจำค่าเดิมหนึ่งไม่มีอาร์เรย์รัฐซับซ้อน required. answered 8 กุมภาพันธ์ที่ 20 42 TKKocheran สวยมาก Isn t มันดีเมื่อสิ่งที่สามารถทำได้ง่ายถ้าเริ่มต้นด้วยลำดับใหม่ได้รับ averager ใหม่โปรดทราบว่าคำไม่กี่คำแรกในลำดับเฉลี่ยจะข้ามไปเล็กน้อยเนื่องจาก แต่คุณจะได้รับค่าเฉลี่ยของค่าเฉลี่ยเคลื่อนที่ด้วยอย่างไรก็ตามข้อได้เปรียบที่ดีคือคุณสามารถตัดค่าเฉลี่ยตรรกะที่เคลื่อนที่ไปเป็นค่าเฉลี่ยและทดสอบได้โดยไม่รบกวนส่วนที่เหลือของโปรแกรมของคุณมากเกินไป Donal Fellows February 9 12 at 0 06.I แต่ฉันจะพยายามตอบคำถามต่อไป 1 ถ้าอัลกอริทึมของคุณพบ 0 25 แทนที่จะเป็น 0 36 แล้วมันก็ไม่ถูกต้องผิดเป็นเพราะสมมติว่ามีการเพิ่มหรือลดลงซึ่งเกิดขึ้นตลอดเวลา มักจะลดลงถ้าคุณต้องการหาค่าสูงสุดระหว่างจุดสองจุดในเวลาจากนั้นให้แบ่งอาร์เรย์จาก tmin ไปเป็น tmax และค้นหา สูงสุดของที่ subarray.2 ขณะนี้แนวคิดของการย้ายเฉลี่ยได้ง่ายมากคิดว่าฉันมีรายการต่อไปนี้ 1 4, 1 5, 1 4, 1 5, 1 5 ฉันสามารถเรียบออกโดยใช้ค่าเฉลี่ยของสองตัวเลข 1 45, 1 45, 1 45, 1 5 ขอให้สังเกตว่าหมายเลขแรกคือค่าเฉลี่ยของ 1 5 a d 1 4 วินาทีและหมายเลขแรกรายการใหม่ที่สองคือค่าเฉลี่ยของ 1 4 และ 1 5 รายการเก่าที่สามและสองรายการที่สามใหม่เฉลี่ยของ 1 5 และ 1 4 4 และ 3 และอื่น ๆ ฉันจะได้ทำมันระยะเวลา สามหรือสี่หรือ n สังเกตว่าข้อมูลเป็นไปอย่างราบรื่นวิธีที่ดีในการดูค่าเฉลี่ยเคลื่อนที่ในที่ทำงานคือไปที่ Google Finance เลือกสต็อกลองใช้ Tesla Motors volatile TSLA ที่สวยและคลิก technicals ที่ด้านล่างของแผนภูมิ Select Moving ค่าเฉลี่ยที่มีช่วงเวลาหนึ่ง ๆ และค่าเฉลี่ยเคลื่อนที่แบบเสวนาเพื่อเปรียบเทียบความแตกต่างของพวกเขาค่าเฉลี่ยเคลื่อนที่ที่เป็นค่าลบเป็นเพียงการอธิบายเพิ่มเติมอีกประการหนึ่งจากข้อมูลนี้ แต่ให้น้ำหนักข้อมูลเก่าน้อยกว่าข้อมูลใหม่นี่เป็นวิธีที่จะทำให้เกิดความเรียบไปทางด้านหลังโปรดอ่านวิกิพีเดีย รายการดังนั้นนี่คือความคิดเห็นมากกว่าคำตอบ แต่กล่องความคิดเห็นเล็ก ๆ น้อย ๆ เป็นเพียงโชคดีเล็ก ๆ ถ้าคุณมีปัญหากับคณิตศาสตร์คุณสามารถไปกับค่าเฉลี่ยเคลื่อนที่แบบง่ายแทนการแทนดังนั้นเอาท์พุทที่คุณได้รับ จะเป็นข้อตกลงสุดท้าย x หาร ed by x Untested pseudocode หมายเหตุว่าคุณจะต้องจัดการกับจุดเริ่มต้นและจุดสิ้นสุดของข้อมูลเนื่องจากคุณสามารถ t เฉลี่ย 5 คำสุดท้ายเมื่อคุณอยู่ในจุดข้อมูลที่ 2 นอกจากนี้ยังมีวิธีที่มีประสิทธิภาพมากขึ้นในการคำนวณการเคลื่อนย้ายนี้ ผลรวมรวมกันโดยเฉลี่ย - เก่าแก่ที่สุดที่ใหม่ที่สุด แต่นี้คือการได้รับแนวคิดของสิ่งที่เกิดขึ้นข้ามตอบแล้วกุมภาพันธ์ 8 12 ที่ 20 41

No comments:

Post a Comment