漂流するニューラル・ネット

 投稿者:SECOND  投稿日:2009年 1月18日(日)11時12分0秒
  !
! 漂流するニューラル・ネット(更新)再投稿
!
!----
OPTION ARITHMETIC NATIVE
OPTION BASE 0
SET WINDOW -10,10, 20,0
SET TEXT background "OPAQUE"
!
DIM E(99),R(99),theta(99),F(99)
DIM Y(99),X(99),NetWork(99,99)
DIM P_(1 TO 5, 99),Px(99)
DIM Sum(1 TO 5)
MAT READ P_
! 1)
DATA 1,1,0,0,0,0,0,0,1,1
DATA 1,1,1,0,0,0,0,1,1,1
DATA 0,1,1,1,0,0,1,1,1,0
DATA 0,0,1,1,1,1,1,1,0,0
DATA 0,0,0,1,1,1,0,0,0,0
DATA 0,0,0,0,1,1,1,0,0,0
DATA 0,0,1,1,1,1,1,1,0,0
DATA 0,1,1,1,0,0,1,1,1,0
DATA 1,1,1,0,0,0,0,1,1,1
DATA 1,1,0,0,0,0,0,0,1,1
! 2)
DATA 0,0,0,0,0,1,0,0,0,0
DATA 0,0,0,0,1,1,1,0,0,0
DATA 0,0,0,0,1,1,1,0,0,0
DATA 0,0,0,1,1,1,1,1,0,0
DATA 0,0,0,1,1,0,1,1,0,0
DATA 0,0,1,1,1,0,1,1,1,0
DATA 0,0,1,1,0,0,0,1,1,0
DATA 0,1,1,1,0,0,0,1,1,1
DATA 0,1,1,1,1,1,1,1,1,1
DATA 0,1,1,1,1,1,1,1,1,1
! 3)
DATA 0,0,1,1,1,0,0,0,1,1
DATA 0,1,1,1,1,1,1,1,1,1
DATA 1,1,1,0,1,1,1,1,0,0
DATA 1,1,0,0,0,1,1,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,1,1,0,0,0,1,1
DATA 0,0,1,1,1,1,0,1,1,1
DATA 1,1,1,1,1,1,1,1,1,0
DATA 1,1,0,0,0,1,1,1,0,0
DATA 0,0,0,0,0,0,0,0,0,0
! 4)
DATA 0,0,1,0,0,0,0,1,0,0
DATA 0,0,1,1,0,0,1,1,0,0
DATA 0,0,1,1,1,1,1,1,0,0
DATA 0,0,1,1,1,1,1,1,0,0
DATA 0,0,1,1,1,1,1,1,0,0
DATA 0,1,1,1,1,1,1,1,1,0
DATA 1,1,1,1,1,1,1,1,1,1
DATA 0,0,0,1,1,1,1,0,0,0
DATA 0,0,0,0,1,1,1,0,0,0
DATA 0,0,0,0,0,1,0,0,0,0
! 5)
DATA 0,0,0,0,1,1,0,0,0,0
DATA 0,1,1,0,1,1,0,1,1,0
DATA 0,1,0,0,1,1,0,0,1,0
DATA 0,0,0,0,1,1,0,0,0,0
DATA 1,1,1,1,1,1,1,1,1,1
DATA 1,1,1,1,1,1,1,1,1,1
DATA 0,0,0,0,1,1,0,0,0,0
DATA 0,1,1,0,1,1,0,1,1,0
DATA 0,1,1,0,1,1,0,1,1,0
DATA 0,0,0,0,1,1,0,0,0,0

!----- 初期値サンプル1(感で探すのは無理かも。)
! MAT theta=(-1.27)*CON
! LET Af=1.6
! LET Kr=0.92
! LET Kf=0.4
! LET Ei=-10
!
!----- 初期値サンプル2
MAT theta=ZER ! ニューロン不応の固定成分 (しきい値)
LET Af=1 ! ニューロン自身の感度を不応にする負性の自己帰還結合係数 と、
LET Kr=0.95 ! その減衰定数(0< ,< 1)
LET Kf=0.4 ! ニューロンが、他のニューロンから受ける相互結合の減衰定数(0< ,< 1)
LET Ei=-100 ! 2値化関数、S字形 sigmoid() の入力係数
!
!----- 引き金となる相互結合の刺激の作成(無信号からの励起はできない。)
RANDOMIZE !15 !6
DO
   LET j=0
   FOR i=0 TO 99
      LET F(i)=RND-0.5
      LET j=j+F(i)
   NEXT i
LOOP UNTIL ABS(j)< .002
!
!----- 環境の準備
SET LINE COLOR 2
FOR n_=1 TO 5
   LET w=0
   !----- サンプル・パターンの表示
   FOR j=0 TO 9
      FOR i=0 TO 9
         IF P_(n_,j*10+i)>0 THEN
            DRAW circle WITH SCALE(0.03)*SHIFT(i*.08-9, j*.08+n_+.9)
            LET w=w+1
         END IF
      NEXT i
   NEXT j
   PLOT TEXT,AT -6,n_+1.5:"Dots/Body="&STR$(w)&"/100"
   PLOT TEXT,AT -8,n_+1.5:":"&STR$(Sum(n_))
   LET DC=w/100 ! 平均値(直流成分)
   !-----
   ! 5つのパターンの平均値からの偏差(交流成分)を、
   ! 1つの行列 NetWork(,) の中に、埋め込む。相互結合係数の行列 作成。
   !
   !              5 (p) _  (p) _
   ! 共分散行列の作成 ωij=Σ(χi-χ)*(χj-χ)  …参照。
   !            p=1
   !-----

   FOR i=0 TO 99
      FOR j=0 TO 99
         LET NetWork(i,j)=NetWork(i,j)+(P_(n_,i)-DC)*(P_(n_,j)-DC)
      NEXT j
   NEXT i
NEXT n_
!-----
! 5つが、自己の共分散の形で合算され、1つなった行列 NetWork(,) で、
! 100個のニューロンを接続し、漂流させると・・・
!
! ( 周期の無い計算ですが、演算桁の制限による丸めのために、周期的
!   動作へ落ちています・・長々と、漂着しないときは、Run しなおす。)
!
!-----
PLOT TEXT,AT -9, 1:"漂流するニューラル・ネット"
PLOT TEXT,AT -9, 9:"右クリックで 終了"
PLOT TEXT,AT -9,10:"左クリック STOP/START"
SET LINE COLOR 1
DO
   DO
      LET T=T+1
      PLOT TEXT,AT -9,8:"t="&STR$(T)
      CALL DispX
      CALL Compare
      CALL Xi00
      MOUSE POLL mx,my,mlb,mrb
      WAIT DELAY 0
   LOOP UNTIL mlb=1 OR mrb=1
   !----- left click stop/start
   IF mlb=1 THEN
      DO
         WAIT DELAY 0.02
         MOUSE POLL mx,my,mlb,mrb
      LOOP UNTIL mlb=0
      DO
         WAIT DELAY 0.02
         MOUSE POLL mx,my,mlb,mrb
      LOOP UNTIL mlb=1 OR mrb=1
      WAIT DELAY 0.1
   END IF
   !----- right click stop end.
LOOP UNTIL mrb=1

!----- 各ニューロン0~99 の駆動
SUB Xi00
   FOR i=0 TO 99
      LET w=0
      FOR j=0 TO 99
         LET w=w+NetWork(i,j)*X(j)
      NEXT j
      LET F(i)=Kf*F(i)+w
      LET R(i)=Kr*(R(i)+theta(i))-Af*X(i)-theta(i)
      LET Y(i)=R(i)+F(i)
   NEXT i
   FOR i=0 TO 99
      IF Ei*Y(i)< 709 THEN ! 桁あふれ防止
         LET X(i)=1/(1+EXP(Ei*Y(i)))
      ELSE
         LET X(i)=1/(1+EXP(709))
      END IF
   NEXT i
END SUB

!----- 各ニューロンの出力 X(0~99) 発火の、画面表示。
SUB DispX
   SET DRAW mode hidden
   SET AREA COLOR 0
   PLOT AREA:-10,10; 0,10; 0,0; 10,0; 10,20;-10,20
   SET AREA COLOR 2 ! //fire
   FOR V=0 TO 9
      FOR H=0 TO 9
         LET i=V*10+H
         IF 0.5=< X(i) THEN
            PLOT AREA: H,V; H+1,V; H+1,V+1; H,V+1
            LET Px(i)=1
            SET COLOR MIX(0) 0,1,1 ! B.G.color cyan( text)
         ELSE
            PLOT LINES: H,V; H,V+1; H+1,V+1
            LET Px(i)=0
            SET COLOR MIX(0) 1,1,1 ! B.G.color 0
         END IF
         !----- ニューロンの内部(-~0~+) 0=< は発火
         PLOT TEXT,AT H*2-10, V*0.8+12, USING"###.###":Y(i)
      NEXT H
   NEXT V
   SET COLOR MIX(0) 1,1,1 ! B.G.color 0
   SET DRAW mode explicit
END SUB

!----- 生成パターンの分別 計数の、画面表示。
SUB Compare
   FOR n_=1 TO 5
      FOR i=0 TO 99
         IF P_(n_,i)<>Px(i) THEN EXIT FOR
      NEXT i
      IF 99< i THEN
      ! ----- 一致
         LET PC_=10 ! //timer ON 1st.to 2nd.Cursor
         IF PB_=n_ THEN EXIT SUB
         IF PN_>0 THEN PLOT TEXT,AT -8, PN_+1.5: ":"& STR$(Sum(PN_))& " " ! //old 1st.2nd.Cursor OFF
         LET PB_=n_ ! //flag 2nd.Cursor
         LET PN_=n_ ! //flag 1st.Cursor
         LET Sum(n_)=Sum(n_)+1 ! 計数
         SET COLOR MIX(0) 0,1,1 ! //new 1st.Cursor ON (B.G.color)
         PLOT label,AT -8, n_+1.5: ":"& STR$(Sum(n_))& " "
         SET COLOR MIX(0) 1,1,1
         beep
         EXIT SUB
         !-----
      END IF
   NEXT n_
   ! ----- 不一致
   IF PB_=0 THEN EXIT SUB
   IF PC_>1 THEN
      LET PC_=PC_-1
      EXIT SUB
   END IF
   SET COLOR MIX(0) .75,.75,.75 ! //new 2nd.Cursor ON (B.G.color)
   PLOT TEXT,AT -8, PB_+1.5: ":"& STR$(Sum(PB_))& " "
   SET COLOR MIX(0) 1,1,1
   LET PB_=0
END SUB

END
 

戻る