WiFi信号強度から室内のローカリゼーションを実行するための単純ベイズ分類器を書いています。これまでのところうまく機能していますが、不足している機能についていくつか質問があります。これは、WiFi信号を使用しているために頻繁に発生し、WiFiアクセスポイントはどこでも利用できるわけではありません。
質問1:AppleとBananaの2つのクラスがあり、テストインスタンスT1を次のように分類したいとします。
単純ベイズ分類器がどのように機能するかを完全に理解しています。以下は、分類子に関するWikipediaの記事から使用している式です。均一な事前確率P(C = c)を使用しているため、実装では省略しています。
さて、方程式の右辺を計算し、すべてのクラス条件付き特徴確率をループするとき、どの特徴のセットを使用しますか?テストインスタンスT1は機能1、3、および4を使用しますが、2つのクラスにこれらすべての機能があるわけではありません。したがって、ループを実行して確率積を計算すると、ループしているものにいくつかの選択肢があります。
- トレーニングからのすべての機能、つまり機能1、2、3、4の結合をループします。テストインスタンスT1には機能2がないため、人工的な小さな確率を使用します。
- テストインスタンスの機能、つまり1、3、および4のみをループします。
- 各クラスで利用可能な機能をループします。'Apple'のクラス条件付き確率を計算するには、機能1、2、および3を使用し、' Banana'の場合は、2、3、および4を使用します。
上記のどれを使用する必要がありますか?
質問2:テストインスタンスT2を分類したいとします。ここで、T2にはどちらのクラスにも見られない機能があります。アンダーフローを排除するために対数確率を使用していますが、ループの詳細がわかりません。私は次のようなことをしています(Javaのような擬似コードで):
Double bestLogProbability = -100000;
ClassLabel bestClassLabel = null;
for (ClassLabel classLabel : allClassLabels)
{
Double logProbabilitySum = 0.0;
for (Feature feature : allFeatures)
{
Double logProbability = getLogProbability(classLabel, feature);
if (logProbability != null)
{
logProbabilitySum += logProbability;
}
}
if (bestLogProbability < logProbability)
{
bestLogProbability = logProbabilitySum;
bestClassLabel = classLabel;
}
}
問題は、どのクラスにもテストインスタンスの機能(例では機能5)がない場合、logProbabilitySumは0.0のままであり、結果としてbestLogProbabilityが0.0、または線形確率が1.0になりますが、これは明らかに間違っています。これを処理するためのより良い方法は何ですか?