十進BASIC 第3掲示板

十進BASIC第3掲示板

十進BASICプログラミングについての質問や研究成果の公開にご利用ください。
メッセージ入力枠は右下をドラッグして拡大できます。 画像,URLは省略可能です。
編集/削除キーを入力しなくてもエラーにはなりませんが,何か適当な半角英数字4~8文字を指定してください。
特に,長文投稿の場合,プレビューで最後の行を確認しても,実際には途中で切れてしまうことがあるので,投稿後の確認が必要です。

機械学習 - しばっち

2022/09/04 (Sun) 15:02:37

ここでは X=0なら1、X=1なら0となるNOT演算を教師データありで学習させます。

300回学習させてNOT演算を求めます。
不正解の時は係数(WEIGHT,BIAS)を修正しています。
前半は不正解が目立ちますが、後半ではそれが少なくなります。
このことは「学習が進んでいる」からと言えるかと思います。

学習後は正答率を表示して学習データを検証します。
それが全て正解していれば、学習は成功し間違っていれば失敗したと言えるかと思います。
最後に学習した係数を表示して終わります。

RANDOMIZE
DIM Y(2),X(2)
LET X(1)=0
LET X(2)=1
LET RATE=1/64 ! 学習率
LET N=300 ! 学習回数
LET Y(1)=BITAND(BITNOT(X(1)),1) ! 教師データ(正解データ) NOT演算
LET Y(2)=BITAND(BITNOT(X(2)),1)
LET WEIGHT=RND ! WEIGHT 初期値
LET BIAS=RND ! BIAS 初期値
FOR I=1 TO N
LET M=INT(RND*2+1)
LET XX=X(M)
LET YY=H(XX*WEIGHT+BIAS) ! 予測値
IF M=1 AND YY<>Y(1) THEN ! 正解と違うなら係数修正
LET BIAS=BIAS+RATE
END IF
IF M=2 AND YY<>Y(2) THEN
LET WEIGHT=WEIGHT-RATE
LET BIAS=BIAS-RATE
END IF
PRINT I;":";XX;"の時、予測値";YY;"正解値";Y(M);
IF YY=Y(M) THEN
PRINT "(正解)"
LET HIT=HIT+1
ELSE
PRINT "(不正解)"
LET MISS=MISS+1
END IF
NEXT I
PRINT "正答率";HIT/N
!!PRINT "誤答率";MISS/N
FOR I=1 TO 2 ! 学習データの検証
LET YY=H(X(I)*WEIGHT+BIAS)
PRINT X(I);"の時 NOT演算";YY;
IF YY=Y(I) THEN PRINT "(正解)" ELSE PRINT "(不正解)"
NEXT I
PRINT WEIGHT;BIAS ! 係数表示
END

EXTERNAL FUNCTION H(X) !活性化関数(ステップ関数)
IF X>0 THEN LET H=1 ELSE LET H=0
END FUNCTION
---------------------------------------------------------------------------------------------------------
次はAND演算です。
入力を2系統にし1000回学習させています。
上と同じように学習後は正答率を表示して学習したデータを検証し
最後に係数を表示して終わります。

RANDOMIZE
DIM Y(4),X1(4),X2(4)
FOR I=1 TO 4
READ X1(I),X2(I)
NEXT I
DATA 0,0
DATA 0,1
DATA 1,0
DATA 1,1
LET RATE=1/64 ! 学習率
LET N=1000 ! 学習回数
FOR I=1 TO 4
LET Y(I)=BITAND(X1(I),X2(I)) ! 教師データ(正解データ) AND演算
NEXT I
LET WEIGHT=RND ! WEIGHT 初期値
LET BIAS=RND ! BIAS 初期値
FOR I=1 TO N
LET M=INT(RND*4+1)
LET YY=H(X1(M)*WEIGHT+X2(M)*WEIGHT+BIAS) ! 予測値
IF M=1 AND YY<>Y(1) THEN ! 正解と違うなら係数修正
LET BIAS=BIAS-RATE
END IF
IF M=2 AND YY<>Y(2) THEN
LET BIAS=BIAS-RATE
END IF
IF M=3 AND YY<>Y(3) THEN
LET WEIGHT=WEIGHT-RATE
LET BIAS=BIAS-RATE
END IF
IF M=4 AND YY<>Y(4) THEN
LET WEIGHT=WEIGHT+RATE
LET BIAS=BIAS+RATE
END IF
PRINT I;":";X1(M);"-";X2(M);"の時、予測値";YY;"正解値";Y(M);
IF YY=Y(M) THEN
PRINT "(正解)"
LET HIT=HIT+1
ELSE
PRINT "(不正解)"
LET MISS=MISS+1
END IF
NEXT I
PRINT "正答率";HIT/N
!!PRINT "誤答率";MISS/N
FOR I=1 TO 4 ! 学習データの検証
LET YY=H(X1(I)*WEIGHT+X2(I)*WEIGHT+BIAS)
PRINT X1(I);"-";X2(I);"の時 AND演算";YY;
IF YY=Y(I) THEN PRINT "(正解)" ELSE PRINT "(不正解)"
NEXT I
PRINT WEIGHT;BIAS ! 係数表示
END

