2014-06-05 22 views
17

Đây là một thử nghiệm đơn giảnPython: NumPy độ lệch chuẩn lỗi

import numpy as np 
data = np.array([-1,0,1]) 
print data.std() 

>> 0.816496580928 

Tôi không hiểu tại sao kết quả này được tạo ra? Rõ ràng:

((1^0.5 + 1^0.5 + 0^0.5)/(3-1))^0.5 = 1 

và trong MATLAB nó cho tôi std([-1,0,1]) = 1. Bạn có thể giúp tôi hiểu cách numpy.std() hoạt động không?

+7

Chia bởi N-1 cung cấp cho phương sai mẫu, nhưng NumPy tính phương sai dân. –

+6

Giving này một phiếu bầu tán thành vì sự khác biệt giữa dân số và độ lệch chuẩn mẫu ít khi chú ý tới cho đến khi kết quả thất bại để phù hợp - chọn một, và biết lý do tại sao bạn đang sử dụng nó, cả hai sẽ giúp ngăn ngừa vấn đề này và cũng có thể buộc bạn phải hữu ích nghĩ về vấn đề của bạn nhiều hơn một chút. (Tất cả đều nói từ kinh nghiệm khó chịu). – schodge

Trả lời

17

Điểm mấu chốt của vấn đề này là bạn cần chia cho N (3), không phải N-1 (2). Như Iarsmans đã chỉ ra, numpy sẽ sử dụng phương sai dân số, chứ không phải phương sai mẫu.

Vì vậy, câu trả lời thực sự là sqrt(2/3) đó là chính xác rằng: 0.8164965...

Nếu bạn tình cờ được cố gắng để cố tình sử dụng một giá trị khác nhau (so với mặc định là 0) đối với bậc tự do, dùng tham số từ khóa ddof với một giá trị tích cực khác 0:

np.std(data, ddof=1) 

... nhưng làm như vậy đây sẽ giới thiệu lại vấn đề ban đầu của bạn như numPy sẽ chia N - ddof.

+0

xin lỗi, 2 chỉ là lỗi đánh máy. Tôi nghĩ rằng np.std() chỉ là phổ std. Nếu nó là một mẫu std, nó phải là N-1. Có một chức năng cho mẫu std? – MacSanhe

+0

@MacSanhe Ah, sau đó điều đó có ý nghĩa hơn về cách bạn có thể phạm sai lầm đó! – BlackVegetable

+0

@MacSanhe Chỉnh sửa chi tiết để giải quyết mối quan tâm của bạn. – BlackVegetable

3

Điều đáng đọc là trang trợ giúp cho hàm/phương pháp trước khi đề xuất nó không chính xác. Phương thức thực hiện chính xác những gì chuỗi tài liệu nói rằng nó sẽ làm, chia cho 3, bởi vì Theo mặc định ddof là số không.:

In [3]: numpy.std? 

String form: <function std at 0x104222398> 
File:  /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/fromnumeric.py 
Definition: numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False) 
Docstring: 
Compute the standard deviation along the specified axis. 

... 

ddof : int, optional 
    Means Delta Degrees of Freedom. The divisor used in calculations 
    is ``N - ddof``, where ``N`` represents the number of elements. 
    By default `ddof` is zero. 
1

Khi đi vào NumPy từ Matlab, có thể bạn sẽ muốn giữ lại các tài liệu cho cả hai tiện dụng. Chúng tương tự nhau nhưng thường khác nhau về chi tiết nhỏ nhưng quan trọng. Về cơ bản, chúng tính toán độ lệch chuẩn khác nhau. Tôi thực sự khuyên bạn nên kiểm tra tài liệu cho bất kỳ thứ gì bạn sử dụng để tính toán độ lệch chuẩn, cho dù máy tính bỏ túi hay ngôn ngữ lập trình, vì mặc định không được chuẩn hóa (xin lỗi!).

NumPy STD: http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html

Matlab STD: http://www.mathworks.com/help/matlab/ref/std.html

Các tài liệu NumPy cho std là một chút mờ đục, IMHO, đặc biệt là xem xét rằng NumPy tài liệu nói chung là khá rõ ràng. Nếu bạn đọc đủ xa: The average squared deviation is normally calculated as x.sum()/N, where N = len(x). If, however, ddof is specified, the divisor N - ddof is used instead. In standard statistical practice, ddof=1 provides an unbiased estimator of the variance of the infinite population. (Trong tiếng Anh, mặc định là pop std dev, đặt ddof=1 cho mẫu std dev).

OTOH, các tài liệu Matlab làm sáng tỏ sự khác biệt đó là vấp ngã bạn lên:

There are two common textbook definitions for the standard deviation s of a data vector X. [equations omitted] n is the number of elements in the sample. The two forms of the equation differ only in n – 1 versus n in the divisor.

Vì vậy, theo mặc định, Matlab tính toán độ lệch chuẩn mẫu (N-1 trong số chia, vì vậy lớn hơn để bù đắp cho thực tế đây là một mẫu) và Numpy tính toán độ lệch chuẩn dân số (N trong ước số). Bạn sử dụng tham số ddof để chuyển sang tiêu chuẩn mẫu hoặc bất kỳ mẫu số nào khác mà bạn muốn (vượt quá kiến ​​thức thống kê của tôi).

Cuối cùng, nó không giúp đỡ về vấn đề này, nhưng có thể bạn sẽ thấy điều này hữu ích tại một số điểm.http://wiki.scipy.org/NumPy_for_Matlab_Users

+0

Vì tò mò, khi nào tôi cần sử dụng giá trị của 'ddof' sao cho' ddof ∉ {0, 1} '? – PythonNut

+0

Tôi không có ý tưởng, tôi đã chỉ bao giờ sử dụng hai. Có thể là một câu hỏi cho http://stats.stackexchange.com/ – schodge

Các vấn đề liên quan