Для одного из моих курсовых проектов я начал внедрять "Наивный байесовский классификатор" в C. Мой проект - реализовать приложение классификатора документов (особенно Spam), используя огромные данные обучения.
Теперь у меня проблема с реализацией алгоритма из-за ограничений в типе C.
(Используется алгоритм, который я использую здесь, http://en.wikipedia.org/wiki/Bayesian_spam_filtering)
ЗАЯВЛЕНИЕ О ПРОБЛЕМЕ: Алгоритм включает в себя принятие каждого слова в документе и вычисление вероятности его спам-слова. Если p1, p2 p3.... pn - вероятности слова-1, 2, 3... n. Вероятность того, что doc является спамом или нет, вычисляется с использованием
Здесь значение вероятности может быть очень легко около 0,01. Поэтому, даже если я использую datatype "double", мой расчет будет идти за броском. Чтобы подтвердить это, я написал пример кода, приведенный ниже.
#define PROBABILITY_OF_UNLIKELY_SPAM_WORD (0.01)
#define PROBABILITY_OF_MOSTLY_SPAM_WORD (0.99)
int main()
{
int index;
long double numerator = 1.0;
long double denom1 = 1.0, denom2 = 1.0;
long double doc_spam_prob;
/* Simulating FEW unlikely spam words */
for(index = 0; index < 162; index++)
{
numerator = numerator*(long double)PROBABILITY_OF_UNLIKELY_SPAM_WORD;
denom2 = denom2*(long double)PROBABILITY_OF_UNLIKELY_SPAM_WORD;
denom1 = denom1*(long double)(1 - PROBABILITY_OF_UNLIKELY_SPAM_WORD);
}
/* Simulating lot of mostly definite spam words */
for (index = 0; index < 1000; index++)
{
numerator = numerator*(long double)PROBABILITY_OF_MOSTLY_SPAM_WORD;
denom2 = denom2*(long double)PROBABILITY_OF_MOSTLY_SPAM_WORD;
denom1 = denom1*(long double)(1- PROBABILITY_OF_MOSTLY_SPAM_WORD);
}
doc_spam_prob= (numerator/(denom1+denom2));
return 0;
}
Я попробовал Float, двойные и даже длинные двойные типы данных, но все еще та же проблема.
Следовательно, скажем, в документе на 100 тыс. слов, который я анализирую, если только 162 слова имеют 1% вероятности спама, а оставшиеся 99838 явно спам-слова, то мое приложение скажет это как не спам-документ из-за ошибки Precision (как числитель легко переходит в ZERO)!!!.
Это первый раз, когда я сталкиваюсь с такой проблемой. Итак, как именно эта проблема должна решаться?