Tại sao numpy std () cho kết quả khác với matlab std ()?


87

Tôi cố gắng chuyển đổi mã matlab thành numpy và phát hiện ra rằng numpy có kết quả khác với hàm std.

trong matlab

std([1,3,4,6])
ans =  2.0817

trong numpy

np.std([1,3,4,6])
1.8027756377319946

Điều này có bình thường không? Và tôi nên xử lý việc này như thế nào?

Câu trả lời:


145

Hàm NumPy np.stdnhận một tham số tùy chọn ddof: "Delta Degrees of Freedom". Theo mặc định, đây là 0. Đặt nó thành 1để nhận kết quả MATLAB:

>>> np.std([1,3,4,6], ddof=1)
2.0816659994661326

Để thêm một chút ngữ cảnh, trong phép tính phương sai (trong đó độ lệch chuẩn là căn bậc hai), chúng ta thường chia cho số giá trị chúng ta có.

Nhưng nếu chúng ta chọn một mẫu ngẫu nhiên của Ncác phần tử từ một phân phối lớn hơn và tính phương sai, phép chia cho Ncó thể dẫn đến đánh giá thấp phương sai thực tế. Để khắc phục điều này, chúng ta có thể hạ thấp số chúng ta chia cho ( bậc tự do ) xuống một số nhỏ hơn N(thông thường N-1). Các ddoftham số cho phép chúng ta thay đổi số chia bởi số lượng chúng tôi chỉ định.

Trừ khi được quy định khác, NumPy sẽ tính toán công cụ ước lượng chệch cho phương sai ( ddof=0, chia cho N). Đây là những gì bạn muốn nếu bạn đang làm việc với toàn bộ phân phối (chứ không phải một tập hợp con các giá trị đã được chọn ngẫu nhiên từ một phân phối lớn hơn). Nếu ddoftham số được đưa ra, N - ddofthay vào đó NumPy sẽ chia cho .

Hành vi mặc định của MATLAB stdlà sửa sai lệch cho phương sai mẫu bằng cách chia cho N-1. Điều này giúp loại bỏ một số (nhưng có lẽ không phải tất cả) sai lệch trong độ lệch chuẩn. Đây có thể là những gì bạn muốn nếu bạn đang sử dụng hàm trên một mẫu ngẫu nhiên của một phân phối lớn hơn.

Câu trả lời hay của @hbaderts cung cấp thêm chi tiết toán học.


4
Tôi sẽ thêm điều đó trong Matlab, std([1 3 4 6],1)tương đương với mặc định của NumPy np.std([1,3,4,6]). Tất cả điều này được giải thích khá rõ ràng trong tài liệu dành cho Matlab và NumPy, vì vậy tôi thực sự khuyên OP nên đọc những tài liệu đó trong tương lai.
horchler

Tại một số điểm tiêu chuẩn này đã thay đổi: np.std () = np.std (ddof = 1), mặc dù các tài liệu nói rằng np.std () nên mặc định ddof = 0 ...
ColinMac

61

Độ lệch chuẩn là căn bậc hai của phương sai. Phương sai của một biến ngẫu nhiên Xđược định nghĩa là

định nghĩa phương sai

Do đó, một công cụ ước tính cho phương sai sẽ là

công cụ ước tính thiên vị

trong đó trung bình mẫubiểu thị giá trị trung bình của mẫu. Đối với được chọn ngẫu nhiên xi, có thể cho thấy rằng công cụ ước tính này không hội tụ đến phương sai thực, nhưng

ước lượng không thiên vị

Nếu bạn chọn ngẫu nhiên các mẫu và ước tính giá trị trung bình và phương sai của mẫu, bạn sẽ phải sử dụng công cụ ước lượng đã hiệu chỉnh (không chệch hướng)

ước lượng không thiên vị

sẽ hội tụ đến sigma bình phương. Thuật ngữ hiệu chỉnh n-1còn được gọi là hiệu chỉnh Bessel.

Bây giờ theo mặc định, MATLABs stdtính toán công cụ ước tính không chệch với thời hạn hiệu chỉnh n-1. Tuy nhiên, NumPy (như @ajcr đã giải thích) tính toán công cụ ước tính chệch không có điều khoản hiệu chỉnh theo mặc định. Tham số ddofcho phép đặt bất kỳ điều khoản hiệu chỉnh nào n-ddof. Bằng cách đặt nó thành 1, bạn sẽ nhận được kết quả tương tự như trong MATLAB.

Tương tự, MATLAB cho phép thêm tham số thứ hai w, tham số này chỉ định "kế hoạch cân". Giá trị mặc định, w=0dẫn đến thuật ngữ hiệu chỉnh n-1(công cụ ước lượng không chệch), trong khi đối với w=1, chỉ n được sử dụng làm thuật ngữ hiệu chỉnh (công cụ ước tính chệch hướng).


2
Trong công thức cho công cụ ước lượng đã hiệu chỉnh, không nên có hệ số n (trong tổng).
Frunobulax 14/02/16

3
Trực giác đằng sau số hạng n-1 trong phương sai: bạn đã sử dụng các mẫu của mình để ước tính giá trị trung bình mà bạn sẽ sử dụng để ước tính phương sai. Điều này tạo ra một mối tương quan và do đó ddof phải là 1.
Matthias

@Frunobulax Tôi đã sửa lỗi đánh máy cho hậu thế. Điều đã xảy ra trong phương trình ban đầu là giới hạn trên của tổng không được hiển thị đúng. Thay vì nở đầu ký hiệu tổng kết, nó đi vào bên trong tổng.
rayryeng

4

Đối với những người không giỏi về thống kê, một hướng dẫn đơn giản là:

  • Bao gồm ddof=1nếu bạn đang tính toán np.std()cho một mẫu được lấy từ tập dữ liệu đầy đủ của bạn.

  • Đảm bảo ddof=0nếu bạn đang tính toán np.std()cho toàn bộ dân số

DDOF được bao gồm cho các mẫu để đối trọng với sự sai lệch có thể xảy ra trong các con số.

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.