2018年10月25日木曜日

Fitzhugh-Nagumoモデルのパラメータ変化


 Fitzhugh-Nagumoモデルのパラメータa, b, c, τを変化させた時の挙動の変化を調べた。

 まずaを変化させた。


 aが大きくなるにつれて波の振幅が狭くなる。主に上行脚よりも下降脚が急になっている印象を受ける。またわずかながらy軸方向にも平行移動しているように見えるが、振幅に対する効果に比べると無視していいレベルだと感じる。

 次にbを変化させた。


 大きくなるにつれて立ち上がりの閾値が上がり、それによって波と波の間隔が広がっているようにみえる。その考えならば、b=1で発火活動がみられないのは閾値を超えなくなったからとすると納得がいく。
 またその変化幅がbが大きいほど大きいように見えるので、分岐点に近い値で再度調べた。


 分岐点の近くだと少しの変化でかなり効果が出る。

 次にcを変化させた。


 cを大きくするに従って(1)閾値が下がり、(2)波の幅が短くなった ようにみえる。

 ここでbとcがいずれも閾値に影響したことから、二つの合わせ技を考えてみる。つまり先の結果では、b=1では発火活動がみられなかった。そこで、b=1のままcを大きくした場合に、発火活動がみられるようになるかを調べた。


 いけた。

 次にτを変化させた。


 τの変化によって時間軸方向に伸び縮みしているように見える。ただしある値より小さいと発火しなくなるようで、τ=0.4では発火活動がみられない。
 τの変化によって閾値が変化したのかはこの結果からはっきりとはわからないが、先ほどのように他の値との合わせ技を考えてみる。つまりτ=0.4としたまま、b, cを変化させて発火するようにすることはできるかを試す。
 まずはτ=0.4のままbを変化させる。


いけた。
 同様にτ=0.4のままcを変化させる。


これもいけた。
 これらの結果から一昨日の記事に対するアンサーは、「bを小さく」「cを大きく」すると閾値が下がり発火するようになり、「bを大きく」「cを小さく」すると閾値が上がって発火しにくくなりそうである。τに関しては、元の式みるとdw/dt全体にかかる係数だし、時間軸の伸び縮みくらいしか役割がない気がしているので一旦固定でいいかななどと思っている。

2018年10月23日火曜日

Fitzhugh-Nagumoモデルをつなげた

 以下を実行したnotebookはこちら

 棘徐波複合の再現に挑戦してみようという機運になった。手始めに、以前1ノードで再現したFitzhugh-Nagumoモデルを連結するところから始めた。
 内部処理はオリジナルと同じものを用いた。外部入力は、他ノードからの入力と、「中枢」的なものからの入力の和とした。すなわち

 I=(他ノードからの入力)+(中枢からの入力)

