يستخدم 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.")
سوف يطبع السطر الثاني فقط.
نعم. لا أعرف ما يمكننا فعله حيال ذلك في هذه المرحلة. من المحتمل أن تكون أفضل مناقشة لهذه المشكلة في القائمة البريدية.
أود أن أقترح أن هذا يستحق الإصلاح ، رغم أنه سيكون مؤلمًا.
أعتقد أن أفضل خيار افتراضي لكليهما هو ddof=0
، والذي يحسب إحصائية موجزة تصف البيانات ، على عكس المقدر.
إذا أراد شخص ما مقدرًا غير متحيز بدلاً من ذلك ، فعليه أن يطلبه من خلال تقديم ddof=1
.
هذا يعني تغيير سلوك cov
، والذي أعتقد أنه يستخدم أقل من var
، لذلك هذا جيد.
كخطوة أولى ، ماذا عن إضافة تحذير مستقبلي إلى cov
إذا لم يتم توفير bias
ولا ddof
؟
في الوقت نفسه ، هل يمكنني اقتراح إيقاف استخدام 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 نعم ، "عدم كسر الشفرة الصالحة" قاعدة جيدة جدًا.
ماذا عن تحذير إذا اتصلت بـ cov
بدون bias
أو ddof
، ثم لم تغير السلوك مطلقًا؟
ماذا عن تحذير إذا اتصلت بـ
cov
بدونbias
أوddof
، ثم لم تغير السلوك مطلقًا؟
هذا يبدو وكأنه شيء معقول القيام به. أفضل من تقليل cov
. يعد الاضطرار إلى إضافة ddof=0/1
مصدر إزعاج بسيط ولكنه يجعل الكود أكثر قابلية للفهم ، لذلك أحببت الفكرة.
التعليق الأكثر فائدة
rgommers نعم ، "عدم كسر الشفرة الصالحة" قاعدة جيدة جدًا.
ماذا عن تحذير إذا اتصلت بـ
cov
بدونbias
أوddof
، ثم لم تغير السلوك مطلقًا؟