Правильность вычисления по формуле наивного байесовского классификатора

P(category∣token) = P(token∣category) * P(category) / P(token)
  • P(category∣token) — вероятность что токен принадлежит класса category, именно её нам надо рассчитать;
  • P(token∣category) — вероятность встретить токен среди всех токенов класса category;
  • P(category) - безусловная вероятность встретить токен класса c в корпусе токенов;
  • P(token) - безусловная вероятность встретить токен в корпусе токенов;
P(token∣category) = token(category) / category
  • token(category) - количество вхождений токена во всех документах класса category
  • category - общее количество токенов в документах класса category
P(category) = token(category) / T
  • token(category) - количество токенов в классе category;
  • Т - общее количество токенов в обучающем множестве;
P(token) = token/T
  • token - количество вхождений токена;

  • T (общее количество токенов): 4502
  • token (количество вхождений токена): 1
  • category (общее количество токенов в документах класса category): 1622
  • token(category) (количество токенов в классе category): 1
P(token) = 1 / 4502
P(token) = 0,000222123500666
P(category) = 1622 / 4502
P(category) = 0,360284318081
P(token∣category) = 1 / 1622
P(token∣category) = 0,000616522811344
P(category∣token) = 0,000616522811344 * 0,360284318081 / 0,000222123500666
P(category∣token) = 1

Для одного токена формула на мой взгялд хорошо отработала. Но для нескольких токенов не совсем понятен алгоритм

P(category∣token1,...,tokenN) = P(category) * P(token1,...,tokenN∣category) / P(token1,...,tokenN)

P(category) - всегда будет неизменным

Допустим есть два разных токена с теми же числами

P(category∣token1,...,tokenN) = (1622 / 4502) * (1 / 1622) * (1 / 1622) / ((1 / 4502) * (1 / 4502))
P(category∣token1,...,tokenN) = 0,360284318081 * 0,000616522811344 * 0,000616522811344 / (0,000222123500666 * 0,000222123500666)
P(category∣token1,...,tokenN) = 0,360284318081 * 0,000616522811344 * 0,000616522811344 / (0,000222123500666 * 0,000222123500666)
P(category∣token1,...,tokenN) = 0,360284318081 * 3,80100376907e-07 / 4,93388495481e-08
P(category∣token1,...,tokenN) = 0,360284318081 * 7,70387595958
P(category∣token1,...,tokenN) = 2,77558569668

Из-за отношений произведения P(token1,...,tokenN∣category) и произведения P(token1,...,tokenN) число в ряде случаев будет неуклонно расти, что даст вероятность более нуля. Как в таком случае интерпретировать значение классификатора?

Ссылки


Ответы (1 шт):

Автор решения: Chorkov

Пусть у нас есть:

T = 4502 - число токенов

||D|| - общие число документов, в множестве документов для обучения классификатора.

||C|| - число документов в категории C

||!C|| - число документов в категории "не C", ||D|| == ||C| + ||!C|| (все документы принадлежат какой-то категории.)

a, b - найденные в тестируемом документе токены. Пусть, для каждого токена, в наборе обучения есть по одному документу, и они принадлежат категории C.

p(C|a,b) = ?

p(C) = ||C|| / ||D||
p(a|C) = 1 / ||C||
p(b|C) = 1 / ||C||

p(!C) = ||!C|| / ||D||
p(a|!C) = 0 / ||!C||
p(b|!C) = 0 / ||!C||

Z = p(C)*p(a|C)*p(b|C) + p(!C)*p(a|!C)*p(b|!C) 
  = ||C|| / ||D|| / ||C|| / ||C||
  = 1 / ||D|| /  ||C||

p(C|a,b)  = p(C)*p(a|C)*p(b|C) / Z 
          = ||C|| / ||D|| / ||C|| / ||C||  / ( 1 / ||D|| /  ||C|| )
          = 1.

Собственно если токены появляются только в множестве C - будет получаться строго единица. Если есть два токена: один принадлежит только документам С, другой только "не C" - будет деление 0./0. ...

→ Ссылка