علوم وفضاء

histogram_bin_edges: هل ثبات القيم يثبت عدد الفئات؟

حواف fd لنوعين.
فئة مقابل فئتين في مثالنا.

أنشأنا تسع قيم 5 وتسع قيم 6، وحفظناها مرة من int64 ومرة من float64. بقي كل عدد في مكانه، لكن طلب fd أعاد حافتين في الأولى وثلاثًا في الثانية. نتابع الفرق ونقارنه بطلب عدد فئات صريح.

العرض والحواف

عرض FD هو 2×IQR/n^(1/3). للمدخل الصحيح يرفع التنفيذ المقدّر الأقل من 1 إلى 1 قبل حساب العدد. [1] [2]

هنا سنفصل العرض الذي يدخل تقدير العدد عن الفارق بين الحواف التي عادت بالفعل. نخزن الحواف نفسها في سجل تجربتنا، ثم نعد الفترات بينها. لا نحول وصفًا لخطوة داخلية إلى وعد عن كل طلب ومدى محتمل.

لا نستعمل أوزانًا في هذه المقارنة. وسؤالنا عن الطلب الذي نجح وأعاد حواف، وعن متغير النوع الذي بدلناه مع حفظ القيم. ليست التجربة عدًا موزونًا أو حكمًا على شكل توزيع في بيانات واقعية.

القيم والنوع

على NumPy 2.3.5 وCPython 3.12.14، كتبنا values=[5]*9+[6]*9. أنشأنا ai=np.array(values,dtype=np.int64) وaf=np.array(values,dtype=np.float64). تحقق الفحص من تساوي القائمتين عند قراءة الأعداد؛ لم نضف مشاهدة ولم نغير موضعًا.

طلب np.histogram_bin_edges(ai,bins='fd') أعاد [5,6] بالشكل (2,). وطلب الدالة نفسه مع af أعاد [5,5.5,6] بالشكل (3,). كانت الحواف المعادة في الحالتين من float64. نوع الحواف لا يكشف وحده نوع المدخل الذي استُخدم لتقدير عددها.

بين 5 و6 فترة واحدة، وبين 5 و5.5 و6 فترتان. لذلك نعرض عدد الفئات إلى جانب عدد الحواف: 1 مقابل 2 للفئات، و2 مقابل 3 للحواف. لم نحسب هنا عدد مرات وقوع القيم في كل فئة، فلا نرفق مصفوفة عد غير مسجلة.

لا يغير تحويلنا إلى float64 الأعداد الصحيحة الصغيرة التي اخترناها. وفي مرجعنا، الربع الأول يقع في مجموعة الخمسات والربع الثالث في مجموعة الستات؛ فرق الربعين 1. يبقى حجم القائمة 18 في المقارنتين. سنستخدم هذه الحقائق المؤلفة لتفسير العدد بدل الاستناد إلى مثال عددي من الوثائق.

تحكم صريح

طلبنا np.histogram_bin_edges(ai,bins=2)، ثم كررنا الطلب مع af. أعاد كلاهما [5,5.5,6] من float64 وبالشكل (3,). في هذا التحكم لم نطلب اختيار عدد الفئات من FD؛ حددنا العدد اثنين.

كتبنا الحواف المرجعية من مدى قائمتنا: البداية 5 والنهاية 6، والمنتصف 5+(6-5)/2=5.5. شاهدنا أن التحكمين يوافقان هذا المرجع. لذلك لا نفسر اختلاف طلب fd بأنه عجز عن تمثيل 5.5 عند مدخل int64؛ التحكم الصحيح أعادها بالفعل.

الحواف العائدة نتائج حسابية، وليست عناصر أضيفت إلى القائمة الأصلية. عند نقل المقارنة احفظ bins ونوع المدخل مع الحواف. عرض قيم البداية والنهاية وحده يفقد إعدادًا كان حاسمًا في طلبنا الأول.

هذا التحكم مرتبط بالقيم والمدى الافتراضي نفسيهما؛ لا نعمم من نجاحه على مدخل غير منتهٍ أو مدى صريح كسري أو نوع آخر. ولم نقارن ملفات محفوظة أو رسوم مكتبات أخرى.

تحكم bins=2.
الحواف متطابقة في التحكم.

المرجع والشبكة

بنى مرجع Python الربعين بكسور دقيقة: يرتب القيم ويحسب الموضع q×(n-1)، ثم يستوفي خطيًا بين الموضعين المتجاورين عند الحاجة. في قوائمنا المتوازنة المختبرة ظل فرق الربعين مساويًا للفارق gap بين القيمتين.

نصف القائمة base ونصفها base+gap؛ نسبة المدى إلى عرض FD هي n^(1/3)/2. العدد المرجعي أصغر k يحقق (2×k)^3≥n.

للمدى الافتراضي وgap الصحيح، مرجع العدد بعد رفع العرض هو min(k,gap). نحسب الحواف بالكسور base+gap×i/count دون دالة حواف.

في المثال الأساسي، 2^3=8 أصغر من 18، و4^3=64 أكبر منها؛ إذن k=2. ومع gap=1 يصير العدد الصحيح min(2,1)=1. يفسر المرجع الحافتين المسجلتين [5,6] والثلاث المسجلة [5,5.5,6] دون تغيير قيمة من مدخلنا.

اخترنا للشبكة base من -2 و0 و3، وgap من 1 و2، والأطوال الزوجية 10 و12 و16 و24 و32 و48 و64 و96 و128 و250. في كل قائمة نصف القيم عند البداية ونصفها عند النهاية. هذه 3×2×10=60 حالة؛ أضفنا المثال بطول 18 خارجها فصار الإجمالي 61.

لكل حالة ثلاث مجموعات: حواف FD للمدخل int64 أمام المرجع مع الشكل والنوع؛ حواف FD للمدخل float64 أمام مرجعه؛ والتحكمان بعدد فئات صريح أمام حواف المنتصف. مرت 61×3=183 مجموعة. استدعينا الدالة أربع مرات للحالة، بإجمالي 244 نداءً، وقارنا القيم بتسامح مطلق 1e-14.

نجاح الشبكة يخص هذه العائلة المتوازنة ذات فرق ربعين موجب. لم نفحص قائمة فارغة أو فرق ربعين صفريًا أو NaN، أو أوزانًا أو مدى كسريًا صريحًا أو مقدرًا آخر أو أنواع أعداد أخرى. لم نقس أداءً أو تعديلًا في الذاكرة، ولم نشغل إصدارًا أقدم.

المحصلة العملية في سجلنا: القيم المتطابقة لا تكفي وحدها لاسترجاع حواف طلب fd. احتفظ بنوع المدخل وإعداد bins والمدى مع النتيجة، ثم افصل عدد الحواف عن عدد الفترات التي تحددها.

الطلبالحوافالفئات
int64 / fd[5,6]1
float64 / fd[5,5.5,6]2
int64 / bins=2[5,5.5,6]2
float64 / bins=2[5,5.5,6]2

للتوسع: كثافة المدرج ومساحته.

المراجع

  1. NumPy histogram_bin_edges
  2. NumPy 2.3.5 histogram implementation

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.