============================================================================
           ニューロブレインCOMコンポーネント

               NeuroBrainCOM.dll

  バックプロパゲーション型ニューラルネットワークの各種機能を提供する
               COMコンポーネント

                  提 供
              Kuwata's Blog くわぶろ
          http://www.ksa-japan.com/kuwata/blog/
                  by くわ。
============================================================================

【概要】

  ニューロブレインは、バックプロパゲーション型ニューラルネットワークの各種
  機能を提供するCOMコンポーネントです。Visual BasicやExcel VBAなどから簡単
  に利用でき、2〜4層構造、最大256ニューロンまでのニューラルネットワークを
  構築できます。

【お約束】

  ニューロブレインは、本ソフトウェア(本COMコンポーネント)を必要とする方
  に無償で利用する権利を貸与する、いわゆるフリーソフトウェアです。

  本ソフトウェアは、著作権及びその他の知的財産権に関する法律によって保護さ
  れています。

  本ソフトウェアを使用することによって如何なる損害が発生しても、当方は一切
  その責任を負いません。全ては自己責任の元で使ってください。

  転載・再配布については、アーカイブの内容を改変しない限り自由です。連絡
  の必要はありません。

【謝辞】

  ニューロブレインには、松本眞氏と西村拓士氏によって開発された疑似乱数生成
  アルゴリズムであるメルセンヌ・ツイスタ(Mersenne Twister)の一部が組み込
  まれています。2002年版標準コードのmt19937ar.c(BSDライセンスに準拠)をベ
  ースにしています。この場を借りてお礼申し上げます。

【サポート】

  原則として、ニューロブレインに関するサポートはありませんが、バグや障害報
  告等は歓迎します。ブログのコメント欄へどうぞ。

【動作環境】

  1.オペレーティングシステム(OS)
    ニューロブレインは、以下のOSで正常に動作することを確認しています。
    ・Microsoft Windows 2000 Professional (SP4)
    ・Microsoft Windows XP Home Edition (SP3)
    ・Microsoft Windows XP Professional (SP3)
    ※他のOSでの動作は未確認です。

  2.開発環境
    ニューロブレインは、以下の開発環境で正常に動作することを確認していま
    す。
    ・Microsoft Visual Basic 6.0 (SP6)
    ・Microsoft Visual Basic .NET 2002 (SP1)
    ・Excel 2000 (SP3) のVBA
    ・Excel 2003 (SP3) のVBA
    ※他の開発環境での動作は未確認です。

【バージョン情報】

  1.0.0.0 (2004/02/14) 新規作成
  1.0.0.1 (2009/12/13) リリースビルド
             ※ソースコメント以外の修正点はありません。

【アーカイブファイル】

  アーカイブファイルを展開すると以下のファイルが得られます。

    NeuroBrainCOM説明書.txt : 本説明書
    NeuroBrainCOM.dll    : ニューロブレインCOMコンポーネント

【インストール】

  1.NeuroBrainCOM.dll(COMコンポーネント本体)を適当なフォルダに置いてく
    ださい。(例えば、C:\Program Files\NeuroBrainCOM の中)
    ※システムフォルダ(XPの場合はC:\WINDOWS\SYSTEM32)に置いても構いま
    せんが、他社製の同名ファイルが存在しないことを必ず確認してください。
    ※バージョンアップの際は、上書きコピー(置き換え)してください。

  2.COMコンポーネントをシステムに登録します。スタートメニュー内の「ファ
    イル名を指定して実行(R)...」をクリックし、以下のコマンドを入力してく
    ださい。

    regsvr32 "C:\Program Files\NeuroBrainCOM\NeuroBrainCOM.dll"
    ※パスは適宜読み替えてください。

    入力後、以下のメッセージ(ダイアログボックス)が表示されたら登録完了
    です。

    C:\Program Files\NeuroBrainCOM\NeuroBrainCOM.dll の DllRegisterServer
    は成功しました

【アンインストール】

  1.COMコンポーネントのシステム登録を解除します。スタートメニュー内の
    「ファイル名を指定して実行(R)...」をクリックし、以下のコマンドを入力
    してください。(/uオプションを付け忘れないようにしてください。)

    regsvr32 /u "C:\Program Files\NeuroBrainCOM\NeuroBrainCOM.dll"
    ※パスは適宜読み替えてください。

    入力後、以下のメッセージ(ダイアログボックス)が表示されたら登録解除
    完了です。(登録時と同じメッセージが表示されます。)

    C:\Program Files\NeuroBrainCOM\NeuroBrainCOM.dll の DllRegisterServer
    は成功しました

  2.NeuroBrainCOM.dll(COMコンポーネント本体)を削除してください。

