Tính toán độ lệch chuẩn mới bằng độ lệch chuẩn cũ sau khi thay đổi tập dữ liệu


16

Tôi có một mảng gồm giá trị thực, có nghĩa là và độ lệch chuẩn . Nếu một phần tử của mảng được thay thế bằng một phần tử khác , thì giá trị trung bình mới sẽ làμ o l d σ o l d x i x jnμotôidσotôidxTôixj

μnew= =μotôid+xj-xTôin

Ưu điểm của phương pháp này là nó đòi hỏi tính toán liên tục bất kể giá trị của . Có cách tiếp cận nào để tính toán bằng cách sử dụng như tính toán của bằng cách sử dụng không?σ n e w σ o l d μ n e w μ o l dnσnewσotôidμnewμotôid


Đây có phải là bài tập về nhà không? Một nhiệm vụ tương tự đã được yêu cầu trong quá trình thống kê toán học của chúng tôi ...
krlmlr

2
@ user946850: Không, đó không phải là bài tập về nhà. Tôi đang tiến hành luận án về Thuật toán tiến hóa . Tôi muốn sử dụng độ lệch chuẩn làm thước đo đa dạng dân số. Chỉ cần tìm kiếm giải pháp hiệu quả hơn.
người dùng

1
SD là căn bậc hai của phương sai, chỉ là giá trị bình phương trung bình (được điều chỉnh bằng bội số trung bình bình phương, mà bạn đã biết cách cập nhật). Do đó, các phương pháp tương tự được sử dụng để tính toán trung bình đang chạy có thể được áp dụng mà không có bất kỳ thay đổi cơ bản nào để tính toán phương sai đang chạy. Trên thực tế, các số liệu thống kê phức tạp hơn nhiều có thể được tính toán trên cơ sở trực tuyến bằng cách sử dụng cùng một ý tưởng: xem các chủ đề tại stats.stackexchange.com/questions/6920stats.stackexchange.com/questions/23481 , ví dụ.
whuber

1
@whuber: Điều này được đề cập trong bài viết trên Wikipedia cho phương sai , nhưng cũng có một lưu ý về việc hủy bỏ thảm khốc (hoặc mất ý nghĩa) có thể xảy ra. Đây có phải là đánh giá quá cao, hoặc một vấn đề thực sự cho phương sai đang chạy?
krlmlr

Đó là một câu hỏi tuyệt vời. Nếu bạn tích lũy các phương sai một cách ngây thơ, mà không tập trung vào chúng trước đó, bạn thực sự có thể gặp rắc rối. Vấn đề xảy ra khi số lượng rất lớn nhưng phương sai của chúng nhỏ. Ví dụ, hãy xem xét một loạt các phép đo chính xác về tốc độ ánh sáng tính bằng m / s, như trong 299792458.145, 299792457.883, 299792457.998, ...: phương sai của chúng, khoảng 0,01, rất nhỏ so với hình vuông của chúng, khoảng , phép tính bất cẩn đó (thậm chí với độ chính xác kép) sẽ dẫn đến phương sai bằng 0: tất cả các chữ số có nghĩa sẽ biến mất. 1017
whuber

Câu trả lời:


7

Một phần trong bài viết Wikipedia về "Thuật toán tính toán phương sai" chỉ ra cách tính phương sai nếu các phần tử được thêm vào các quan sát của bạn. (Nhắc lại rằng độ lệch chuẩn là căn bậc hai của phương sai.) Giả sử rằng bạn nối vào mảng của bạn, sau đóxn+1

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

EDIT : Công thức trên dường như là sai, xem bình luận.

Bây giờ, thay thế một yếu tố có nghĩa là thêm một quan sát và loại bỏ một yếu tố khác; cả hai có thể được tính toán với công thức trên. Tuy nhiên, hãy nhớ rằng các vấn đề về ổn định số có thể xảy ra; bài báo được trích dẫn cũng đề xuất các biến thể ổn định số.

Để tự mình rút ra công thức, hãy tính bằng cách sử dụng định nghĩa phương sai mẫu và thay thế theo công thức bạn đưa ra khi thích hợp . Điều này mang lại cho bạn và do đó, một công thức cho được đưa ra và . Trong ký hiệu của tôi, tôi giả sử bạn thay thế phần tử bằng :μ n e w σ 2 n e w - σ 2 o l d(n1)(σnew2σold2)μnewσnew2σold2 σ o lσnew μσold x n x nμoldxnxn'

σ2= =(n-1)-1Σk(xk-μ)2(n-1)(σnew2-σotôid2)= =Σk= =1n-1((xk-μnew)2-(xk-μotôid)2)+ ((xn'-μnew)2-(xn-μotôid)2)= =Σk= =1n-1((xk-μotôid-n-1(xn'-xn))2-(xk-μotôid)2)+ ((xn'-μotôid-n-1(xn'-xn))2-(xn-μotôid)2)

Các trong tổng biến thành một cái gì đó phụ thuộc của , nhưng bạn sẽ phải làm việc theo phương trình hơn một chút để lấy được một kết quả gọn gàng. Điều này sẽ cung cấp cho bạn ý tưởng chung.μ o l dxkμotôid


công thức đầu tiên bạn đưa ra có vẻ không đúng, điều đó có nghĩa là nếu nhỏ hơn / lớn hơn thì từ cả nghĩa mới và cũ, phương sai luôn tăng, không có nghĩa gì cả. Nó có thể tăng hoặc giảm tùy thuộc vào sự phân phối. xn+1
Emmet B

@EmmetB: Vâng, bạn đúng - đây có thể là Thật không may, điều này làm mất toàn bộ cuộc thảo luận của tôi từ đó, nhưng tôi để nó cho mục đích lịch sử. Hãy thoải mái chỉnh sửa, mặc dù. σnew2= =n-1nσotôid2+1n(xn+1-μnew)(xn+1-μotôid).
krlmlr

4

Dựa trên những gì tôi nghĩ rằng tôi đang đọc trên bài viết Wikipedia được liên kết, bạn có thể duy trì độ lệch chuẩn "đang chạy":

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;
}

Mặc dù trong bài viết họ không duy trì một hoạt động riêng biệt sumcount, nhưng thay vào đó có đĩa đơn mean. Vì trong việc tôi đang làm hôm nay tôi giữ một count(cho mục đích thống kê), sẽ hữu ích hơn khi tính toán phương tiện mỗi lần.


0

Với , và , cũng như sự thay đổi của một phần tử đã cho thành , tôi tin rằng độ lệch chuẩn mới của bạn sẽ là căn bậc hai của trong đó , với biểu thị giá trị trung bình mới. snxnx¯Snxn ss2+1xn'S'

S2+1n-1(2nΔx¯(xn-x¯)+n(n-1)(Δx¯)2),
Δx¯= =x¯'-x¯x¯'

Có lẽ có một cách viết snazzier nó?

Tôi đã kiểm tra điều này với một trường hợp thử nghiệm nhỏ và nó dường như hoạt động.


1
@john / huýt sáo trong bóng tối: Tôi thích câu trả lời của bạn, nó có vẻ hoạt động đúng trong tập dữ liệu nhỏ của tôi. Có bất kỳ nền tảng toán học / tài liệu tham khảo về nó? Bạn có thể vui lòng giúp đỡ?
Alok Chowdhury

Câu hỏi là tất cả @Whistling in the Dark, tôi chỉ cần làm sạch nó cho trang web. Bạn nên đặt ra một câu hỏi mới tham khảo câu hỏi và trả lời ở đây. Và bạn cũng nên nâng cao câu trả lời này nếu bạn cảm thấy như vậy.
Giăng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.