Почему numpy std() дает другой результат для matlab std()?

Я пытаюсь преобразовать код matlab в numpy и выяснил, что numpy имеет другой результат с помощью std-функции.

в matlab

std([1,3,4,6])
ans =  2.0817

в numpy

np.std([1,3,4,6])
1.8027756377319946

Это нормально? И как мне это сделать?

Ответ 1

Функция NumPy np.std принимает необязательный параметр ddof: "Дельта степеней свободы". По умолчанию это 0. Установите его в 1, чтобы получить результат MATLAB:

>>> np.std([1,3,4,6], ddof=1)
2.0816659994661326

Чтобы добавить немного больше контекста, при вычислении дисперсии (которой стандартное отклонение является квадратным корнем) мы обычно делимся на количество значений, которые у нас есть.

Но если мы выберем случайную выборку элементов N из большего распределения и вычислим дисперсию, деление на N может привести к недооценке фактической дисперсии. Чтобы исправить это, мы можем уменьшить число, которое мы делим на (степени свободы) на число меньше N (обычно N-1). Параметр ddof позволяет нам изменить делитель на указанную сумму.

Если не указано иначе, NumPy будет вычислять смещенную оценку для дисперсии (ddof=0, делясь на N). Это то, что вы хотите, если работаете со всем дистрибутивом (а не подмножеством значений, которые были случайно выбраны из более крупного дистрибутива). Если задан параметр ddof, NumPy вместо этого делит на N - ddof.

Поведение MATLAB std по умолчанию - это исправление смещения для выборочной дисперсии путем деления на N-1. Это избавляет от некоторых (но, вероятно, не всех) смещения в стандартном отклонении. Вероятно, это будет то, что вы хотите, если используете функцию на случайном образце большего размера.

Хороший ответ @hbaderts дает дальнейшие математические подробности.

Ответ 2

Стандартное отклонение - это квадратный корень дисперсии. Дисперсия случайной величины X определяется как

definition of variance

Таким образом, оценка для дисперсии будет

biased estimator

где sample mean обозначает среднее значение выборки. Для случайного выбора xi можно показать, что эта оценка не сходится к вещественной дисперсии, а к

unbiased estimator

Если вы произвольно выбираете выборки и оцениваете среднее значение выборки и дисперсию, вам придется использовать исправленную (объективную) оценку

unbiased estimator

которая сходится к sigma squared. Поправочный член n-1 также называется коррекцией Бесселя.

Теперь по умолчанию MATLABs std вычисляет несмещенную оценку с поправочным членом n-1. Однако NumPy (по объяснению @ajcr) вычисляет смещенную оценку без поправочного условия по умолчанию. Параметр ddof позволяет установить любой корректирующий член n-ddof. Установив его в 1, вы получите тот же результат, что и в MATLAB.

Аналогично, MATLAB позволяет добавить второй параметр w, который определяет "схему взвешивания". Значение по умолчанию w=0 приводит к поправочному члену n-1 (несмещенная оценка), тогда как для w=1 в качестве корректирующего члена (предвзятая оценка) используется только n.

Ответ 3

Для людей, которые не велики со статистикой, упрощенное руководство:

  • Включите ddof=1, если вы вычисляете np.std() для образца, взятого из вашего полного набора данных.

  • Обеспечьте ddof=0, если вы рассчитываете np.std() для всей совокупности

DDOF включен для выборок, чтобы уравновесить смещение, которое может иметь место в числах.