Я пытаюсь преобразовать код matlab в numpy и выяснил, что numpy имеет другой результат с помощью std-функции.
в matlab
std([1,3,4,6])
ans = 2.0817
в numpy
np.std([1,3,4,6])
1.8027756377319946
Это нормально? И как мне это сделать?
Я пытаюсь преобразовать код matlab в numpy и выяснил, что numpy имеет другой результат с помощью std-функции.
в matlab
std([1,3,4,6])
ans = 2.0817
в numpy
np.std([1,3,4,6])
1.8027756377319946
Это нормально? И как мне это сделать?
Функция 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 включен для выборок, чтобы уравновесить смещение, которое может иметь место в числах.