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