<p>numpy.cov()和numpy.var()默认偏差不一致(numpy 1.9.2)</p>

创建于 2015-05-04  ·  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是的,“永不打破有效代码”是一个很好的规则。

如果在没有biasddof情况下调用cov ddof ,然后再从不更改行为,怎么办?

所有5条评论

是。 我目前不知道该怎么办。 最好在邮件列表中讨论此问题。

我想建议,这是值得解决的,尽管会很痛苦。

我认为两者的最佳默认值是ddof=0 ,与估算器相比,该值计算描述数据的摘要统计量。

如果有人想要一个无偏估计量,他们应该通过提供ddof=1来要求它。

这意味着更改cov的行为,我猜它的使用量少于var ,所以很好。

第一步,如果没有提供biasddof ,如何向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是的,“永不打破有效代码”是一个很好的规则。

如果在没有biasddof情况下调用cov ddof ,然后再从不更改行为,怎么办?

如果在没有biasddof情况下调用cov ddof ,然后再从不更改行为,怎么办?

这似乎是一件合理的事情。 比弃用cov 。 不得不添加ddof=0/1有点烦人,但是使代码更易于理解,所以我喜欢这个主意。

此页面是否有帮助?
0 / 5 - 0 等级