とした。
 他ノードからの入力は、連結するノードのuの総和とした。(将来的には、これを発火時1、静止時0のようにしたい)
 中枢からの入力は、今後「視床由来の3Hz徐波」のようなものを考える可能性を考えて加えたものである。これはひとまず1+正弦波とした。1を足した理由は、マイナスになることのないようにしたかったため。
 Iの大きさが色々と変わるので、最終的な入力としては係数kとの積を取った。
 ノード数はひとまず5個。ネットワーク構成は、隣り合ったノードと結合して1周するような5角形。

 そのようにした上で散々色々なパラメータで実行した結果たどり着いたあるパラメータでの結果。

 最上部画像:全5ノードのuプロット
 下の5画像:各ノードのuプロット







 うまい具合にバラバラに発火するような感じになった。また上の結果はたまたまこうなったわけではなく、何度も実行した場合にもちゃんとバラバラに発火するような感じが再現された。なおkを大きくした場合には全ノードが同期してひたすら発火、小さくした場合には全ノードが静止する。
 本来は中枢からの入力を3Hz 波にしたかったので、"1+sin 6πt"とするべきなのだが、早とちりして"1+sin 3t"としてしまっていた。そこを正した場合で色々とパラメータ探索を試みたが、うまい具合にバラバラに発火するようなパターンを見つけられなかった。ある時の結果がこちら。


 見ればわかるように、3Hz波がモロに残ってしまっている。この結果をもってさっきの結果をもう一度みてみたら、同じように中枢由来の入力の周波数3/2π Hz程度で揺れていることに気付いた。
 Fitzhugh-Nagumoモデルで再現される波(以後、FN波)の周波数が2回のシミュレーションで変化しないこと、および先のシミュレーションではFN波と中枢由来の入力の周波数が比較的近い(または整数倍に近い)ことから、この中枢由来の入力の周波数がFN波の周波数と何らかの条件を満たした場合にのみ、上で見られたような適度に発火する系を再現できるような気がする。
 すなわち、このような「適度に発火する」「同期しない」の状況になるにはかなりパラメータの調整が必要そうである。そのため、(おそらく)同じ機構で働く神経細胞が様々なネットワーク・入力の下で意味のある発火を行うためには、各神経細胞がそれぞれ適度に発火するよう自分を調整するようにする仕組みが必要かなという気がする。それはパラメータ調節かもしれないし、入力がなくても発火するようなものかもしれないし、そこは神経生理学の教科書などを読まないとだめそうである。

今後の課題
・上のモデルに色んな変化いれて棘徐波ができないか試す
・全く入力が無い神経細胞は発火するか調べる
・FNモデルのパラメータをいじったときの波形の変化
・色んな自動調節機構を創作する 調べながら考える

2018年10月16日火曜日

何もしてないのに仮想環境が壊れた(機械弱者)

 諸々の解析ソフトがWindows未対応なため、解析時にはVirtualBoxでUbuntu16.04を立ち上げて解析を行っている。しかしその仮想環境がある日突如立ち上がらなくなるということが過去たびたびあり、そのたびに仮想環境ごと削除して一から環境構築をすることにより消極的解決を行ってきた。
 そして本日、再び仮想環境が立ち上がらなくなった。また一から環境構築しようかとも思ったのだが、環境構築が面倒な解析ソフトが以前より増えていたため、再度一から環境構築をするのはあまりにも面倒に感じた。そのため、仮想環境が完全に破壊されたらそれはそれでいいや(鼻ホジ)くらいの気概で、仮想環境の再生に取り組んだ次第。バックアップさまさまですな。

 起動時ターミナルがこちら




 "Welcome to emergency mode!" がパーティの司会風に脳内再生されるので「なにがウェルカムじゃこの」という気分になった。
 'journalctl -xb'でログを見たところ、上の画像の頭に表示されているエラー2点に加えて、共有フォルダがマウントできないエラーが吐かれていた。そこでVirtualBoxの設定から共有フォルダの共有設定を全て削除したり戻したりしたが、該当エラーは消えなかったので一旦保留。

 "Failed to start load kernel modules"でググったところ、多くの人が"apt-get update"と"dpkg --configure -a"あたりのコマンドをしろと言っていたので、ひとまず実行して再起動したが変化なし。そのまま色々ググって見回っていたら、このサイトにこんな記述がされていた。

'Remember it's quite common to have to repeat the above commands in no specific order'

繰り返せと(笑)
 他にやれることがあるわけでもないので、上記サイトに書かれた通りひたすら4コマンドと再起動を繰り返した。(5, 6周くらい?) 途中、文字化けにより真偽は不明だが、" 'sudo apt-get autoremove'しろ"と言われてそうな時には'sudo apt-get autoremove'を実行し、"/var/lib/dpkg/lockをopenできない"と言ってそうな時には'sudo rm /var/lib/dpkg/lock'を実行した。
 また途中わけわからんタイミングでGUI起動して完全に文字化けした何かが表示されたことがあった。エスケープ押したら<♦♦>と<♦♦♦>の2択になったので、無難にNOっぽい2文字の方選択したらターミナルに戻ったけど、あれなんだったんやろ(ヤケになりすぎてスクショ撮り損ねた)

 さすがに飽きてきたななどと思った矢先の起動画面がこちら。



