発火率計算機を作成しました

発火率計算機を作成しました

Published: 8/13/2018

16

こんにちは、Rafkaです。
ちょっと研究周りで忙しかったので間が空いてしまいましたが、 その一環で 発火率計算機 を作成したので、 今回はその紹介と使い方の解説を行います。

何をするプログラムか

ラスタープロットと呼ばれるグラフを作成できるファイルフォーマット (一列目に時間、二列目に発火したニューロンの番号)から、 発火率を計算しファイルに出力するプログラムです。
ラスタープロットに使うファイルが複数であっても、 zip ファイルで指定できるのでコマンドが複雑化せず、 また、発火率の計算に必要なシミュレーションの時間や時間窓の幅などの情報を、 対話的に入力できるようにすることで、 シミュレーションの内容毎にプログラムを変更する必要がありません。 更に、対話的に入力することが面倒な場合に、 予め入力内容を指定できるスクリプトにも対応しました。

ラスタープロット?発火率?

ニューロンとも呼ばれる神経細胞は、 スパイクと呼ばれる短い電気パルス互いに送受して情報を伝達するので、 シミュレーションの結果も神経細胞の電位の変化として得られます。 この時、どのニューロンがいつスパイクを発射したかどうかだけに注目し、 スパイクが発生した事をニューロンの種類ごとに点で表現する方法があり、 ラスタープロット と言い、見た目は以下のようなグラフになります。
複数のニューロンについての活動パターンを一度に見ることができるので、 入力に対する集団としての活動の傾向などを見出す上で有用です。 このグラフを得るためのデータファイルも、 一列目にスパイクが発生した時間、 二列目にスパイクを発火したニューロンの番号を書くだけで良く、 シミュレーションを回しながらファイルに出力する際に余計な計算を行う必要がないので、 作成したシミュレーションがとりあえずうまく動いているかどうかの確認にも有用です。
しかし、ニューロンの活動を正しく観察するには、 ラスタープロットだけでは不可能です。 シミュレーションにおけるニューロンの電位の変化を観察したり、 発火率 と呼ばれる値を計算してその傾向を見たりする必要があるでしょう。 発火率とは、単位時間あたりにそのニューロンが何回スパイクを発火するかという値で、 単位は基本的に Hz です。 計算方法の違いからいくつか種類があるのですが、今回の話では重要ではないので割愛します。
発火率は何回スパイクを発火するかという値ですので、 スパイクの情報そのものを表すラスタープロット用のデータファイルから計算することができます。 しかしその為には、シミュレーションによって異なる、 シミュレーションの時間の長さや発火率計算の際の時間窓の幅、 ニューロン番号とニューロンの種類の対応付などのいくつかの情報を与えねばならず、 私は今まで、シミュレーションの内容が変わる度に、 スパイクデータから発火率を計算するプログラムを作成してきました。
今回作成したプログラムでは、 それらの情報を対話的に入力して処理できるようにしたので、 シミュレーションの題材毎に作り直す必要がなくなりました。 ざっとググった感じも見当たらなかったので、記事をつけて公開しました。 似たような研究分野の方に良かったら使用していただいて、 GitHub で PR やフィードバックをいただけたらと思います。

使用準備

ソースコードからビルドする

GitHub の リポジトリgit clone して ビルドしてください。 C# で作成したので、ビルドに必要な環境は以下の通りです。
  • .NET Core 2.1 以降
.NET Core のインストールはこちらから。
リポジトリをクローンして、 .NET Core のセットアップが完了したら、 dotnet コマンドや IDE のビルド機能を使ってプログラムをビルドしてください。

ファイルの用意

本ソフトウェアを使用する際に、 データファイルは zip ファイルとして指定します。 これはデータファイルが複数存在する際に、 ファイルを指定する手間を和らげるための仕様なので、 データファイルが 1 つでもそれを zip にしてください。

使い方

本ソフトウェアは CUI ベースのプログラムです。以下の文において $ はプロンプトを表すこととします。

ヘルプの表示

とりあえずヘルプを表示してみましょう。オプションとして、--helpまたは-hを指定することで表示することができます。
$ ./FiringRateCalculator -h
Usage : $ ./FiringRateCalculator [FILE].zip [options]
 
[options]
          -h|--help : Helpを表示して終了する.
          -s [FILE] : 設定ファイルを指定する.
          -y        : 自動で"ok"を入力する.
Usageにもある通り、 コマンドの直後にデータファイルの zip を指定することでこのソフトウェアは動作します。 その他のオプションとして表示されている、設定ファイルの指定や ok の自動入力については後ほど説明します。

ファイル指定

このプログラムは大きく分けて以下の4ステップで実行されます。
  1. ファイル指定 : zipファイルから実際に計算の対象とするファイルを選択する。
  2. 発火率計算用の情報入力 : 計算に必要な情報を入力する。
  3. 発火率計算 : ファイルの読み込みと発火率の計算を行う。
  4. ファイル出力 : ニューロンの種類ごとにファイルに書き出し。
