การคำนวณค่าเบี่ยงเบนมาตรฐานใหม่โดยใช้ค่าเบี่ยงเบนมาตรฐานเดิมหลังจากการเปลี่ยนแปลงในชุดข้อมูล


16

ฉันมีอาร์เรย์ของnค่าจริงซึ่งมีค่าเฉลี่ยμoldและส่วนเบี่ยงเบนมาตรฐานσold d หากองค์ประกอบของอาร์เรย์xiถูกแทนที่ด้วยองค์ประกอบอื่นxjค่าเฉลี่ยใหม่จะเป็น

μnew=μold+xjxin

ข้อดีของวิธีนี้ก็คือจะต้องมีการคำนวณอย่างต่อเนื่องโดยไม่คำนึงถึงความคุ้มค่าของnnจะมีวิธีการใดในการคำนวณσnewใช้σoldเช่นการคำนวณของμnewใช้μold ?


เป็นการบ้านหรือไม่? งานที่คล้ายกันมากถูกถามในหลักสูตรคณิตศาสตร์ของเรา ...
krlmlr

2
@ user946850: ไม่ไม่ใช่การบ้าน ฉันกำลังทำวิทยานิพนธ์ของฉันเกี่ยวกับวิวัฒนาการขั้นตอนวิธี ฉันต้องการใช้ค่าเบี่ยงเบนมาตรฐานเป็นตัวชี้วัดความหลากหลายของประชากร เพียงมองหาโซลูชันที่มีประสิทธิภาพมากขึ้น
ผู้ใช้

1
SD เป็นสแควร์รูทของความแปรปรวนซึ่งเป็นเพียงค่าเฉลี่ยกำลังสอง (ปรับโดยค่าเฉลี่ยกำลังสองหลายค่าซึ่งคุณทราบวิธีอัปเดตแล้ว) ดังนั้นวิธีการเดียวกับที่ใช้ในการคำนวณค่าเฉลี่ยการทำงานสามารถนำไปใช้โดยไม่ต้องมีการเปลี่ยนแปลงขั้นพื้นฐานใด ๆ ในการคำนวณค่าความแปรปรวนการทำงาน ในความเป็นจริงสถิติที่มีความซับซ้อนมากขึ้นสามารถคำนวณบนพื้นฐานออนไลน์โดยใช้ความคิดเดียวกัน: ดูกระทู้ที่stats.stackexchange.com/questions/6920และstats.stackexchange.com/questions/23481ยกตัวอย่างเช่น
whuber

1
@whuber: สิ่งนี้ถูกกล่าวถึงในบทความ Wikipedia สำหรับ Varianceแต่ยังมีบันทึกเกี่ยวกับการยกเลิกหายนะ (หรือการสูญเสียความสำคัญ) ที่อาจเกิดขึ้น นี่เป็นเรื่องที่พูดเกินจริงหรือเป็นปัญหาที่แท้จริงสำหรับความแปรปรวนที่ดำเนินอยู่หรือไม่
krlmlr

นั่นเป็นคำถามที่ดี หากคุณสะสมความแปรปรวนอย่างไร้เดียงสาโดยไม่ต้องทำให้พวกเขาอยู่ตรงกลางก่อนคุณสามารถมีปัญหา ปัญหาเกิดขึ้นเมื่อตัวเลขมีขนาดใหญ่ แต่ความแปรปรวนมีน้อย เช่นพิจารณาชุดการวัดความเร็วแสงที่แม่นยำในหน่วย m / s เช่นเดียวกับใน 299792458.145, 299792457.883, 299792457.998, ... : ความแปรปรวนของพวกมันซึ่งมีค่าประมาณ 0.01 มีค่าน้อยมากเมื่อเทียบกับกำลังสองซึ่งอยู่ที่ประมาณการคำนวณที่ไม่ระมัดระวัง (แม้ในความแม่นยำสองเท่า) จะส่งผลให้เกิดความแปรปรวนเป็นศูนย์: เลขนัยสำคัญทั้งหมดจะหายไป 1017
whuber

คำตอบ:


7

