2016-02-23 15 views
7

Nếu tôi có một danh sách như thế này:Làm cách nào để tính toán phương sai của danh sách trong python?

results=[-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439, 
      0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097] 

tôi muốn để tính toán phương sai của danh sách này bằng Python đó là mức trung bình của sự khác biệt bình phương từ giá trị trung bình.

Tôi làm cách nào để thực hiện việc này? Việc truy cập các phần tử trong danh sách để thực hiện các tính toán là làm tôi bối rối khi nhận được sự khác biệt về hình vuông.

+0

Bạn làm chỉ vậy thôi. Có chuyện gì vậy? –

+0

@Vincent truy cập vào các yếu tố trong danh sách để có được sự khác biệt bình phương – minks

+0

bạn đã thử gì? – martijnn2008

Trả lời

21

Bạn có thể sử dụng NumPy được xây dựng-in chức năng var:

import numpy as np 

results = [-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439, 
      0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097] 

print(np.var(results)) 

này mang đến cho bạn 28.822364260579157

Nếu - vì lý do gì - bạn không thể sử dụng numpy và/hoặc bạn không muốn sử dụng một tích hợp chức năng cho nó, bạn cũng có thể tính toán nó "bằng tay" bằng cách sử dụng ví dụ a list comprehension:

# calculate mean 
m = sum(results)/len(results) 

# calculate variance using a list comprehension 
var_res = sum([(xi - m) ** 2 for xi in results])/len(results) 

cung cấp cho bạn kết quả giống nhau.

EDIT

@Serge Ballesta explained very well sự khác biệt giữa đúng và nn-1. Trong numpy bạn có thể dễ dàng thiết lập tham số này bằng cách sử dụng tùy chọn ddof; mặc định của nó là 0, vì vậy đối với trường hợp n-1 bạn chỉ có thể làm:

np.var(results, ddof=1) 

Các "bằng tay" giải pháp sẽ là:

sum([(xi - m) ** 2 for xi in results])/(len(results) - 1) 

Cả hai phương pháp cung cấp cho bạn 32.024849178421285.

4

Vâng, có hai cách để xác định phương sai. Bạn có phương sai n mà bạn sử dụng khi bạn có tập hợp đầy đủ và phương sai n-1 mà bạn sử dụng khi bạn có mẫu.

Sự khác biệt giữa 2 là liệu giá trị m = sum(xi)/n có phải là giá trị trung bình thực hay cho dù đó chỉ là mức xấp xỉ của mức trung bình.

Ví dụ1: bạn muốn biết chiều cao trung bình của học sinh trong lớp và phương sai: ok, giá trị m = sum(xi)/n là trung bình thực và các công thức do Cleb đưa ra là ok (phương sai n).

Ví dụ2: bạn muốn biết giờ trung bình mà tại đó xe buýt đi tại điểm dừng xe buýt và phương sai của nó. Bạn lưu ý giờ trong một tháng và nhận được 30 giá trị. Ở đây, giá trị m = sum(xi)/n chỉ là giá trị gần đúng của mức trung bình thực và xấp xỉ đó sẽ chính xác hơn với nhiều giá trị hơn.Trong trường hợp đó xấp xỉ tốt nhất cho phương sai thực tế là phương sai n-1

varRes = sum([(xi - m)**2 for xi in results])/(len(results) -1) 

Ok, nó không có gì để làm với Python, nhưng nó có ảnh hưởng đến phân tích thống kê, và câu hỏi được gắn thẻ

Lưu ý: thông thường, thư viện thống kê như numPy sử dụng phương sai n cho những gì họ gọi var hoặc variance, và phương sai n-1 cho chức năng cung cấp cho các deviati tiêu chuẩn trên.

1

Numpy thực sự là cách thanh lịch và nhanh nhất để thực hiện.

Tôi nghĩ câu hỏi thực tế là về làm thế nào để truy cập vào các yếu tố riêng lẻ của một danh sách việc cần làm như vậy một tính toán chính mình, vì vậy dưới đây một ví dụ:

results=[-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439, 
     0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097] 

import numpy as np 
print 'numpy variance: ', np.var(results) 


# without numpy by hand 

# there are two ways of calculating the variance 
# - 1. direct as central 2nd order moment (https://en.wikipedia.org/wiki/Moment_(mathematics))divided by the length of the vector 
# - 2. "mean of square minus square of mean" (see https://en.wikipedia.org/wiki/Variance) 

# calculate mean 
n= len(results) 
sum=0 
for i in range(n): 
    sum = sum+ results[i] 


mean=sum/n 
print 'mean: ', mean 

# calculate the central moment 
sum2=0 
for i in range(n): 
    sum2=sum2+ (results[i]-mean)**2 

myvar1=sum2/n 
print "my variance1: ", myvar1 

# calculate the mean of square minus square of mean 
sum3=0 
for i in range(n): 
    sum3=sum3+ results[i]**2 

myvar2 = sum3/n - mean**2 
print "my variance2: ", myvar2 

mang đến cho bạn:

numpy variance: 28.8223642606 
mean: -3.731599805 
my variance1: 28.8223642606 
my variance2: 28.8223642606 
Các vấn đề liên quan