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.")
напечатает только вторую строку.
Да. Я не знаю, что мы можем с этим поделать на данный момент. Этот вопрос, вероятно, лучше всего обсудить в списке рассылки.
Я хотел бы предположить, что это стоит исправить, хотя это будет болезненно.
Я думаю, что лучшим вариантом по умолчанию для обоих является 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
немного раздражает, но делает код более понятным, так что идея мне нравится.
Самый полезный комментарий
@rgommers Да, «никогда не
Как насчет предупреждения, если вы вызываете
cov
безbias
илиddof
, а затем никогда не меняете поведение?