8

WiFi信号強度から室内のローカリゼーションを実行するための単純ベイズ分類器を書いています。これまでのところうまく機能していますが、不足している機能についていくつか質問があります。これは、WiFi信号を使用しているために頻繁に発生し、WiFiアクセスポイントはどこでも利用できるわけではありません。

質問1:AppleとBananaの2つのクラスがあり、テストインスタンスT1を次のように分類したいとします。

ここに画像の説明を入力してください

単純ベイズ分類器がどのように機能するかを完全に理解しています。以下は、分類子に関するWikipediaの記事から使用している式です。均一な事前確率P(C = c)を使用しているため、実装では省略しています。

ここに画像の説明を入力してください

さて、方程式の右辺を計算し、すべてのクラス条件付き特徴確率をループするとき、どの特徴のセットを使用しますか?テストインスタンスT1は機能1、3、および4を使用しますが、2つのクラスにこれらすべての機能があるわけではありません。したがって、ループを実行して確率積を計算すると、ループしているものにいくつかの選択肢があります。

  1. トレーニングからのすべての機能、つまり機能1、2、3、4の結合をループします。テストインスタンスT1には機能2がないため、人工的な小さな確率を使用します。
  2. テストインスタンスの機能、つまり1、3、および4のみをループします。
  3. 各クラスで利用可能な機能をループします。'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になりますが、これは明らかに間違っています。これを処理するためのより良い方法は何ですか?

4

2 に答える 2

6

Naive Bayes 分類器の場合、式の右辺はすべての属性を反復する必要があります。まばらに入力された属性がある場合、それを処理する通常の方法は、同等のサンプル サイズを使用して確率を計算する確率のm 推定を使用することです。これにより、トレーニング データに属性値が欠落している場合に、クラス条件付き確率がゼロになるのを防ぐことができます。上記の 2 つの太字の用語を Web 検索すると、m-estimate 式に関する多数の説明が見つかります。これについて説明している参考文献として、Tom Mitchell のMachine Learningがあります。基本的な式は

P_i = (n_i + m*p_i) / (n + m)

n_i は属性が値 f_i を持つトレーニング インスタンスの数、n は (現在の分類による) トレーニング インスタンスの数、m は同等のサンプル サイズ、p_i は f_i の事前確率です。m=0 を設定すると、標準の確率値 (属性値が欠落している場合はゼロになる可能性があります) に戻ります。m が非常に大きくなると、P_i は p_i に近づきます (つまり、確率は事前確率によって支配されます)。使用する事前確率がない場合は、1/k にします。ここで、k は属性値の数です。

このアプローチを使用すると、トレーニング データに属性が存在しないインスタンス T2 の場合、結果はトレーニング データで最も頻繁に発生するクラスになります。トレーニング データには、より適切な決定を行うための関連情報がないため、これは理にかなっています。

于 2012-11-19T20:37:23.477 に答える
1

トレーニング時にすべてのクラスで見つからない機能を単純に無視したくなるでしょう。それ以外の方法を選択した場合、本質的にデータを幻覚化し、分類ステップで実際に存在したデータと同等に扱っていることになります。したがって、質問 1 に対する私の簡単な答えは、機能 3 に基づいて決定を下すことです (他に何もするのに十分な情報がないだけです)。これは、@bogatron によって言及された m 推定が行っていることの一部です。

特定の機能が欠落しているトレーニングのクラスについては、これに対するより複雑な答えがありますが、かなりの作業が必要になります。m-estimate は、p_i (分数 n_i / n) の事前確率と尤度関数 p で構成されるトレーニング データが与えられた場合の p_i (この場合は mu_i、sigma_i) に対する事後分布の点推定です。 (データ | p_i)。データポイントが観察されない場合は、基本的に、その特徴の予測分布について事前に戻すことができます。

では、それを事前に見積もるにはどうすればよいでしょうか。問題のクラスの数が、一部の特徴値が欠落している数に比べて小さい場合、データを持っているクラスから事前確率のパラメーターを推測し、欠落しているクラスの予測分布を考慮することができます。データは単にこれが事前であるためです(データを持つクラスの場合、予測分布は事後です)。データが正規分布している(または少なくとも平均値と標準偏差によって特徴付けられている)と仮定しているように見えるので、共役のために平均値の事前分布も正常である必要があります。標準偏差の事前分布に関する推論は避けたいと思います。これは、初めての場合は少し面倒なので。

ただし、これは、欠損値の割合が小さいという特徴の観測値を持つ十分なクラスがある場合にのみ意味があることに注意してください。特に、あなたの例では、観察のある単一のクラスしかないため、クラス「バナナ」の機能1に対してできる最善の方法は、mu_1に関する不確実性が「Apple」を中心とした分布によって表されていると仮定することですmu_1 には任意の分散があります。または、彼らの mus が等しいと仮定することもできます。

したがって、残念ながら、質問 2 に対する答えは、コードが正しいことを行っているということです。新しいテスト インスタンスにトレーニングで観察されたことのない機能しかない場合、どのようにしてそのクラスを選択することを期待できますか? 事前確率に従って選択する以上のことはできません。

于 2012-11-20T12:19:12.703 に答える