手元にgrspk.zipがあったので、これを用いた動作例を示していきます。 ファイル指定 のステップに該当するのは以下の部分です。
$ ./FiringRateCalculator grspk.zip
"grspk.zip"には以下のファイルが含まれています.
gr.spk.0.0 gr.spk.0.1 gr.spk.0.10 gr.spk.0.100 gr.spk.0.11 gr.spk.0.12
gr.spk.0.13 gr.spk.0.14 gr.spk.0.15 gr.spk.0.16 gr.spk.0.17 gr.spk.0.18
gr.spk.0.19 gr.spk.0.2 gr.spk.0.20 gr.spk.0.21 gr.spk.0.22 gr.spk.0.23
gr.spk.0.24 gr.spk.0.25 gr.spk.0.26 gr.spk.0.27 gr.spk.0.28 gr.spk.0.29
gr.spk.0.3 gr.spk.0.30 gr.spk.0.31 gr.spk.0.32 gr.spk.0.33 gr.spk.0.34
gr.spk.0.35 gr.spk.0.36 gr.spk.0.37 gr.spk.0.38 gr.spk.0.39 gr.spk.0.4
gr.spk.0.40 gr.spk.0.41 gr.spk.0.42 gr.spk.0.43 gr.spk.0.44 gr.spk.0.45
gr.spk.0.46 gr.spk.0.47 gr.spk.0.48 gr.spk.0.49 gr.spk.0.5 gr.spk.0.50
gr.spk.0.51 gr.spk.0.52 gr.spk.0.53 gr.spk.0.54 gr.spk.0.55 gr.spk.0.56
gr.spk.0.57 gr.spk.0.58 gr.spk.0.59 gr.spk.0.6 gr.spk.0.60 gr.spk.0.61
gr.spk.0.62 gr.spk.0.63 gr.spk.0.64 gr.spk.0.65 gr.spk.0.66 gr.spk.0.67
gr.spk.0.68 gr.spk.0.69 gr.spk.0.7 gr.spk.0.70 gr.spk.0.71 gr.spk.0.72
gr.spk.0.73 gr.spk.0.74 gr.spk.0.75 gr.spk.0.76 gr.spk.0.77 gr.spk.0.78
gr.spk.0.79 gr.spk.0.8 gr.spk.0.80 gr.spk.0.81 gr.spk.0.82 gr.spk.0.83
gr.spk.0.84 gr.spk.0.85 gr.spk.0.86 gr.spk.0.87 gr.spk.0.88 gr.spk.0.89
gr.spk.0.9 gr.spk.0.90 gr.spk.0.91 gr.spk.0.92 gr.spk.0.93 gr.spk.0.94
gr.spk.0.95 gr.spk.0.96 gr.spk.0.97 gr.spk.0.98 gr.spk.0.99
計算対象とするファイルの一覧を作成します.
使用可能なコマンドを以下に示します.
list [ls]          : zipファイル内のファイル一覧を表示.
add {file}         : {file} を一覧に追加.
remove [rm] {file} : {file} を一覧から削除.
chlist [cls]       : 一覧を表示.
help [h]           : これを表示.
ok                 : 操作を完了する.
>> add gr.spk.0.0
>> add gr.spk.0.30
>> cls
gr.spk.0.0
gr.spk.0.30
>> rm gr.spk.0.0
>> cls
gr.spk.0.30
>> ok
計算対象のファイルとして,以下のファイルを選択しました.
gr.spk.0.30
このフェーズでは、いくつかのコマンドを使って、 計算対象とするファイルを zip に含まれるファイルから選択します。 help または h を入力することで使用できるコマンドを表示できます。
基本的には、add でファイルを選択し、 remove または rm で選択したファイルを除外することができます。 選択したファイルの一覧は chlist または cls で表示することができます。 ファイルの選択が完了したら、ok を入力することで次のステップに移れます。

発火率計算用の情報入力

ファイルの選択が完了したら、次に発火率計算用の情報を入力していきます。 入力する情報は、
  • シミュレーションの最終時刻
  • 時間窓の幅
  • サンプリングレート
  • ニューロンの総数
