Numpy 没有产生所需的样本方差值
Numpy not producing desired sample variance value
我有一个列表,我想为其计算 样本方差。当我使用 numpy.var
时,我得到的结果与我定义的函数不同。
有人可以帮助我了解我所缺少的吗?
my_ls = [227, 222, 218, 217, 225, 218, 216, 229, 228, 221]
def calc_mean(ls):
sum_tmp = 0
for i in ls:
sum_tmp = sum_tmp + i
return round(sum_tmp/len(ls), 2)
def calc_var(ls):
tmp_mean = calc_mean(ls)
tmp_sum = 0
for i in ls:
tmp_sum = tmp_sum + ((i - tmp_mean)**2)
return round(tmp_sum/(len(ls)-1), 2)
calc_var(my_ls)
>>> 23.66
np.var(my_ls)
>>> 21.29
23.66 是我想要的值。
您使用方差的无偏公式,即您将总和除以 N-1,而 np.var
似乎计算方差归一化向量中的元素总数。
检查示例 here,部分 "Sample variance"。
可以使用np.var()
的ddof
参数,代表"degrees of freedom":
np.var(my_ls, ddof=1)
# 23.65555555555555
让您获得想要的结果。
本质上,您将平方和除以 n - 1
,而 np.var()
除以 n - ddof
,默认为 0
。
可以在 Wikipedia.
上找到关于这些主题的讨论
你的函数 calc_var(ls)
没有实现方差 formula:
The variance is the average of the squared deviations from the mean,
i.e., var = mean(abs(x - x.mean())**2)
.
您可以使用:
def calc_var(ls):
tmp_mean = calc_mean(ls)
means = []
for i in ls:
means.append((i - tmp_mean)**2)
var = calc_mean(means)
return round(var, 2)
print(calc_var(my_ls))
print(np.var(my_ls))
输出:
21.29
21.29
np.var(my_ls)
情况下的分母默认为总样本量(N)。
您可以使用 numpy
中的 Delta Degrees of Freedom (ddof) 参数来表明您正在计算 样本方差 ,方法是将 ddof = 1
设置为均值自由度。 IE。你的分母现在变成 (N-1)
np.var(my_ls,ddof=1)
>>> 23.66
我有一个列表,我想为其计算 样本方差。当我使用 numpy.var
时,我得到的结果与我定义的函数不同。
有人可以帮助我了解我所缺少的吗?
my_ls = [227, 222, 218, 217, 225, 218, 216, 229, 228, 221]
def calc_mean(ls):
sum_tmp = 0
for i in ls:
sum_tmp = sum_tmp + i
return round(sum_tmp/len(ls), 2)
def calc_var(ls):
tmp_mean = calc_mean(ls)
tmp_sum = 0
for i in ls:
tmp_sum = tmp_sum + ((i - tmp_mean)**2)
return round(tmp_sum/(len(ls)-1), 2)
calc_var(my_ls)
>>> 23.66
np.var(my_ls)
>>> 21.29
23.66 是我想要的值。
您使用方差的无偏公式,即您将总和除以 N-1,而 np.var
似乎计算方差归一化向量中的元素总数。
检查示例 here,部分 "Sample variance"。
可以使用np.var()
的ddof
参数,代表"degrees of freedom":
np.var(my_ls, ddof=1)
# 23.65555555555555
让您获得想要的结果。
本质上,您将平方和除以 n - 1
,而 np.var()
除以 n - ddof
,默认为 0
。
可以在 Wikipedia.
你的函数 calc_var(ls)
没有实现方差 formula:
The variance is the average of the squared deviations from the mean, i.e.,
var = mean(abs(x - x.mean())**2)
.
您可以使用:
def calc_var(ls):
tmp_mean = calc_mean(ls)
means = []
for i in ls:
means.append((i - tmp_mean)**2)
var = calc_mean(means)
return round(var, 2)
print(calc_var(my_ls))
print(np.var(my_ls))
输出:
21.29
21.29
np.var(my_ls)
情况下的分母默认为总样本量(N)。
您可以使用 numpy
中的 Delta Degrees of Freedom (ddof) 参数来表明您正在计算 样本方差 ,方法是将 ddof = 1
设置为均值自由度。 IE。你的分母现在变成 (N-1)
np.var(my_ls,ddof=1)
>>> 23.66