次の問題に直面しています:スライディング ウィンドウに 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 日間、どこに問題があるのかを考えていたので、気が狂いそうです。どんな助けでも大歓迎です!