Numpy не дает желаемого значения дисперсии образца - PullRequest
2 голосов
/ 03 апреля 2020

У меня есть список, для которого мне нравится вычислять выборочная дисперсия . Когда я использую 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 - это мое желаемое значение.

Ответы [ 4 ]

3 голосов
/ 03 апреля 2020
2 голосов
/ 03 апреля 2020

Вы можете использовать ddof параметр np.var(), который обозначает «степени свободы»:

np.var(my_ls, ddof=1)
# 23.65555555555555

, чтобы получить желаемый результат.

По сути, вы делите сумму квадратов на n - 1, а np.var() делит на n - ddof, по умолчанию 0. Обсуждение этих тем можно найти в Википедии .

1 голос
/ 03 апреля 2020

ваша функция calc_var(ls) не реализует дисперсию формула :

Дисперсия является средним квадратом отклонений от среднего значения, т. Е. 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
1 голос
/ 03 апреля 2020

Вы используете несмещенную формулу для дисперсии, т.е. вы делите сумматор на N-1, в то время как np.var, кажется, вычисляет нормализацию дисперсии по общему количеству элементов в векторе.

Проверьте, например, здесь , раздел «Выборочная дисперсия».

...