2

Encog を使用してこのデータセットを処理しようとしています。そうするために、出力を 1 つに結合しました (4 つの出力ニューロンを持つ NN を手動でトレーニングしようとして失敗したとしても、複数の予想される出力を使用する方法がわからないようです)。 「病気 2」、「なし」、「両方」。

そこから始めて、CSV でアナリスト ウィザードを使用し、自動プロセスが予想される出力で NN をトレーニングしました。ファイルからのピーク:

"field:1","field:2","field:3","field:4","field:5","field:6","field:7","Output:field:7"
40.5,yes,yes,yes,yes,no,both,both
41.2,no,yes,yes,no,yes,second,second

今私の問題は次のとおりです。どうすればクエリを実行できますか? 分類してみましたが、私が理解している限り、結果は値 {0,1,2} しか得られないため、区別できない 2 つのクラスがあります (両方とも 0)。

これと同じ問題が、wiki に示されている Iris の例にも当てはまります。また、Encog は出力ニューロンの値から 0/1/2 の結果をどのように推定しますか?

編集:私が見つけた解決策は、病気1と病気2に別々のネットワークを使用することでしたが、それらを1つに組み合わせることが可能かどうかを本当に知りたい.

4

1 に答える 1

2

出力列を単一の値に結合する必要があることは正しいです。Encog アナリストは、単一の出力列にのみ分類します。その出力列には、さまざまな値が含まれる場合があります。したがって、2 つの出力列を none、first、second、both に正規化すると機能します。基礎となるニューラル ネットワークを直接使用する場合、実際には、それぞれが独立した分類を行う 2 つの出力をトレーニングできます。しかし、この議論では、アナリストを扱っていると仮定します。

ワークベンチを使用してネットワークにクエリを実行していますか、それともコードで実行していますか? デフォルトでは、Encog アナリストは等辺符号化を使用してニューラル ネットワークに符号化します。この結果、出力ニューロンの数は n-1 に等しくなります。ここで、n はクラスの数です。アナリスト ウィザードで one-of-n エンコーディングを選択すると、BasicNetwork の通常の分類方法が機能します。これは、one-of-n 用にのみ設計されているためです。

エクイラテラルを使用して (コードで) クエリを実行する場合は、次のような方法を使用できます。これを Encog の次のバージョンに追加します。

/**
 * Used to classify a neural network that has been encoded using equilateral encoding.
 * This is the default for the Encog analyst. Equilateral encoding uses an output count
 * equal to the number of classes minus one.  
 * @param input The input to the neural network.
 * @param high The high value of the activation range, usually 1.
 * @param low The low end of the normalization range, usually -1 or 0. 
 * @return The class that the input belongs to.
 */
public int classifyEquilateral(final MLData input,double high, double low) {
    MLData result = this.compute(input);
    Equilateral eq = new Equilateral(getOutputCount()+1,high,low);
    return eq.decode(result.getData());
}
于 2014-05-29T15:59:34.053 に答える