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行目のみを印刷します。
はい。 現時点では、それについて何ができるかわかりません。 この問題は、おそらくメーリングリストで最もよく議論されています。
これは修正する価値があることを提案したいと思います。
両方の最適なデフォルトはddof=0
だと思います。これは、推定量とは対照的に、データを説明する要約統計量を計算します。
代わりに偏りのない推定量が必要な場合は、 ddof=1
提供してそれを求める必要があります。
つまり、 cov
の動作を変更することを意味します。これは、 var
未満で使用されていると思いますので、それは良いことです。
最初のステップとして、 bias
もddof
も提供されていない場合、 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
を追加する必要があるのは少し面倒ですが、コードがわかりやすくなるので、このアイデアが気に入っています。
最も参考になるコメント
@rgommersええ、「有効なコードを壊さない」というのはかなり良いルールです。
bias
またはddof
なしでcov
を呼び出した後、動作を変更しない場合の警告はどうですか?