EXTERNAL FUNCTION H(X) ! 活性化関数(ステップ関数)
IF X>0 THEN LET H=1 ELSE LET H=0
END FUNCTION
---------------------------------------------------------------------------------------------------------
上のプログラムと非常に似ていますが、次はOR演算を学習させています。


RANDOMIZE
DIM Y(4),X1(4),X2(4)
FOR I=1 TO 4
READ X1(I),X2(I)
NEXT I
DATA 0,0
DATA 0,1
DATA 1,0
DATA 1,1
LET RATE=1/64 ! 学習率
LET N=1000 ! 学習回数
FOR I=1 TO 4
LET Y(I)=BITOR(X1(I),X2(I)) ! 教師データ(正解データ) OR演算
NEXT I
LET WEIGHT=RND ! WEIGHT 初期値
LET BIAS=RND ! BIAS 初期値
FOR I=1 TO N
LET M=INT(RND*4+1)
LET YY=H(X1(M)*WEIGHT+X2(M)*WEIGHT+BIAS) ! 予測値
IF M=1 AND YY<>Y(1) THEN ! 正解と違うなら係数修正
LET BIAS=BIAS-RATE
END IF
IF M=2 AND YY<>Y(2) THEN
LET BIAS=BIAS+RATE
END IF
IF M=3 AND YY<>Y(3) THEN
LET WEIGHT=WEIGHT+RATE
LET BIAS=BIAS+RATE
END IF
IF M=4 AND YY<>Y(4) THEN
LET WEIGHT=WEIGHT+RATE
LET BIAS=BIAS+RATE
END IF
PRINT I;":";X1(M);"-";X2(M);"の時、予測値";YY;"正解値";Y(M);
IF YY=Y(M) THEN
PRINT "(正解)"
LET HIT=HIT+1
ELSE
PRINT "(不正解)"
LET MISS=MISS+1
END IF
NEXT I
PRINT "正答率";HIT/N
!!PRINT "誤答率";MISS/N
FOR I=1 TO 4 ! 学習データの検証
LET YY=H(X1(I)*WEIGHT+X2(I)*WEIGHT+BIAS)
PRINT X1(I);"-";X2(I);"の時 OR演算";YY;
IF YY=Y(I) THEN PRINT "(正解)" ELSE PRINT "(不正解)"
NEXT I
PRINT WEIGHT;BIAS ! 係数表示
END

EXTERNAL FUNCTION H(X) ! 活性化関数(ステップ関数)
IF X>0 THEN LET H=1 ELSE LET H=0
END FUNCTION
---------------------------------------------------------------------------------------------------------
最後にXOR演算ですが残念ながら
このプログラムではXOR演算は求められません(※XORが非線形のため学習に失敗します)

