cov () menggunakan bias 1 secara default.
var () menggunakan bias 0 secara default.
Seperti yang
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.")
hanya akan mencetak baris kedua.
Iya. Saya tidak tahu apa yang bisa kita lakukan tentang itu pada saat ini. Masalah ini mungkin paling baik dibahas di milis.
Saya ingin menyarankan bahwa ini layak diperbaiki, meskipun menyakitkan.
Saya pikir default terbaik untuk keduanya adalah ddof=0
, yang menghitung statistik ringkasan yang menjelaskan data, dibandingkan dengan estimator.
Jika seseorang menginginkan penaksir yang tidak bias, mereka harus memintanya dengan memberikan ddof=1
.
Itu berarti mengubah perilaku cov
, yang menurut saya digunakan kurang dari var
, jadi itu bagus.
Sebagai langkah pertama, bagaimana jika menambahkan peringatan masa depan ke cov
jika bias
atau ddof
tidak disediakan?
Pada saat yang sama, dapatkah saya menyarankan untuk menghentikan bias
? Konsep bias hanya berlaku jika kita memikirkan varians dan kovarian sebagai penduga. Tapi sekali lagi, menurut saya default terbaik adalah menganggap fungsi ini sebagai statistik deskriptif kecuali kita diberitahu sebaliknya.
Mengatakan hal yang sama dengan cara berbeda, jika yang saya inginkan adalah statistik deskriptif sederhana, aneh untuk meminta penduga yang bias.
... dari
cov
, yang menurut saya digunakan kurang darivar
, jadi itu bagus.
Itu tampaknya benar (ringkasan data penggunaan dari sini ):
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
"""
Itu berarti mengubah perilaku
cov
Sayangnya saya rasa kita tidak bisa melakukan itu. Kita dapat menghentikan fungsi tersebut dan menambahkan yang baru (yang akan menyakitkan), tetapi kita seharusnya tidak mengubah perilaku fungsi saat ini - yang akan mengubah hasil numerik secara diam-diam dan membuat kode yang valid saat ini salah. Kami berusaha untuk tidak pernah melakukan itu; FutureWarning
tidak cukup untuk menjamin bahwa orang-orang melihat masalah tersebut.
@rgommers Ya, "jangan pernah melanggar kode yang valid" adalah aturan yang cukup bagus.
Bagaimana dengan peringatan jika Anda menelepon cov
tanpa bias
atau ddof
, dan kemudian tidak pernah mengubah perilakunya?
Bagaimana dengan peringatan jika Anda menelepon
cov
tanpabias
atauddof
, dan kemudian tidak pernah mengubah perilakunya?
Sepertinya itu hal yang masuk akal untuk dilakukan. Lebih baik daripada menghentikan cov
. Harus menambahkan ddof=0/1
sedikit mengganggu tetapi membuat kode lebih mudah dimengerti, jadi saya suka idenya.
Komentar yang paling membantu
@rgommers Ya, "jangan pernah melanggar kode yang valid" adalah aturan yang cukup bagus.
Bagaimana dengan peringatan jika Anda menelepon
cov
tanpabias
atauddof
, dan kemudian tidak pernah mengubah perilakunya?