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
,所以很好。
第一步,如果没有提供bias
或ddof
,如何向cov
添加将来的警告呢?
同时,我可以建议不建议使用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是的,“永不打破有效代码”是一个很好的规则。
如果在没有bias
或ddof
情况下调用cov
ddof
,然后再从不更改行为,怎么办?
如果在没有
bias
或ddof
情况下调用cov
ddof
,然后再从不更改行为,怎么办?
这似乎是一件合理的事情。 比弃用cov
。 不得不添加ddof=0/1
有点烦人,但是使代码更易于理解,所以我喜欢这个主意。
最有用的评论
@rgommers是的,“永不打破有效代码”是一个很好的规则。
如果在没有
bias
或ddof
情况下调用cov
ddof
,然后再从不更改行为,怎么办?