1行目消えた!まじで繰り返して消えんのかよ!

 次のエラーについてググってたらまたさっきの4コマンドのうちの一つが解決策として書かれていたので実行するなどしたところ



増えた(笑)

 その後、ググリ着いたこのサイトの記載通りにコマンド実行し、再起動した起動画面がこちら。



消えた~!しかし起動しない。「頭の2行のエラーによってemergency modeになっている」と思いこんでいたが、どうやらそうではないらしいということが判明する。
 残すは共有フォルダの問題しかない。"Welcome to emergency mode"でググってこのサイトに行きつき、vimで/etc/fstabを開いてみた。



 この時、共有フォルダ 'share' はVirtualBoxマネージャーから共有を外していたので、「shareについての記述があるのはおかしい!(決めつけ)」と判断し、行ごと削除して保存。そして一旦仮想環境をシャットダウンし、VirtualBoxマネージャーから再度共有フォルダに'share'を設定して、そして起動!


 ログイン画面出た!中身もそっくりそのまま残っていました。めでたしめでたし。


 さて、振り返ってみると、実は最後の共有フォルダの設定だけが問題だったのではないかという気がしてくる。そういわれてみると、正常にログインできていた頃も起動時に数行エラーを吐かれていた気がしないでもない。もう復活してしまったので試せないのだが、同じような使い方していれば定期的に仮想環境が壊れる()ので、次の機会には共有フォルダの件だけで解決するかどうかを試そうと思う。またその場合には何故共有フォルダの設定が狂ったのかが不明だが、これは先日のWindows自動更新によるものだと信じたい。

 決して!俺は!何もしていない!(機械弱者)

2018年10月9日火曜日

Sample Entropyで遊ぶ

(Sample Entropyの日本語ソースがあまりに少ないので最初に断っておくと、ただの学生の遊びブログなのであまりあてにしないでいただければと。)
(むしろ詳しい人いたら教えてください。)

 時系列データのエントロピーを示すSample Entropyという指標に出会ったので遊んでみる。長さNの時系列データ U={u(1), u(2), ... , u(N)}と、定数m(通常m=2)とした時、Sample Entropyは次のようにして求める。

(1) x(i)={u(i), ... , u(i+m-1)}とし、X={x(1), x(2), ... , x(N-m+1)}を得る。
(2) Ci(r)を求める。Ci(r)=(d[x(i), x(j)<r] となるjの数(i≠j))/(N-m+1) (ただしd[a, b]はa, bのChebyshev distance)(r=0.2*データの標準偏差)
(3) Φm(r)を求める。Φm(r)=Σ[i=1, N-m]Ci(r)/(N-m)
(4) 同様にΦm+1(r)を求める。
(5) SampEn=ln[Φm(r)/Φm+1(r)]

 現時点で不明点は2つ。
 なぜmを1足したものとの関係を考えることでエントロピーと扱えると考えたのかがわからない。これについてはSample Entropyの元となったApproximate Entropy以前へ遡らなければならなさそうなので今後の課題ということで。
 2点目は、近年の文献では上に示したようなΦmとΦm+1の比の対数を取っているが、Richman(2000)では分母が揃うようにした二つの微妙に異なるAi, Biの比の対数を取っていた。Nがある程度大きければ「あんま変わんないんじゃね?」という話にでもなったのだろうか。当然誤読の可能性も十分にある。こちらも今後の課題。
 とりあえず以下ではΦmを用いた方法でSample Entropyを計算した。色んなデータを与えてどうSample Entropyが変化するかをみてみる。

