/// <summary> /// 一通りの判別を行い、結果をヒストグラム(表:実態はVector[])にまとめる /// <para>閾値による棄却は行っておりません。最大値の出力を持ったクラスを識別器の出した答えだとして集計を行っています。</para> /// <para>並列演算による交差確認法の演算のために、引数としてニューラルネットのインスタンスを受け取るようにしています。</para> /// </summary> /// <param name="discriminator">識別器</param> /// <param name="classForTest">識別対象の教師データモデル</param> /// <returns>判別結果を表にまとめたもの(実態はVector[])</returns> /// <exception cref="SystemException">クラスモデルがセットされた状態でなければ例外をスロー</exception> private Vector[] CreateDecisionChart(NeuralNetwork discriminator, List<Model> classForTest) { if (this.Ready == false) throw new SystemException("実験の準備はまだ完了しておりません。モデルを追加して下さい。"); if (discriminator == null) throw new Exception("判別器のインスタンスが確保されておらず、判別表を作ることができません。"); Vector[] decisionChart = new Vector[classForTest.Count]; for (int i = 0; i < decisionChart.Length; i++) decisionChart[i] = new Vector(this.Length); int modelIndex = 0; foreach (Model model in classForTest) // 保持しているモデルの数だけループ { Model.ReadSequenceMode backup = model.SequenceMode; model.SequenceMode = Model.ReadSequenceMode.InRotation; // 重複を避けるため、特徴ベクトルの選出方法はローテーションとする // 特徴モデルを順番に呼び出す for (int count = 0; count < model.LengthForGetFeature; count++) { Feature feature = model.GetFeature(); // 特徴ベクトルをモデルから取得 Vector outputForDebug = discriminator.Recognize(feature); // 識別 // 最大値となるインデックスを検索 double max = double.MinValue; int maxIndex = 0; for (int j = 0; j < outputForDebug.Length; j++) { if (max < outputForDebug[j]) { max = outputForDebug[j]; maxIndex = j; } } // 最大値となったインデックスについて、加算 decisionChart[modelIndex][maxIndex] += 1; } model.SequenceMode = backup; modelIndex++; } return decisionChart; }