【参照設定】

  Visual BasicやExcel VBAでニューロブレインを使用するには参照設定が必要で
  す。「NeuroBrainCOM 1.0 タイプライブラリ」を参照設定してください。

【ライブラリ情報】

  ライブラリ名 : NEUROBRAINCOMLib
  クラス名     : NeuroBrain

【メソッド概要】

  1.LoadNeuralNet
      → 待避されたニューラルネットワークを復元します。

  2.SaveNeuralNet
      → ニューラルネットワークを待避(ファイル化)します。

  3.ConstructNeuralNet
      → 新しいニューラルネットワークを構築します。

  4.DeconstructNeuralNet
      → 現在のニューラルネットワークを破棄します。

  5.SetLearningData
      → 学習データ(入力信号値)をニューラルネットに格納します。

  6.SetTeacherSignal
      → 学習データ(教師信号値)をニューラルネットに格納します。

  7.CheckReady
      → 有効な学習データ(入力信号値、教師信号値)がニューラルネット
        に格納されているかチェックします。

  8.Learn
      → ニューラルネットワークの学習を行います。

  9.SetInput
      → 入力層に入力信号値を格納します。

  10.Run
      → ニューラルネットワークを実行(予測処理)します。

  11.GetOutput
      → 出力層の出力値を取得します。

  12.GetOLBias
      → 出力層のバイアス(閾値)を取得します。

  13.GetHidden
      → 中間層の出力値を取得します。

  14.GetHLBias
      → 中間層のバイアス(閾値)を取得します。

  15.GetWeight
      → 結合荷重値を取得します。

