2010-10-25 2 views
3

Я пытаюсь добавить поддержку сглаживания лапласа в код Naive Bayes от Biopython 1 для моего проекта Bioinformatics.Сглаживание лапласа в Biopython

Я прочитал много документов о алгоритме Наивного Байеса и сглаживании Лапласа, и я думаю, что у меня есть основная идея, но я просто не могу интегрировать это с этим кодом (на самом деле я не вижу, какую часть я добавлю 1-лапласианское число) ,

Я не знаком с Python, и я новичок-кодер. Я ценю, если кто-нибудь, кто знаком с Biopython, может дать мне несколько предложений.

+0

Добавил +1, так как ваш вопрос заставлял меня искать Лапласианское сглаживание. Я подозреваю, что косвенно использовал его в своей первой работе из университета. Я не вижу, как это связано с Наивным Байесом, хотя биоинформатика - это не моя область ... – winwaed

ответ

3

Попробуйте использовать это определение _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(), она не увидит все возможные значения, и таким образом вернет неправильные вероятности ...

Я думаю, вам нужно отслеживать все уникальные значения для каждого измерения (из всего набора данных) и учитывать это во время процесса подсчета.

+0

Большое спасибо! Это очень помогло мне. Хотя вероятности p_conditional отличаются, когда я пробую это с помощью лапласиана и без лапласиана; точность не изменилась. Этого я должен ожидать? – Limin

+0

Все зависит от используемого набора данных. – Amro

+0

Также имейте в виду, что код ожидает, что все значения размеров появятся для каждой метки класса, в противном случае я подозреваю, что результаты были бы неправильными (возможная ошибка, о которой я упомянул в конце). – Amro

Смежные вопросы