/// <summary> /// ニューラルネットの演算結果を分かり易くIDと尤度にまとめて返す /// </summary> /// <param name="outputVector">ニューラルネットの出力ベクトル</param> /// <param name="productionVolume">配列の生成数(1以上かつ出力ベクトルの次元を超えないようにして下さい)</param> /// <returns>ID・尤度の組を配列に加工したもの<para>本クラスのIDnamesメンバがセットされていない場合は""が返ります。</para></returns> /// <exception cref="SystemException">要求サイズに異常があるとスロー</exception> /// <example> /// 以下にサンプルコードを示します。 /// このコードは処理の流れを大まかに示しています。 /// 実際にはnnclassは結合係数等をセットしなければ識別は行えません。 /// <code> /// NeuralNetwork.Parameter para = new NeuralNetwork.Parameter(2, 6, 1, 1, 0.01); // ニューラルネットのパラメータ設定 /// NeuralNetwork nnclass = new NeuralNetwork(para); // ニューラルネットクラスのインスタンス生成 /// double[] feature10 = new double[2] { 1, 0 }; // 特徴ベクトル生成(XORを意識している) /// /// IDandLikelihood[] result = nnclass.ToIDandLikelihood(nnclass.Recognize(feature10), 3); // 出力ベクトルをリレーさせて、構造体配列に変換している /// </code> /// </example> private IDandLikelihood[] GetIDandLikelihood(Vector outputVector, int productionVolume) { IDandLikelihood[] ans = new IDandLikelihood[productionVolume]; double val = double.MaxValue; if (productionVolume == 0 || productionVolume > outputVector.Length) throw new SystemException("要求サイズが異常です。"); for (int i = 0; i < productionVolume; i++) // 大きい順に並び替えながら要素番号も把握する { double max = 0.0; int index = -1; for (int k = 0; k < outputVector.Length; k++) { if (max < outputVector[k] && val > outputVector[k]) { max = outputVector[k]; index = k; } } val = max; if (this._IDnames != null && index != -1) ans[i] = new IDandLikelihood(this._IDnames[index], max); else ans[i] = new IDandLikelihood("Non", max); } return ans; }
/// <summary> /// 識別結果をIDと尤度で返す /// </summary> /// <param name="feature">特徴ベクトル</param> /// <returns>IDと尤度をセットにした識別結果</returns> public IDandLikelihood Discriminate(Feature feature) { IDandLikelihood ans = new IDandLikelihood(); if (this.Ready) { Vector result = this._NNet.Recognize(feature); ans = this.GetIDandLikelihood(result, 1)[0]; } return ans; }