<p>numpy.cov () dan numpy.var () bias default tidak konsisten (numpy 1.9.2)</p>

Dibuat pada 4 Mei 2015  ·  5Komentar  ·  Sumber: numpy/numpy

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.

00 - Bug numpy.lib

Komentar yang paling membantu

@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?

Semua 5 komentar

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 dari var , 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 tanpa bias atau ddof , 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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

keithbriggs picture keithbriggs  ·  3Komentar

perezpaya picture perezpaya  ·  4Komentar

inducer picture inducer  ·  3Komentar

navytux picture navytux  ·  4Komentar

dmvianna picture dmvianna  ·  4Komentar