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

64

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

в matlab

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

в numpy

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

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

Теги:
numpy
standard-deviation

3 ответа

103
Лучший ответ

Функция 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 дает дальнейшие математические подробности.

  • 3
    Я добавлю, что в Matlab std([1 3 4 6],1) эквивалентен np.std([1,3,4,6]) по умолчанию np.std([1,3,4,6]) . Все это довольно четко объяснено в документации для Matlab и NumPy, поэтому я настоятельно рекомендую, чтобы OP обязательно прочитал их в будущем.
  • 0
    В какой-то момент этот стандарт изменился: np.std () = np.std (ddof = 1), хотя в документации сказано, что по умолчанию np.std () должен иметь значение ddof = 0 ...
47

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

Изображение 6284

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

Изображение 6285

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

Изображение 6288

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

Изображение 6289

которая сходится к Изображение 6290. Поправочный член Изображение 6291 также называется коррекцией Бесселя.

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

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

  • 2
    В формуле для исправленной оценки коэффициент n (в пределах суммы) не должен присутствовать.
  • 2
    Интуиция за n-1 слагаемым в дисперсии: вы уже использовали свои выборки для оценки среднего значения, которое вы будете использовать для аппроксимации дисперсии. Это вводит корреляцию и, следовательно, ddof должно быть 1.
Показать ещё 1 комментарий
1

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню