Почему 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 ответа:
функция 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
определяется какпоэтому оценка дисперсии будет
здесь обозначает среднее значение выборки. Для случайно выбранных , можно показать, что эта оценка не сходится к реальной дисперсии, а к
если вы случайно выберите образцы и оценить выборочное среднее и дисперсию, вам придется использовать скорректированную (несмещенную) оценку
который будет сходиться к . Срок исправления также называется коррекцией Бесселя.
теперь по умолчанию, 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 включен для образцов для того чтобы компенсировать смещение которое может произойти в числах.