Полиномиальное скользящее окно наивного байесовского классификатора (реализация MOA, weka)

Я сталкиваюсь со следующей проблемой: я пытаюсь реализовать классификатор MNB в скользящем окне. Я реализовал LinkedList размера окна и храню все экземпляры потока, которые должны быть рассмотрены в нем. Когда появляется новый экземпляр, который больше не помещается в окне, первый экземпляр удаляется. Чтобы удалить соответствующее количество слов, я реализовал следующий метод, который в основном такой же, как trainOnInstanceImpl(), moa только в обратном направлении:

private void removeInstance(Instance instToRemove) {

    int classIndex = instToRemove.classIndex();
    int classValue = (int) instToRemove.value(classIndex);

    double w = instToRemove.weight();
    m_probOfClass[classValue] -= w;

    m_classTotals[classValue] -= w * totalSize(instToRemove);
    double total = m_classTotals[classValue];

    for (int i = 0; i < instToRemove.numValues(); i++) {
        int index = instToRemove.index(i); 

        if (index != classIndex && !instToRemove.isMissing(i)) {

            double laplaceCorrection = 0.0;
            if (m_wordTotalForClass[classValue].getValue(index) == w*instToRemove.valueSparse(i) + this.laplaceCorrectionOption.getValue()) {
                laplaceCorrection = this.laplaceCorrectionOption.getValue(); //1.0

            }

            m_wordTotalForClass[classValue].addToValue(index,
                    (-1)*(w * instToRemove.valueSparse(i) + laplaceCorrection));
        }
    }

Теперь, если я выведу m_wordTotalForClass[classValue], я получу разные результаты для классического MNB по потоку с 3000 экземплярами из экземпляра 2000-3000, как из скользящего окна MNB (см. Выше) с окном Size 1000. И единственные различия что он выводит 1 вместо 0 в некоторых точках, но не всегда. Я полагаю, это как-то связано с коррекцией лапласа. Возможно, существует проблема с округлением в операторе if: if (m_wordTotalForClass[classValue].getValue(index) == w*instToRemove.valueSparse(i) + this.laplaceCorrectionOption.getValue()), так что мы не всегда вводим часть, где установлено значение Лапласа.

У кого-нибудь есть идея? Я немного схожу с ума, потому что я думал о том, где может быть проблема в течение последних трех дней. Любая помощь будет принята с благодарностью!

0 ответов

Другие вопросы по тегам