RANDOMIZE
DIM Y(4),X1(4),X2(4)
FOR I=1 TO 4
READ X1(I),X2(I)
NEXT I
DATA 0,0
DATA 0,1
DATA 1,0
DATA 1,1
LET RATE=1/64 ! 学習率
LET N=1000 ! 学習回数
FOR I=1 TO 4
LET Y(I)=BITXOR(X1(I),X2(I)) ! 教師データ(正解データ) XOR演算
NEXT I
LET WEIGHT=RND ! WEIGHT 初期値
LET BIAS=RND ! BIAS 初期値
FOR I=1 TO N
LET M=INT(RND*4+1)
LET YY=H(X1(M)*WEIGHT+X2(M)*WEIGHT+BIAS) ! 予測値
IF M=1 AND YY<>Y(1) THEN ! 正解と違うなら係数修正
LET BIAS=BIAS-RATE
END IF
IF M=2 AND YY<>Y(2) THEN
LET BIAS=BIAS+RATE
END IF
IF M=3 AND YY<>Y(3) THEN
LET WEIGHT=WEIGHT+RATE
LET BIAS=BIAS+RATE
END IF
IF M=4 AND YY<>Y(4) THEN
LET WEIGHT=WEIGHT-RATE
LET BIAS=BIAS-RATE
END IF
PRINT I;":";X1(M);"-";X2(M);"の時、予測値";YY;"正解値";Y(M);
IF YY=Y(M) THEN
PRINT "(正解)"
LET HIT=HIT+1
ELSE
PRINT "(不正解)"
LET MISS=MISS+1
END IF
NEXT I
PRINT "正答率";HIT/N
!!PRINT "誤答率";MISS/N
FOR I=1 TO 4 ! 学習データの検証
LET YY=H(X1(I)*WEIGHT+X2(I)*WEIGHT+BIAS)
PRINT X1(I);"-";X2(I);"の時 XOR演算";YY;
IF YY=Y(I) THEN PRINT "(正解)" ELSE PRINT "(不正解)"
NEXT I
PRINT WEIGHT;BIAS ! 係数表示
END

EXTERNAL FUNCTION H(X) ! 活性化関数(ステップ関数)
IF X>0 THEN LET H=1 ELSE LET H=0
END FUNCTION
---------------------------------------------------------------------------------------------------------
以下は正解データでの検証になります
https://ja.wikipedia.org/wiki/活性化関数

PRINT "NOT"
FOR X=0 TO 1
PRINT X;":";H(-X+.5);BITAND(BITNOT(X),1)
NEXT X
PRINT "AND"
FOR X2=0 TO 1
FOR X1=0 TO 1
PRINT X1;"-";X2;":";H(X1+X2-1.5);BITAND(X1,X2)
NEXT X1
NEXT X2
PRINT "OR"
FOR X2=0 TO 1
FOR X1=0 TO 1
PRINT X1;"-";X2;":";H(X1+X2-.5);BITOR(X1,X2)
NEXT X1
NEXT X2
PRINT "XOR"
FOR X2=0 TO 1
FOR X1=0 TO 1
PRINT X1;"-";X2;":";H(X1+X2-2*H(X1+X2-1.5)-.5);BITXOR(X1,X2)
NEXT X1
NEXT X2
END

EXTERNAL FUNCTION H(X) ! ステップ関数
IF X>0 THEN LET H=1 ELSE LET H=0
END FUNCTION

Re: 機械学習 - しばっち

2022/09/19 (Mon) 14:38:21

プログラムを少し訂正してみました。
上記プログラム同様にビット演算を学習させていますが
XORはやはり失敗します。

また活性化関数を幾つか用意しました。

検証では予測値の50%以下を"0"
50%より大きいと"1"としています。

RANDOMIZE
DIM Y(4),X1(4),X2(4)
FOR I=1 TO 4
READ X1(I),X2(I)
LET Y(I)=BITAND(X1(I),X2(I)) ! 教師データ AND演算
! LET Y(I)=BITAND(BITNOT(BITAND(X1(I),X2(I))),1) ! 教師データ NAND演算
! LET Y(I)=BITOR(X1(I),X2(I)) ! 教師データ OR演算
! LET Y(I)=BITAND(BITNOT(BITOR(X1(I),X2(I))),1) ! 教師データ NOR演算
! LET Y(I)=BITAND(IMP(X1(I),X2(I)),1) ! 教師データ IMP演算
! LET Y(I)=BITXOR(X1(I),X2(I)) ! 教師データ XOR演算(失敗します)
NEXT I
DATA 0,0
DATA 0,1
DATA 1,0
DATA 1,1
LET RATE=1/16 ! 学習率
LET WEIGHT1=RND
LET WEIGHT2=RND
LET BIAS=RND
FOR I=1 TO 1000
LET N=INT(RND*4+1)
LET YY=ACT(X1(N)*WEIGHT1+X2(N)*WEIGHT2+BIAS)
LET ERR=YY-Y(N) ! 誤差
LET BIAS=BIAS-RATE*ERR
LET WEIGHT1=WEIGHT1-RATE*ERR*X1(N)
LET WEIGHT2=WEIGHT2-RATE*ERR*X2(N)
PRINT I;":";X1(N);"-";X2(N);"の時、予測値";YY;" 正解値";Y(N)
NEXT I
FOR I=1 TO 4 ! 学習データの検証
PRINT X1(I);"-";X2(I);"の時 ";
LET YY=ACT(X1(I)*WEIGHT1+X2(I)*WEIGHT2+BIAS)
IF YY>.5 THEN PRINT 1; ELSE PRINT 0; ! 予測値 50%より大きいなら1とする。
PRINT Y(I) ! 正解データ
NEXT I
PRINT WEIGHT1;WEIGHT2;BIAS
END

