<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.")

2行目のみを印刷します。

00 - Bug numpy.lib

最も参考になるコメント

@rgommersええ、「有効なコードを壊さない」というのはかなり良いルールです。

biasまたはddofなしでcovを呼び出した後、動作を変更しない場合の警告はどうですか?

全てのコメント5件

はい。 現時点では、それについて何ができるかわかりません。 この問題は、おそらくメーリングリストで最もよく議論されています。

これは修正する価値があることを提案したいと思います。

両方の最適なデフォルトはddof=0だと思います。これは、推定量とは対照的に、データを説明する要約統計量を計算します。

代わりに偏りのない推定量が必要な場合は、 ddof=1提供してそれを求める必要があります。

つまり、 covの動作を変更することを意味します。これは、 var未満で使用されていると思いますので、それは良いことです。

最初のステップとして、 biasddofも提供されていない場合、 bias 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を呼び出した後、動作を変更しない場合の警告はどうですか?

biasまたはddofなしでcovを呼び出した後、動作を変更しない場合の警告はどうですか?

それは合理的なことのように思えます。 cov非推奨にするよりはましです。 ddof=0/1を追加する必要があるのは少し面倒ですが、コードがわかりやすくなるので、このアイデアが気に入っています。

このページは役に立ちましたか?
0 / 5 - 0 評価