です。 時間に関係する、 シミュレーションの最終時刻・時間窓の幅・サンプリングレートは、 データファイルの値と単位を揃えた状態での値を入力してください。
入力されたサンプリングレートの値に応じて、 発火率を計算する時刻の列が生成され、 ここで生成された時刻のそれぞれにおいて、 時間窓の幅の値に応じて発火率が計算されます。 例えば、時刻 tt における発火率 f(t)f(t) は、 時間窓の幅が TT である時、 spk(s,e)\text{spk}(s, e) が時刻 ss から時刻 ee の間のスパイクの数を表すとすると、 以下の式で計算されます。
f(t)=spk(tT2,t+T2)Tf(t) = \frac{\text{spk}(t - \frac{T}{2}, t + \frac{T}{2})}{T}
今回使用した grspk.zip に含まれるデータファイルには、 時間は ms で記録されていたので、 シミュレーションの最終時刻が 6s 、時間窓の幅を 1s 、 サンプリングレートを 30Hz としたい場合には、 以下のような値で入力する必要があります。
  • シミュレーションの最終時刻: 6 s → 6000 ms
  • 時間窓の幅: 1 s → 1000 ms
  • サンプリングレート: 30 Hz = 30 /s → 0.03 /ms
また、 データファイルに記録されているニューロンの総数は 2114 個ですので、 従ってこのステップでの入力は以下のようになります。
発火率計算のための情報を設定します.
入力された値はそのまま使用されるので,データの単位と合うように入力してください.
データの最終時刻 : 6000
時間窓の幅 : 1000
サンプリングレート : 0.03
ニューロンの総数 : 2114
データの読み込みを開始します.
完了しました.
発火率の計算を開始します.
完了しました.
全ての情報の入力が完了すると、自動的に次のステップに移ります。

発火率計算

計算に必要な情報が全て入力されると、 自動的にこのステップに移ります。 指定されたファイルを読み込んだあと、発火率の計算が行われます。
全て完了した後に、自動的に次のステップに移ります。

ファイル出力

計算した発火率をファイルに出力するステップになります。 ファイルに出力するニューロン番号をレンジで指定して出力するのですが、 大抵のシミュレーションでは、 ニューロン番号とニューロンの種類が対応していると思うので、 番号のレンジの指定と同時に名前を指定できるようにしてみました。
以下の例では、 0 番から 1023 番を Gr という名前で、 1024 番から 2047 番までを Go という名前でファイルに出力しています。
結果をファイルに出力します.
以下のフォーマットに従って,ニューロンIDの登録を行ってください.
>> Name [StartID]:[EndID]
Example : >> Gr 0:1023
操作を終了するには"ok"を入力してください.
>> Gr 0:1023
output/Gr.frate.gr.spk.0.0 に出力中.
>> Go 1024:2047
output/Go.frate.gr.spk.0.0 に出力中.
>> ok
プログラムを終了します.
ファイル名は {名前}.frate.{計算元となったデータファイルの名前} となり、 実行ファイル直下に output ディレクトリが生成されてそこに格納されます。
発火率のファイルの書式は、 1 列目が時刻、2 列目以降がニューロン番号ごとの発火率になり、 各列間は空白で区切られています。

設定ファイルと自動実行

今までのやり方で対話的にデータを入力して発火率を計算させることもできるのですが、予め入力する内容をファイルに分けておいて、実行時にそのファイルを指定することで自動的に入力を行う方法もあります。
例として、以下のような設定ファイルを frc.setting という名前で作成しました。
FileLoad gr.spk.0.0
FileLoad gr.spk.0.50
FileLoad gr.spk.0.100
 
EndTime 6000
TimeBin 1000
SamplingRate 0.03
NumberOfNeurons 2114
 
Output Gr 0:1023
Output Go 1024:2047
Output Pkj 2048:2079
Output St 2080:2111
Output Vn 2112:2112
Output Io 2113:2113
使える命令は以下の通りです。 パスカルケースで書いてありますが、全部小文字とか部分的に適当に大文字にされていても大丈夫です。
  • FileLoad: zip から読み込むファイルを指定します。
  • EndTime: シミュレーションの終了時刻を設定します。
  • TimeBin: 時間窓の幅を設定します。
  • SamplingRate: サンプリングレートを設定します。
  • NumberOfNeuron: ニューロンの総数を設定します。
  • Output: 出力の設定をします。
この設定ファイルを使用して grspk.zip の計算を実行するには、
./FiringRateCalculator grspk.zip -s frc.setting
と入力すればできます。-s は setting の頭文字の s です。 ただし、このままでは ok の入力が求められる場面でプログラムが待機するので、 -y オプションを追加することで、ok を自動で入力してくれるようになります。
つまり、設定ファイルを用いて完全に自動で実行してもらうには、
./FiringRateCalculator grspk.zip -s frc.setting -y
と入力すればできます。

最後に

このプログラムはもっと別の本命のプログラムの補助ツールとして作成したので、 クオリティ面に不安を抱えております。
本ソフトウェアを使用したことによる損害等についての責任は一切負いかねますが、 機能の追加の要望やバグ修正などは、 ここのコメント欄や GitHub の PR 等でいつでも歓迎しておりますので、よろしくお願い致します。

Rafka
Rafka

Software Engineer

最近はドラクエ 1 & 2 をプレイしてます。楽しい!

関連記事