EXTERNAL FUNCTION ACT(X) ! 活性化関数
!LET ACT=H(X)
LET ACT=SIGMOID(X)
!LET ACT=RELU(X)
!LET ACT=SOFTSIGN(X)
!LET ACT=TANH(X)
END FUNCTION

EXTERNAL FUNCTION H(X) ! ステップ関数
IF X>0 THEN LET H=1 ELSE LET H=0
END FUNCTION

EXTERNAL FUNCTION SIGMOID(X) ! シグモイド関数
LET SIGMOID=1/(1+EXP(-X))
END FUNCTION

EXTERNAL FUNCTION RELU(X) ! ランプ関数
LET RELU=MAX(0,X)
END FUNCTION

EXTERNAL FUNCTION SOFTSIGN(X)
LET SOFTSIGN=X/(1+ABS(X))
END FUNCTION

EXTERNAL FUNCTION IMP(X,Y)
LET IMP=BITOR(BITNOT(X),Y) !'X IMP Y
END FUNCTION

Re: 機械学習 - しばっち

2022/09/19 (Mon) 14:42:19

回帰分析(単回帰)を機械学習と最小2乗法で求めています。


RANDOMIZE
LET N=50
CALL GINIT(800,800)
SET WINDOW -6,6,-6,6
DIM X(N),Y(N),A(2,2),B(2)
LET RATE=1/64
DRAW GRID(1,1)
LET AA=4*RND-2
LET BB=5*RND-2.5
PRINT AA;BB
FOR I=1 TO N
LET X(I)=RND*10-5
LET Y(I)=X(I)*RND*AA+RND*BB
! LET Y(I)=X(I)*AA+BB
CALL CIRCLEFULL(X(I),Y(I),.03,4)
NEXT I
LET WEIGHT=RND
LET BIAS=RND
FOR I=1 TO 300000
LET L=INT(RND*N+1)
LET YY=F(X(L),WEIGHT,BIAS)
LET ERR=Y(L)-YY !誤差
LET WEIGHT=WEIGHT+RATE*ERR*X(L)
LET BIAS=BIAS+RATE*ERR
NEXT I
SET COLOR 2 ! 赤
PLOT LINES:-6,F(-6,WEIGHT,BIAS);6,F(6,WEIGHT,BIAS)
PRINT WEIGHT;BIAS
FOR I=1 TO N
LET YY=F(X(I),BIAS,WEIGHT)
LET S=S+(Y(I)-YY)^2
NEXT I
PRINT "残差平方和 ";S

FOR I=1 TO N ! 最小2乗法
LET A(1,1)=A(1,1)+1
LET A(1,2)=A(1,2)+X(I)
LET A(2,1)=A(2,1)+X(I)
LET A(2,2)=A(2,2)+X(I)*X(I)
LET B(1)=B(1)+Y(I)
LET B(2)=B(2)+Y(I)*X(I)
NEXT I
MAT A=INV(A)
MAT B=A*B
SET LINE COLOR 7 ! 白
PLOT LINES:-6,F(-6,B(2),B(1));6,F(6,B(2),B(1))
PRINT B(2);B(1)
FOR I=1 TO N
LET YY=F(X(I),B(2),B(1))
LET SS=SS+(Y(I)-YY)^2
NEXT I
PRINT "残差平方和" ;SS
END

EXTERNAL FUNCTION F(X,A,B)
LET F=A*X+B
END FUNCTION

EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET WINDOW 0,XSIZE-1,YSIZE-1,0
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
END SUB

EXTERNAL SUB CIRCLEFULL(X,Y,RR,C)
SET COLOR C
DRAW DISK WITH SCALE(RR)*SHIFT(X,Y)
END SUB

名前
件名
メッセージ
画像
メールアドレス
URL
編集/削除キー (半角英数字のみで4~8文字)
プレビューする (投稿前に、内容をプレビューして確認できます)

Copyright © 1999- FC2, inc All Rights Reserved.