Лаплацкий сглаживание в биопатон
-
25-09-2019 - |
Вопрос
Я пытаюсь добавить лаплаксианскую сглаживание поддержки на наивную байес биопатона 1 Для моего биоинформатического проекта.
Я прочитал много документов о Naive Bayes алгоритма и лапласианского сглаживания, и я думаю, что получил основную идею, но я просто не могу интегрировать это с этим кодом (на самом деле я не могу видеть, какую часть я добавлю 1 -LAPLACIAN номер).
Я не знаком с Python, и я новичок. Я ценю, если кто-то знаком с биопатоном, может дать мне несколько предложений.
Решение
Попробуйте использовать это определение _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()
Функция называется, она не увидит все возможные значения, и, таким образом, вернет неправильные вероятности ...
Я думаю, вам нужно отслеживать все уникальные значения для каждого измерения (от всего набора данных) и принять это во внимание во время процесса подсчета.