Правильность вычисления по формуле наивного байесовского классификатора
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) число в ряде случаев будет неуклонно расти, что даст вероятность более нуля. Как в таком случае интерпретировать значение классификатора?
Ссылки
- Наивный байесовский классификатор https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%B1%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80
Ответы (1 шт):
Пусть у нас есть:
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. ...