2013-03-10 53 views
35

Tôi đang cố gắng tìm ra cách tính toán hiệp phương sai với hàm cov chức năng Python Numpy. Khi tôi vượt qua hai mảng một chiều, tôi lấy lại một ma trận 2x2 kết quả. Tôi không biết phải làm gì với điều đó. Tôi không giỏi về thống kê, nhưng tôi tin rằng hiệp phương sai trong một tình huống như vậy phải là một con số duy nhất. This là những gì tôi đang tìm kiếm. Tôi đã viết của riêng mình:Tính hiệp phương sai với Python và Numpy

def cov(a, b): 

    if len(a) != len(b): 
     return 

    a_mean = np.mean(a) 
    b_mean = np.mean(b) 

    sum = 0 

    for i in range(0, len(a)): 
     sum += ((a[i] - a_mean) * (b[i] - b_mean)) 

    return sum/(len(a)-1) 

Điều đó có hiệu quả, nhưng tôi thấy phiên bản Numpy hiệu quả hơn nhiều, nếu tôi có thể tìm ra cách sử dụng nó.

Có ai biết cách làm cho hàm cov Numpy hoạt động như chức năng tôi đã viết không?

Cảm ơn,

Dave

+0

nhận xét nhỏ, nhưng bạn có thể tận dụng lợi thế của NumPy để tính tổng: 'sum = ((a - a_mean) * (b - b-mean)). Sum()' – PlasmaBinturong

Trả lời

74

Khi ab là chuỗi 1 chiều, numpy.cov(a,b)[0][1] tương đương với cov(a,b) của bạn.

Mảng 2x2 được trả về bởi np.cov(a,b) có yếu tố bằng

cov(a,a) cov(a,b) 

cov(a,b) cov(b,b) 

(ở đâu, một lần nữa, cov là chức năng bạn đã định nghĩa ở trên.)

+4

Cảm ơn bạn rất nhiều! Tôi ước tài liệu này đã giải thích rõ điều đó. Điều đó hoạt động hoàn hảo. Một khi tôi đã có chức năng làm việc của riêng tôi, tôi nên so sánh kết quả với chức năng numpy.cov và tôi có thể đã tìm ra điều đó. Tôi sẽ bỏ phiếu nếu tôi có thể, nhưng tôi mới và rõ ràng là không thể. – Dave

+2

Không sao cả. Mừng vì tôi có thể giúp. – unutbu

+1

Điều này không chính xác: 'numpy.cov' mặc định để tính toán hiệp phương sai * mẫu *. Câu trả lời tiếp theo giải thích nó. Cụ thể, điều này nên nói 'numpy.cov (a, b, bias = True) [0] [1]' – javadba

9

Nhờ unutbu cho lời giải thích. Theo mặc định, numpy.cov tính toán hiệp phương sai mẫu. Để có được các hiệp phương sai dân bạn có thể chỉ định bình thường cho tổng N mẫu như thế này:

Covariance = numpy.cov(a, b, bias=True)[0][1] 
print(Covariance) 

hay như thế này:

Covariance = numpy.cov(a, b, ddof=0)[0][1] 
print(Covariance) 
+0

** Đây ** là câu trả lời đúng, không phải là câu trả lời - mà bỏ qua 'bias = True' – javadba

+0

Hóa ra câu trả lời được chấp nhận không hoạt động: nhưng nó không bao gồm đề cập đến điều chỉnh thiên vị - được chôn trong OP . Vì vậy, thông tin trả lời này là hữu ích. – javadba