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] を出力すると、ウィンドウ サイズが 1000 のスライディング ウィンドウ MNB (上記参照) と同様に、インスタンス 2000-3000 の 3000 インスタンスを持つストリーム上の従来の MNB に対して異なる結果が得られます。いくつかの時点で 0 ではなく 1 を出力しますが、常にではありません。これはラプラス補正と関係があると思います。if ステートメントの丸めに問題がある可能性があります。

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

ラプラス値が設定されている部分に常に入らないようにします。

誰かアイデアがありますか?この 3 日間、どこに問題があるのか​​を考えていたので、気が狂いそうです。どんな助けでも大歓迎です!

4

0 に答える 0