如果我有这样的列表:
results=[-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439,
0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097]
我想在Python中计算这个列表的方差,这是与平均值的平方差的平均值。
我怎么能这样做?访问列表中的元素进行计算让我感到困惑,因为我得到了方差。
你可以使用numpy的内置函数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))
这给你28.822364260579157
如果 - 无论出于何种原因 - 您不能使用numpy
和/或您不想使用内置函数,您也可以使用例如“手动”计算它。一个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)
这给你相同的结果。
如果您对标准偏差感兴趣,可以使用numpy.std:
print(np.std(results))
5.36864640860051
@Serge Ballesta explained very well方差n
和n-1
之间的差异。在numpy中,您可以使用选项ddof
轻松设置此参数;它的默认值是0
,所以对于n-1
案例你可以简单地做:
np.var(results, ddof=1)
“手工”解决方案在@Serge Ballesta's answer中给出。
两种方法都产生32.024849178421285
。
您也可以为std
设置参数:
np.std(results, ddof=1)
5.659050201086865
那么,有两种方法来定义方差。你有一个完整集时使用的方差n,以及你有样本时使用的方差n-1。
2的区别在于m = sum(xi) / n
值是实际平均值还是仅仅是平均值的近似值。
例1:你想知道一个班级学生的平均身高及其方差:好的,m = sum(xi) / n
的值是真实的平均值,而Cleb给出的公式是正确的(方差n)。
示例2:您想知道公交车在公交车站经过的平均小时数及其差异。您记下一个月的小时数,并获得30个值。这里的值m = sum(xi) / n
只是实际平均值的近似值,并且随着更多值,该近似值将更准确。在这种情况下,实际方差的最佳近似值是方差n-1
varRes = sum([(xi - m)**2 for xi in results]) / (len(results) -1)
好吧,它与Python无关,但它确实对统计分析有影响,问题是标记为statistics和variance
注意:通常,像numpy这样的统计库使用方差n来表示他们称之为var
或variance
的方差,并使用方差n-1来表示给出标准偏差的函数。
Numpy确实是最优雅,最快捷的方式。
我认为实际的问题是关于如何访问列表的各个元素以自己进行这样的计算,所以下面是一个例子:
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
给你:
numpy variance: 28.8223642606
mean: -3.731599805
my variance1: 28.8223642606
my variance2: 28.8223642606
启动Python 3.4
,标准库附带variance
函数(样本方差或方差n-1)作为statistics
模块的一部分:
from statistics import variance
# data = [-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439, 0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097]
variance(data)
# 32.024849178421285
可以使用pvariance
函数获得总体方差(或方差n):
from statistics import pvariance
# data = [-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439, 0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097]
pvariance(data)
# 28.822364260579157
另请注意,如果您已经知道列表的平均值,则variance
和pvariance
函数采用第二个参数(分别为xbar
和mu
),以便重新计算样本的均值(这是方差计算的一部分)。
启动Python 3.4
,标准库附带variance
函数(样本方差或方差n-1)作为statistics
模块的一部分:
from statistics import variance
# data = [-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439, 0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097]
variance(data)
# 32.024849178421285
可以使用pvariance
函数获得总体方差(或方差n):
from statistics import pvariance
# data = [-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439, 0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097]
pvariance(data)
# 28.822364260579157
另请注意,如果您已经知道列表的平均值,则variance
和pvariance
函数采用第二个参数(分别为xbar
和mu
),以便重新计算样本的均值(这是方差计算的一部分)。
使用python,这里有几种方法:
import statistics as st
n = int(input())
data = list(map(int, input().split()))
variance = st.pvariance(data)
mean = sum(data)/n
variance = sum([((x - mean) ** 2) for x in X]) / n
print("{0:0.1f}".format(variance))
variance
计算样本总体的方差pvariance
计算整个人口的方差