この質問をチェックしていただきありがとうございます。多変量ガウス分類器の使用方法を理解しようとしています。
私の問題をよりよく紹介するために、現在どのようにデータを分類しているかを示します。
これらのオブジェクトのライブラリがあります:
public class AccFeat {
int id;
Double[] mean = new Double[3];
Double[] sd = new Double[3];
Double[] avPeakDistance = new Double[3];
int[][] histogram = new int[3][10];
int[][] fftHistogram = new int[3][10];
int[] crossingCount = new int[3];
double resultantAcc;
int type;
そして、識別されていないことを示すtypeフィールドを持つオブジェクトを取得します。
手順:
クラスごとに 30 個のトレーニング サンプルのライブラリを読み込みます。
各サンプル クラスの各特徴の平均と分散を計算し、これらの値を配列 (クラスごとに 73 の平均/分散ペアの 1 つの配列) に格納します。(それぞれ 10 個のビン (60 個の数値) の 6 つのヒストグラムを含む合計 73 個の特徴があるため)
識別される AccFeat オブジェクトの機能に対応する 73 個の値の配列を作成します。
私が理解しているのはNaive Bayesian Classifierを使用して確率を計算します。
9 つのサンプル クラスがあるため、0 から 8 までの i をチェックします。
for (int i = 0; i < 9; i++) {
result = 1;
for (int j = 0; j < SAMPLEFEATURES.get(i).size(); j++) {
result = result * p(QUERYFEATURES.get(j), SAMPLEFEATURES.get(i).get(j));
//this is the p function, first argument is value of feature,
//second argument is mean-variance pair for this feature in this particular i class.
}
results[i] = result;
}
}
p(x) 関数は次のとおりです。
そして、クラスごとに 9 つの確率値があります。分類子は、最も高い確率値に対応するクラスであると判断します。
ここで、多変量ガウス分類器を作成したいと思います。
これは、この場合の確率を計算するために使用される式です。
そこで、9 つのクラスごとに分散共分散行列を作成します。ここでは、正しいかどうかわかりませんが、73 個のフィーチャすべてを使用します。これには、それぞれ 10 個のビンの 6 個のヒストグラムが含まれているため、これらのフィーチャのうち 60 個は、加速度周波数と加速度値のヒストグラムです。
これは少し怪しいと思います。これらの値をすべて 1 つのマトリックスにまとめる必要がありますか? x 軸上の 10 ~ 20 の範囲の加速度の周波数と y 加速度のピーク距離の間の共分散を計算するのは、少し奇妙に思えます。
しかし、私はそれを行い、各セルに次の式を使用して、各クラスの 73x73 マトリックスを作成します。
Cov(機能 a、機能 b) = 合計 ( (機能 A[i] - 平均機能 A ) * (機能 B[i] - 平均機能 B ) ) / n-1
次に必要なのは平均ベクトルなので、各クラスに関連付けられたサンプルのグループごとに、各特徴の平均の 73 要素ベクトルを作成します。合計 9 つのベクトルです。
私が理解していることから、私のプログラムの場合の式の x は、未確認の AccFeat オブジェクトの特徴値の 73 要素ベクトルです。
だから私はこの式を実装し、次のように考えています。各クラスの共分散行列と平均を使用して実行する必要があり、結果が最も高いものが識別の候補である可能性が最も高くなります。
問題:
共分散行列は負の値でいっぱいで、そのうちの約 5% のみが正の値であり、通常は非常に大きくなります。
この行列の行列式は、場合によっては 0 に非常に近いか、負であり、式が崩れます。
分類子の使用方法の何が問題になっていますか? 残念ながら、私にはこれを手伝ってくれる人が誰もいないので、私の弱い理解はすべてオンライン講義のスライドに基づいています....
誰かがそれを使用する方法で私を助けることができますか?