<p>Смещение по умолчанию numpy.cov () и numpy.var () несовместимо (numpy 1.9.2)</p>

Созданный на 4 мая 2015  ·  5Комментарии  ·  Источник: numpy/numpy

cov () по умолчанию использует смещение 1.
var () по умолчанию использует смещение 0.

Такой, что

import numpy as np

x = np.random.rand(100)

if np.isclose(np.cov([x,x])[0,0], np.var(x)):
    print("Consistent by default.")

if np.isclose(np.cov([x,x],ddof=0)[0,0], np.var(x,ddof=0))
    print("Consistent.")

напечатает только вторую строку.

00 - Bug numpy.lib

Самый полезный комментарий

@rgommers Да, «никогда не

Как насчет предупреждения, если вы вызываете cov без bias или ddof , а затем никогда не меняете поведение?

Все 5 Комментарий

Да. Я не знаю, что мы можем с этим поделать на данный момент. Этот вопрос, вероятно, лучше всего обсудить в списке рассылки.

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

Я думаю, что лучшим вариантом по умолчанию для обоих является ddof=0 , который вычисляет сводную статистику, описывающую данные, в отличие от оценщика.

Если кто-то хочет получить объективную оценку, он должен попросить об этом, указав ddof=1 .

Это означает изменение поведения cov , которое, я думаю, используется меньше, чем var , так что это хорошо.

В качестве первого шага, как насчет добавления будущего предупреждения к cov если не bias ни ddof ?

В то же время могу я предложить отказаться от поддержки bias ? Концепция смещения применима только в том случае, если мы думаем о дисперсии и ковариации как о оценках. Но опять же, я думаю, что по умолчанию лучше всего рассматривать эти функции как описательную статистику, если нам не указано иное.

Говоря то же самое по-другому, если мне нужна простая описательная статистика, странно просить предвзятую оценку.

... из cov , который, я думаю, используется меньше var , так что это хорошо.

Кажется, это правда (сводные данные об использовании отсюда ):

def cov(
    m: object,
    y: object = ...,
    rowvar: Union[float, bool, int] = ...,
    bias: Union[float, int, bool] = ...,
    aweights: numpy.ndarray = ...,
):
    """
    usage.dask: 11
    usage.matplotlib: 3
    usage.pandas: 7
    usage.scipy: 21
    usage.sklearn: 24
    """

def var(
    a: object,
    axis: Union[int, None, Tuple[Union[int, None], ...]] = ...,
    out: Union[dask.dataframe.core.Scalar, dask.dataframe.core.Series] = ...,
    keepdims: bool = ...,
    dtype: Union[Literal["i8", "f8"], Type[float], None] = ...,
    ddof: int = ...,
):
    """
    usage.dask: 59
    usage.pandas: 13
    usage.scipy: 19
    usage.sklearn: 55
    usage.xarray: 31
    """

Это означает изменение поведения cov

К сожалению, я не думаю, что мы сможем это сделать. Мы могли бы отказаться от этой функции и добавить новую (что было бы болезненно), но мы определенно не должны изменять поведение текущей функции - это незаметно изменит числовые результаты и сделает текущий действующий код неправильным. Мы стараемся никогда этого не делать; FutureWarning недостаточно, чтобы гарантировать, что люди видят проблему.

@rgommers Да, «никогда не

Как насчет предупреждения, если вы вызываете cov без bias или ddof , а затем никогда не меняете поведение?

Как насчет предупреждения, если вы вызываете cov без bias или ddof , а затем никогда не меняете поведение?

Это кажется разумным поступком. Лучше, чем отказаться от cov . Необходимость добавить ddof=0/1 немного раздражает, но делает код более понятным, так что идея мне нравится.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги