神経のネット

  • こちらから
  • ぐるりと一回りする神経細胞のネットワーク
  • ぐるりと一回りするのは「サイクル」(こちらもしくはこちら)
  • 頂点数n、辺数n
  • プログラムするときに、自身の頂点とサイクル上、前の頂点と後の頂点が問題になる
  • それを、1:nの数列で表わすと、1番とn番との処理を例外扱いする必要が出る
  • その例外扱いがソース上、読みにくいことを気にするのならば、前頂点リストと後頂点リストを作ればよい
n<-30 # ニューロン数
self<-1:n 
pre<-c(n,1:(n-1)) #ひとつ前のニューロン番号
post<-c(2:n,1) #ひとつ後のニューロン番号
  • 参照記事の活動度の計算式"a[i]<- a[i]+(a[i]-x*a[i+1]-x*a[i-1])*y"はi=1,2,...,nのすべてについて
a[i]<-a[i]+(a[i]-x*a[pre[i]]-x*a[post[i]])*y

と書き表わせる

  • この式の意味は何だろう
    • 自身の活動度a[i]は自身の“今”の活動度に次の値を加える
      • 自身の活動度と前後のニューロンの活動度の(-x)倍との和をy倍した量
    • これは、参照記事の日本語解説が目指したものなのか、ちょっと判然としない
    • 判然としないのは、説明文で定義があいまいだからのように思う
    • 以下のような設定なのか・・・不明
#ニューロンのネットワークを考える
#ニューロン数n
#ニューロンはサイクルをなす。それは1->2->...->n->1->なる並び方とする
#ニューロンは活動度aを持つ
#ニューロンは入力信号があると、入力前の活動度aに入力信号の総和を加算した活動度を持つようになる。aは連続値である
#ニューロンのaが閾値tを越えたらactiveそうでなければinactiveであるような、2値状態をとり、a<tのときにはa<-0となる
#すべてのニューロンは同じ方式で刺激を隣接するニューロンに与える
#その刺激は、ニューロンがactiveなときに伝えられ、inactiveなときには伝えられない
#その刺激は、そのニューロン自身の活動度と前後ニューロンの活動度の-x倍(xは正)とを合わせた値のy倍であるという
#すべてのニューロンには、この環状ネットワークとは別に、それぞれ、入力信号が入りうる。これを刺激入力と呼ぶ
#このサイクルは、刺激入力を受け、サイクル上で活動度の増減変化を起こす
#fb回の増減変化を経て、ある状態に至ることを確認する
#初期入力では、k番目を除くすべてのニューロンに1が、k番目にvkの値が入る場合と考える
  • 参照記事のコードのインデントは、ちょっと流儀が違うようだ
    • ループや条件で{を開いたら、それと同じインデントレベルで}で閉じる
    • ループの中は一段下げる
for(t in 1:fb){
 a[1]<- a[1]+(a[1]-x*a[2]-x*a[n])*y
 for(i in 2:(n-1)){
  a[i]<- a[i]+(a[i]-x*a[i+1]-x*a[i-1])*y
 }
 a[n]<- a[n]+(a[n]-x*a[1]-x*a[n-1])*y
 for(k in 1:n){
  if(a[k]<=threshold){
   a[k]<- 0
  }
 }
}