Почему 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

это нормально? И как мне с этим справиться?

3 70

3 ответа:

функция 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 дает дополнительные математические детали.

стандартное отклонение является квадратным корнем дисперсии. Дисперсия случайной величины 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 используется в качестве поправочного члена (смещенная оценка).

для людей, которые не очень хорошо разбираются в статистике, упрощенное руководство:

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

  • обеспечить ddof=0 Если вы вычисляете np.std() для всего населения

DDOF включен для образцов для того чтобы компенсировать смещение которое может произойти в числах.