3

我面临以下问题:我正在尝试在滑动窗口中实现 MNB 分类器。我实现了一个窗口大小的 LinkedList 并存储了必须在其中考虑的所有流实例。当一个不再适合窗口的新实例到达时,第一个实例被删除。为了删除相应的字数,我实现了以下方法,它与 moa 的 trainOnInstanceImpl() 基本相同,只是向后:

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] 我会在具有 3000 个实例的流上从实例 2000-3000 中获得经典 MNB 的不同结果,与来自窗口大小为 1000 的滑动窗口 MNB(见上文)的结果不同。唯一的区别是它在某些点输出 1 而不是 0,但并非总是如此。我想这与拉普拉斯校正有关。可能 if 语句中的舍入存在问题:

if (m_wordTotalForClass[classValue].getValue(index) == w*instToRemove.valueSparse(i) + this.laplaceCorrectionOption.getValue())

这样我们就不会总是输入设置拉普拉斯值的部分。

有人有想法吗?我有点发疯了,因为我在过去三天一直在思考问题可能出在哪里。任何帮助将不胜感激!

4

0 回答 0