|
!
! 漂流するニューラル・ネット(更新)再投稿
!
!----
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
|
|