Python: ошибка стандартного отклонения Nump
Это простой тест
import numpy as np
data = np.array([-1,0,1])
print data.std()
>> 0.816496580928
Я не понимаю, как этот результат был сгенерирован? Очевидно:
( (1^0.5 + 1^0.5 + 0^0.5)/(3-1) )^0.5 = 1
и в matlab это дает мне std([-1,0,1]) = 1
. Не могли бы вы помочь мне понять, как работает numpy.std()
?
Ответы
Ответ 1
Суть этой проблемы в том, что вам нужно разделить на N
(3), а не N-1
(2). Как указал Айрсманс, numpy будет использовать дисперсию совокупности, а не дисперсию выборки.
Итак, реальный ответ sqrt(2/3)
, который является именно тем: 0.8164965...
Если вы пытаетесь сознательно использовать другое значение (чем значение по умолчанию 0) для степеней свободы, используйте аргумент ключевого слова ddof
с положительным значением, отличным от 0:
np.std(data, ddof=1)
... но при этом здесь будет возвращена ваша оригинальная проблема, так как numpy будет делить на N - ddof
.
Ответ 2
Стоит прочитать справочную страницу для функции/метода, прежде чем предположить, что она неверна. Метод делает именно то, что говорит doc-строка, которое он должен делать, делит на 3, потому что По умолчанию ddof
равен нулю.:
In [3]: numpy.std?
String form: <function std at 0x104222398>
File: /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/fromnumeric.py
Definition: numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)
Docstring:
Compute the standard deviation along the specified axis.
...
ddof : int, optional
Means Delta Degrees of Freedom. The divisor used in calculations
is ``N - ddof``, where ``N`` represents the number of elements.
By default `ddof` is zero.
Ответ 3
При входе в NumPy из Matlab вы, вероятно, захотите сохранить документы для обоих. Они похожи, но часто отличаются небольшими, но важными деталями. В принципе, они вычисляют стандартное отклонение по-разному. Я настоятельно рекомендую проверять документацию на все, что вы используете, что вычисляет стандартное отклонение, будь то карманный калькулятор или язык программирования, поскольку стандартная стандартная стандартная версия (извините!).
Numpy STD: http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html
Matlab STD: http://www.mathworks.com/help/matlab/ref/std.html
Документы Numpy для std
немного непрозрачны, ИМХО, особенно учитывая, что документы NumPy в целом довольно ясны. Если вы читаете достаточно далеко: The average squared deviation is normally calculated as x.sum() / N, where N = len(x). If, however, ddof is specified, the divisor N - ddof is used instead. In standard statistical practice, ddof=1 provides an unbiased estimator of the variance of the infinite population.
(по-английски по умолчанию используется std dev, установите ddof=1
для образца std dev).
OTOH, в документах Matlab четко указано, что вы можете отключить:
There are two common textbook definitions for the standard deviation s of a data vector X. [equations omitted] n is the number of elements in the sample. The two forms of the equation differ only in n – 1 versus n in the divisor.
Итак, по умолчанию Matlab вычисляет стандартное отклонение выборки (N-1 в делителе, настолько большее, чтобы компенсировать тот факт, что это образец), а Numpy вычисляет стандартное отклонение населения (N в дивизоре). Вы используете параметр ddof
для перехода к стандартному образцу или любому другому знаменателю, который вы хотите (что выходит за рамки моих знаний о статистике).
Наконец, это не поможет в этой проблеме, но вы, вероятно, найдете ее в какой-то момент. http://wiki.scipy.org/NumPy_for_Matlab_Users