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