(1)正弦波の振幅変化
 信号源を x=k*sin(T) とし、このkを変化させた時に、0.1秒間隔でサンプリングしたデータのSample Entropyを調べた。k=[1, 2, ... , 10]


 一定。rが標準偏差に合わせて変化するので、振幅の影響は基本的にはないということですな。

(2)正弦波の周波数変化
 信号源を x=sin(k*T)とし、このkを変化させた時に、0.1秒間隔でサンプリングしたデータのSample Entropyを調べた。k=[1, 2, ... , 10]


 ある値を境に大きく変化するというのは違和感があるので、もう少し多くのkで調べてみる。k=[1, 2, ... , 100]としてみる。


 信号源が正弦波であることにより「たまたまSample Entropyが大きくなるような信号値の並びになった」やその逆が起きることで乱高下していると思われる。こんなキッチリ周期的な信号源というのは現実的ではないのであまり気にしなくてもいいと思うが、一応周波数変化により乱高下することが「ありうる」ということは知っておいていいかもしれない。また周波数変化は「時間軸の伸び縮み」と同義なので、異なる時系列データのSample Entropyを比較するには、サンプリング間隔をそろえる必要はありそう。

(3) サンプリング数の変化
 信号源を x=sin(T)とし、0.1秒間隔でサンプリングするデータ数Nを変化させた時のSample Entropyを調べた。N=[200, 300, ... , 1000]


 Sample Entropyはその元となったApproximate Entropyに比べて「データ数の影響を受けにくい」と記述されていた気がするが、このデータでは漸減している。現実データではあまり影響しないのかもしれないが、時系列データを比較する際にはデータ数もそろえた方が無難そう。Nは出来れば1000以上がよいとしていた文献があったのだが、確かに1000を超えてこればだいぶ安定しそうではある。

(4) 正弦波を重ね合わせた信号源
 信号源を x=Σ[i=1, k]sin(i(T+δi))/k とし 0.1秒間隔でサンプリングしたデータのSample Entropyを調べた。重ね合わせる正弦波の始点をそろえると信号のバリエーションが少ないので、要素sin(iT)/kをそれぞれ[0, 2π/i]からランダムに選択したδiだけ平行移動させた。乱数を用いるため、各kで20回ずつ実行して求めたSample Entropyを平均したものを用いた。k=[1, 2, ... , 30]


かなりきれいに上昇してくれてとてもうれしい気持ちになった。
(5) 階段関数
 正弦波ばかりで飽きたので、階段関数を解析してみる。信号源x=T%k (T=[1, 2, ... , N])、サンプリング間隔は1、N=200、k=[2, 3, ... , 30]


 ファッ!?と思ったが、rが1を超えたことで一気に増加しただけでした。これも現実データではあまりないと思われるが、解析に際してrを多少上下させてみる必要はあるかもしれない。


 このSample Entropyを身体動作や心電図、脳波で計算して、「加齢でエントロピーが~」みたいな研究がいくつか見られるが、上で述べたように「mとm+1の場合を比較することで何故エントロピーといえるのかがわからない」ので、現時点ではあまりパッとしないなぁという印象。ここがすっきり解決してこれがほんまにエントロピーだと言えそうということになったら、解釈についてもすっきりしそうではある。

上記を実行したjupyter notebookはコチラ

2018年10月6日土曜日

ボーダーライン再考

 昨年末の総合試験前、「点数を伸ばすことによって"マイナス k SD"のボーダーラインを下げる人の条件」を、平均M、標準偏差SDとして「点数でM+SD/k以上 (偏差値で50+10/k以上) の人」と考えたら、次のような指摘が来ていた。


その後ウーンと考えていたまま忘れ去っていたのをふと思い出し、どこが間違っていたのか結局わかっていないので、導出過程を貼っておいてまたコメントでももらおうという記事です。前回のコメ主でも通りすがりの人でも誰でもいいのでご指摘ください。