لابلاسيان تجانس إلى البيوبيثون
-
25-09-2019 - |
سؤال
أحاول إضافة دعم تنعيم لابلاسيان إلى رمز بايز الساذج في Biopython 1 لمشروع المعلومات الحيوية الخاصة بي.
لقد قرأت العديد من المستندات حول خوارزمية بايز الساذجة وتجانس لابلاسيان وأعتقد أنني حصلت على الفكرة الأساسية ، لكنني لا أستطيع دمج هذا مع هذا الرمز (في الواقع لا يمكنني رؤية الجزء الذي سأضيفه رقم 1 -laplacian).
أنا لست على دراية ببيثون وأنا مبرمج مبتدئ. إنني أقدر ما إذا كان أي شخص على دراية بالبيبوثون يمكن أن يعطيني بعض الاقتراحات.
المحلول
حاول استخدام هذا التعريف _contents()
الطريقة بدلاً من ذلك:
def _contents(items, laplace=False):
# count occurrences of values
counts = {}
for item in items:
counts[item] = counts.get(item,0) + 1.0
# normalize
for k in counts:
if laplace:
counts[k] += 1.0
counts[k] /= (len(items)+len(counts))
else:
counts[k] /= len(items)
return counts
ثم قم بتغيير المكالمة Line 194
داخل:
# Estimate P(value|class,dim)
nb.p_conditional[i][j] = _contents(values, True)
استعمال True
لتمكين التنعيم ، و False
لتعطيلها.
فيما يلي مقارنة بين الإخراج مع/بدون تجانس:
# without
>>> carmodel.p_conditional
[[{'Red': 0.40000000000000002, 'Yellow': 0.59999999999999998},
{'SUV': 0.59999999999999998, 'Sports': 0.40000000000000002},
{'Domestic': 0.59999999999999998, 'Imported': 0.40000000000000002}],
[{'Red': 0.59999999999999998, 'Yellow': 0.40000000000000002},
{'SUV': 0.20000000000000001, 'Sports': 0.80000000000000004},
{'Domestic': 0.40000000000000002, 'Imported': 0.59999999999999998}]]
# with
>>> carmodel.p_conditional
[[{'Red': 0.42857142857142855, 'Yellow': 0.5714285714285714},
{'SUV': 0.5714285714285714, 'Sports': 0.42857142857142855},
{'Domestic': 0.5714285714285714, 'Imported': 0.42857142857142855}],
[{'Red': 0.5714285714285714, 'Yellow': 0.42857142857142855},
{'SUV': 0.2857142857142857, 'Sports': 0.7142857142857143},
{'Domestic': 0.42857142857142855, 'Imported': 0.5714285714285714}]]
بصرف النظر عن ما سبق ، أعتقد أنه قد يكون هناك خطأ في الكود:
يقسم الكود الحالات وفقًا لفصلها ، ثم لكل فصل ، وإعطاء كل بُعد ، فإنه يحسب عدد المرات التي تظهر فيها كل من قيم البعد هذه.
المشكلة هي إذا لمجموعة فرعية من الحالات التي تنتمي إلى فئة واحدة ، فمن يحدث عدم ظهور كل قيم البعد في تلك المجموعة الفرعية ، ثم عندما تكون _contents()
تسمى الوظيفة ، ولن ترى جميع القيم الممكنة ، وبالتالي ستعيد الاحتمالات الخاطئة ...
أعتقد أنك بحاجة إلى تتبع جميع القيم الفريدة لكل بُعد (من مجموعة البيانات بأكملها) ، وأخذ ذلك في الاعتبار أثناء عملية العد.