Лапласово сглаживание до биопиона - PullRequest
3 голосов
/ 25 октября 2010

Я пытаюсь добавить поддержку сглаживания Лапласа в наивный байесовский код Biopython 1 для моего проекта по биоинформатике.

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

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

1 Ответ

4 голосов
/ 25 октября 2010

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

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

...