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


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

. Срок исправления
также называется коррекцией Бесселя.