ในบทความวิกิพีเดีย "อัลกอริทึมสำหรับการคำนวณค่าความแปรปรวน"แสดงให้เห็นถึงวิธีการคำนวณค่าความแปรปรวนถ้าองค์ประกอบมีการเพิ่มการสังเกตของคุณ (จำได้ว่าค่าเบี่ยงเบนมาตรฐานคือสแควร์รูทของความแปรปรวน) สมมติว่าคุณผนวกเข้ากับอาร์เรย์ของคุณจากนั้นxn+1

σnew2=σold2+(xn+1μnew)(xn+1μold).

แก้ไข : สูตรข้างต้นดูเหมือนจะผิดโปรดดูความคิดเห็น

ตอนนี้การแทนที่องค์ประกอบหมายถึงการเพิ่มการสังเกตและการลบองค์ประกอบอื่น ทั้งสองสามารถคำนวณด้วยสูตรข้างต้น อย่างไรก็ตามโปรดทราบว่าปัญหาของความมั่นคงเชิงตัวเลขอาจเกิดขึ้นได้ บทความที่ยกมาเสนอยังเสนอตัวแปรที่มีเสถียรภาพตัวเลข

เพื่อให้ได้สูตรด้วยตัวเองคำนวณโดยใช้นิยามของความแปรปรวนและตัวอย่างแทนμ n E Wตามสูตรที่คุณให้ตามความเหมาะสม นี้จะช่วยให้คุณσ 2 n E W - σ 2 o L dในที่สุดและทำให้สูตรสำหรับσ n E Wรับσ o L dและ(n1)(σnew2σold2)μnewσnew2σold2σnewσold d ในสัญกรณ์ของฉันฉันถือว่าคุณแทนที่องค์ประกอบ x nด้วย x n :μoldxnxn

σ2=(n1)1k(xkμ)2(n1)(σnew2σold2)=k=1n1((xkμnew)2(xkμold)2)+ ((xnμnew)2(xnμold)2)=k=1n1((xkμoldn1(xnxn))2(xkμold)2)+ ((xnμoldn1(xnxn))2(xnμold)2)

The xk in the sum transform into something dependent of μold, but you'll have to work the equation a little bit more to derive a neat result. This should give you the general idea.


the first formula you gave does not seem correct, well it means that if the xn+1 is smaller/larger then from both new and old mean, the variance always increases, which does not make any sense. It may increase or decrease depending on the distribution.
Emmet B

@EmmetB: Yes, you're right -- this should probably be σnew2=n1nσold2+1n(xn+1μnew)(xn+1μold). Unfortunately, this renders void my whole discussion from there, but I'm leaving it for historic purposes. Feel free to edit, though.
krlmlr

4

Based on what i think i'm reading on the linked Wikipedia article you can maintain a "running" standard deviation:

real sum = 0;
int count = 0;
real S = 0;
real variance = 0;

real GetRunningStandardDeviation(ref sum, ref count, ref S, x)
{
   real oldMean;

   if (count >= 1)
   {
       real oldMean = sum / count;
       sum = sum + x;
       count = count + 1;
       real newMean = sum / count;

       S = S + (x-oldMean)*(x-newMean)
   }
   else
   {
       sum = x;
       count = 1;
       S = 0;         
   }

   //estimated Variance = (S / (k-1) )
   //estimated Standard Deviation = sqrt(variance)
   if (count > 1)
      return sqrt(S / (count-1) );
   else
      return 0;
}

Although in the article they don't maintain a separate running sum and count, but instead have the single mean. Since in thing i'm doing today i keep a count (for statistical purposes), it is more useful to calculate the means each time.


0

Given original x¯, s, and n, as well as the change of a given element xn to xn, I believe your new standard deviation s will be the square root of

s2+1n1(2nΔx¯(xnx¯)+n(n1)(Δx¯)2),
where Δx¯=x¯x¯, with x¯ denoting the new mean.

Maybe there is a snazzier way of writing it?

I checked this against a small test case and it seemed to work.


1
@john / whistling in the Dark: I liked your answer, it seems work properly in my small dataset. Is there any mathematical foundation/reference on it? Could you kindly help?
Alok Chowdhury

The question was all @Whistling in the Dark, I just cleaned it up for the site. You should pose a new question referencing the question and answer here. And also you should upvote this answer if you feel that way.
John
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.