【メソッド詳細】

  1.LoadNeuralNet
    【構文】
      Function LoadNeuralNet(FileName As String) As Long
    【返値】
      0   : 正常終了
      -1   : ニューラルネットが既に構築されている
      1   : 待避ファイルがオープンできない
      2   : 待避ファイルの読み込み中にエラーが発生した
      3   : 待避ファイルではない
      100 : ニューラルネットの構築に失敗した
    【引数】
      FileName
        : 待避ファイル名
         ※絶対パス形式 or 相対パス形式 or ファイル名のみ
    【説明】
      待避されたニューラルネットワークを復元します。
    【VBA 6.5での使用例】
      Private Sub Workbook_Open()
         Dim retv As Long
         Set nb = New NeuroBrain
         retv = nb.LoadNeuralNet(ThisWorkbook.Path + "\sample.sav")
      End Sub

  2.SaveNeuralNet
    【構文】
      Function SaveNeuralNet(FileName As String) As Long
    【返値】
      0   : 正常終了
      -1   : ニューラルネットが構築されていない
      1   : 待避ファイルが作成できない
      2   : 待避ファイルの書き込み中にエラーが発生した
    【引数】
      FileName
        : 待避ファイル名
         ※絶対パス形式 or 相対パス形式 or ファイル名のみ
    【説明】
      現在のニューラルネットワークの内容を待避(ファイル化)します。
    【VBA 6.5での使用例】
      Private Sub Workbook_BeforeClose(Cancel As Boolean)
       Dim retv As Long
       If Not nb Is Nothing Then
        retv = nb.SaveNeuralNet(ThisWorkbook.Path + "\sample.sav")
        nb.DeconstructNeuralNet
        Set nb = Nothing
       End If
      End Sub

  3.ConstructNeuralNet
    【構文】
      Function ConstructNeuralNet(InputNeurons As Long,
       HiddenNeurons1 As Long, HiddenNeurons2 As Long,
       OutputNeurons As Long, SeedRand As Long, MaxRand As Double,
       SigmoidGain As Double, LearningRate As Double,
       LearningPatterns As Long) As Long
    【返値】
      0   : 正常終了
      -1   : ニューラルネットが既に構築されている
      1   : InputNeuronsの値が1〜256の範囲にない
      2   : HiddenNeurons1の値が0〜256の範囲にない
      3   : HiddenNeurons2の値が0〜256の範囲にない
         または HiddenNeurons1=0 かつ HiddenNeurons2>0 である
      4   : OutputNeuronsの値が1〜256の範囲にない
      5   : MaxRandの値が0.0〜1.0の範囲にない
      6   : SigmoidGainの値が0.0以下である
      7   : LearningRateの値が0.0以下である
      8   : LearningPatternsの値が1〜65536の範囲にない
      100 : ニューラルネットの構築に失敗した
    【引数】
      InputNeurons
        : 入力層のニューロン数(1〜256)
      HiddenNeurons1
        : 第1中間層のニューロン数(0〜256)
      HiddenNeurons2
        : 第2中間層のニューロン数(0〜256)
      OutputNeurons
        : 出力層のニューロン数(1〜256)
      SeedRand
        : 一様乱数の種
      MaxRand
        : 一様乱数の最大値(0.0〜1.0)
      SigmoidGain
        : シグモイド関数のゲイン(>0.0)
      LearningRate
        : 学習率(>0.0)
      LearningPatterns
        : 学習パターン数(1〜65536)
    【説明】
      新しいニューラルネットワークを構築します。
    【VBA 6.5での使用例】
      Private Sub KouchikuButton_Click()
       Dim retv As Long
       If nb Is Nothing Then
        Set nb = New NeuroBrain
       Else
        nb.DeconstructNeuralNet
       End If
       retv = nb.ConstructNeuralNet(21, _
        18, _
        10, _
        4, _
        12345, _
        1.0, _
        1.0, _
        0.3, _
        1000)
       If retv <> 0 Then
        MsgBox "エラー"
       End If
      End Sub

  4.DeconstructNeuralNet
    【構文】
      Sub DeconstructNeuralNet()
    【返値】
      なし
    【引数】
      なし
    【説明】
      現在のニューラルネットワークを破棄します。
      ※ニューラルネットが構築されていない場合は何もしません。
    【VBA 6.5での使用例】
      Private Sub Workbook_BeforeClose(Cancel As Boolean)
       Dim retv As Long
       If Not nb Is Nothing Then
        retv = nb.SaveNeuralNet(ThisWorkbook.Path + "\sample.sav")
        nb.DeconstructNeuralNet
        Set nb = Nothing
       End If
      End Sub

  5.SetLearningData
    【構文】
      Sub SetLearningData(PatternNo As Long, NeuronNo As Long,
       Value As Double)
    【返値】
      なし
    【引数】
      PatternNo
        : 学習パターン番号(1〜学習パターン数)
         ※番号が範囲外の場合は何もしないでリターンします。
      NeuronNo
        : 入力層のニューロン番号(1〜入力層のニューロン数)
         ※番号が範囲外の場合は何もしないでリターンします。
      Value
        : 学習データ(入力信号値 0.0〜1.0)
         ※信号値のチェックは行われません。
         ※信号値が0.0〜1.0の範囲外であっても格納されます。
    【説明】
      入力層の指定ニューロンに対する学習データ(入力信号値)をニューラ
      ルネットワークの学習パターン格納領域に格納します。
      ※ニューラルネットが構築されていない場合は何もしません。
    【VBA 6.5での使用例】
      For i = 1 to 1000
       For j = 1 To 21
        nb.SetLearningData i, j, value(i, j)
       Next j
      Next i

  6.SetTeacherSignal
    【構文】
      Sub SetTeacherSignal(PatternNo As Long, NeuronNo As Long,
       Value As Double)
    【返値】
      なし
    【引数】
      PatternNo
        : 学習パターン番号(1〜学習パターン数)
         ※番号が範囲外の場合は何もしないでリターンします。
      NeuronNo
        : 出力層のニューロン番号(1〜出力層のニューロン数)
         ※番号が範囲外の場合は何もしないでリターンします。
      Value
        : 学習データ(教師信号値 0.0〜1.0)
         ※信号値のチェックは行われません。
         ※信号値が0.0〜1.0の範囲外であっても格納されます。
    【説明】
      出力層の指定ニューロンに対する学習データ(教師信号値)をニューラ
      ルネットワークの学習パターン格納領域に格納します。
      ※ニューラルネットが構築されていない場合は何もしません。
    【VBA 6.5での使用例】
      For i = 1 to 1000
       For j = 1 To 4
        nb.SetTeacherSignal i, j, value(i, j)
       Next j
      Next i

  7.CheckReady
    【構文】
      Function CheckReady() As Long
    【返値】
      0   : 正常終了
      -1   : ニューラルネットが構築されていない
      1   : 未設定または範囲外の学習データ(入力信号値)がある
      2   : 未設定または範囲外の学習データ(教師信号値)がある
    【引数】
      なし
    【説明】
      有効な学習データ(入力信号値、教師信号値)がニューラルネットワー
      クの学習パターン格納領域に格納されているかチェックします。
      学習パターン数分のすべての学習データがチェックされ、1件でも未設
      定または範囲外のデータがあった場合はエラーを返します。
    【VBA 6.5での使用例】
      If nb.CheckReady() <> 0 Then
       MsgBox "エラー"
      End If

  8.Learn
    【構文】
      Function Learn(RepeatTimes As Long) As Double
    【返値】
      現在の平均二乗誤差(0.0以上)が返されます。
      なお、ニューラルネットが構築されていない場合、あるいは指定された
      学習ループ回数が範囲外の場合は0.0が返されます。
    【引数】
      RepeatTimes
        : 学習ループ回数(1〜100000)
         ※全学習パターンをそれぞれ1回ずつ学習させたものを1学習ル
          ープとして考えます。
         ※通常ここには1を指定し、VBA側でループ学習させます。
         ※値を大きくすると1学習ループあたりの学習速度が向上します
          が、その分CPU負荷が大きくなります。
         ※100を超えない程度が無難です。
    【説明】
      学習パターン格納領域に格納された学習データを用いてニューラルネッ
      トワークの学習を行います。
    【VBA 6.5での使用例】
      Do
       DoEvents
       MeanSqrErr = nb.Learn(5)
      Loop Until MeanSqrErr < 0.01

  9.SetInput
    【構文】
      Sub SetInput(NeuronNo As Long, Value As Double)
    【返値】
      なし
    【引数】
      NeuronNo
        : 入力層のニューロン番号(1〜入力層のニューロン数)
         ※番号が範囲外の場合は何もしないでリターンします。
      Value
        : 入力信号値(0.0〜1.0)
         ※信号値のチェックは行われません。
         ※信号値が0.0〜1.0の範囲外であっても格納されます。
    【説明】
      入力層(の指定ニューロン)に入力信号値を格納します。
      ※ニューラルネットが構築されていない場合は何もしません。
    【VBA 6.5での使用例】
      For i = 1 To 21
       nb.SetInput i, value(i)
      Next i

  10.Run
    【構文】
      Function Run() As Long
    【返値】
      0   : 正常終了
      -1   : ニューラルネットが構築されていない
      1   : 範囲外の入力信号値がある(0.0〜1.0の範囲外)
    【引数】
      なし
    【説明】
      ニューラルネットワークを実行(予測処理)します。
      ※精度の高い予測結果を得るには十分な学習が必要です。
    【VBA 6.5での使用例】
      If nb.Run() <> 0 Then
       MsgBox "エラー"
      End If

  11.GetOutput
    【構文】
      Function GetOutput(NeuronNo As Long) As Double
    【返値】
      出力層(の指定ニューロン)の現在の出力値(0.0〜1.0)が返されます。
      なお、ニューラルネットが構築されていない場合、あるいは指定された
      ニューロン番号が範囲外の場合は0.0が返されます。
    【引数】
      NeuronNo
        : 出力層のニューロン番号(1〜出力層のニューロン数)
         ※番号が範囲外の場合は返値が0.0となります。
    【説明】
      出力層(の指定ニューロン)の現在の出力値を取得します。
    【VBA 6.5での使用例】
      If nb.Run() <> 0 Then
       MsgBox "エラー"
      Else
       For i = 1 To 4
        value(i) = nb.GetOutput(i)
       Next i
      End If

  12.GetOLBias
    【構文】
      Function GetOLBias(NeuronNo As Long) As Double
    【返値】
      出力層(の指定ニューロン)の現在のバイアス(閾値)が返されます。
      なお、ニューラルネットが構築されていない場合、あるいは指定された
      ニューロン番号が範囲外の場合は0.0が返されます。
    【引数】
      NeuronNo
        : 出力層のニューロン番号(1〜出力層のニューロン数)
         ※番号が範囲外の場合は返値が0.0となります。
    【説明】
      出力層(の指定ニューロン)のバイアス(閾値)を取得します。
    【VBA 6.5での使用例】
      If nb.Run() <> 0 Then
       MsgBox "エラー"
      Else
       For i = 1 To 4
        value(i) = nb.GetOLBias(i)
       Next i
      End If

  13.GetHidden
    【構文】
      Function GetHidden(HiddenLayerNo As Long, NeuronNo As Long)
       As Double
    【返値】
      指定中間層(の指定ニューロン)の現在の出力値(0.0〜1.0)が返され
      ます。
      なお、ニューラルネットが構築されていない場合、あるいは指定された
      レイヤー番号が範囲外の場合、ニューロン番号が範囲外の場合は0.0が返
      されます。
    【引数】
      HiddenLayerNo
        : 中間層のレイヤー番号
         ※第1中間層は1、第2中間層は2を指定します。
         ※番号が範囲外または指定中間層が存在しない場合は返値が0.0
          となります。
      NeuronNo
        : 指定中間層のニューロン番号(1〜指定中間層のニューロン数)
         ※番号が範囲外の場合は返値が0.0となります。
    【説明】
      指定中間層(の指定ニューロン)の出力値を取得します。
    【VBA 6.5での使用例】
      If nb.Run() <> 0 Then
       MsgBox "エラー"
      Else
       For i = 1 To 18
        value1(i) = nb.GetHidden(1, i)
       Next i
       For i = 1 To 10
        value2(i) = nb.GetHidden(2, i)
       Next i
      End If

  14.GetHLBias
    【構文】
      Function GetHLBias(HiddenLayerNo As Long, NeuronNo As Long)
       As Double
    【返値】
      指定中間層(の指定ニューロン)の現在のバイアス(閾値)が返されま
      す。
      なお、ニューラルネットが構築されていない場合、あるいは指定された
      レイヤー番号が範囲外の場合、ニューロン番号が範囲外の場合は0.0が返
      されます。
    【引数】
      HiddenLayerNo
        : 中間層のレイヤー番号
         ※第1中間層は1、第2中間層は2を指定します。
         ※番号が範囲外または指定中間層が存在しない場合は返値が0.0
          となります。
      NeuronNo
        : 指定中間層のニューロン番号(1〜指定中間層のニューロン数)
         ※番号が範囲外の場合は返値が0.0となります。
    【説明】
      指定中間層(の指定ニューロン)のバイアス(閾値)を取得します。
    【VBA 6.5での使用例】
      If nb.Run() <> 0 Then
       MsgBox "エラー"
      Else
       For i = 1 To 18
        value1(i) = nb.GetHLBias(1, i)
       Next i
       For i = 1 To 10
        value2(i) = nb.GetHLBias(2, i)
       Next i
      End If

  15.GetWeight
    【構文】
      Function GetWeight(LayerNo As Long, NeuronNo As Long,
       DendriteNo As Long) As Double
    【返値】
      指定層(の指定ニューロン)と次層との間の指定デンドライトの現在の
      結合荷重値が返されます。
      なお、ニューラルネットが構築されていない場合、あるいは指定された
      レイヤー番号が範囲外の場合、ニューロン番号が範囲外の場合、デンド
      ライト番号が範囲外の場合は0.0が返されます。
    【引数】
      LayerNo
        : 指定層(レイヤー番号)
         ※入力層は1、第1中間層は2、第2中間層は3、出力層は第1〜2
          中間層の有無によって2〜4を指定します。
         ※番号が範囲外または指定層が存在しない場合は返値が0.0となり
          ます。
         ※例えば3層構造のニューラルネットワークの場合、入力層は1、
          第1中間層は2、出力層は3を指定します。
      NeuronNo
        : 指定層のニューロン番号(1〜指定層のニューロン数)
         ※番号が範囲外の場合は返値が0.0となります。
      DendriteNo
        : 指定層の指定ニューロンと次層(指定層の次の層)との間のデン
         ドライト番号(1〜次層のニューロン数)
         ※デンドライト番号は次層のニューロン番号に対応します。
         ※番号が範囲外の場合は返値が0.0となります。
    【説明】
      指定層(の指定ニューロン)と次層との間の指定デンドライト(デンド
      ライト番号は次層のニューロン番号に対応)の結合荷重値を取得します。
    【VBA 6.5での使用例】
      If nb.Run() <> 0 Then
       MsgBox "エラー"
      Else
       For i = 1 To 21
        For j = 1 To 18
         value(i, j) = nb.GetWeight(1, i, j)
        Next j
       Next i
      End If