Ahoj,
tak jsem si zase hrál se strojovým učením, jak rozdělit přímkou binární sadu dat v rovině (tedy něco jako ve školce "chlapečku nakresli plot mezi kravičkami a vlky"). Princip se dá najít na internetu, rovnice přímky je udělána pomocí W1*X + W2*Y + B = 0. Na začátku jsou koeficienty nulové, algoritmus najde takové, aby "červení" a "modří" byli rozděleni.
A pro ty, co si chtějí pohrát, kód je tady:
Kód:
10 INIT"CRT:M1":CLS:DIM X(30),Y(30),Z(30)
20 FOR I=1 TO 30:READ X(I),Y(I):NEXT
30 PRINT"WHICH SET TO USE (1-3) ? ";
40 GET A$:IF A$<>"1" AND A$<>"2" AND A$<>"3" THEN GOTO 40
50 PRINT A$:IF A$="2" THEN RESTORE 340
55 IF A$="3" THEN RESTORE 350
60 FOR I=1 TO 30:READ Z(I):NEXT
65 REM LEARNING CYCLE
70 W1=0:W2=0:B=0:RA=0.1
80 IT=0:ER=1
90 IF (IT=10) OR (ER=0) THEN GOTO 200
100 ER=0:IT=IT+1
110 FOR I=1 TO 30
120 RE=-1:IF W1*X(I)+W2*Y(I)+B > 0 THEN RE=1
130 IF RE=Z(I) THEN GOTO 170
140 W1=W1+RA*Z(I)*X(I)
150 W2=W2+RA*Z(I)*Y(I)
160 B=B+RA*Z(I):ER=ER+1
170 NEXT
180 PRINT"IT:";IT;" ERR:";ER;" W1:";W1;" W2:";W2;" B:";B
190 GOTO 90
200 REM SHOW POINTS AND LINE
210 CLS:FOR I=1 TO 30
220 COLOR 2,0:IF Z(I)=1 THEN COLOR 1,0
230 CIRCLE 160*(X(I)+1),100*(Y(I)+1),1:NEXT:COLOR 3,0
240 Y1=(W1-B)/W2:Y2=-(W1+B)/W2
250 X1=-1:IF Y1<-1 THEN Y1=-1:X1=(W2-B)/W1
260 X2=1:IF Y2>1 THEN Y2=1:X2=(-W2-B)/W1
270 LINE (X1+1)*160,(Y1+1)*100,(X2+1)*160,(Y2+1)*100
300 DATA 0.72,0.82,0.91,-0.69,0.46,0.8,0.03,0.93,0.12,0.25,0.96,0.47,0.79,-0.75
310 DATA 0.46,0.98,0.66,0.24,0.72,-0.15,0.35,0.01,-0.16,0.84,-0.04,0.68,-0.11,0.1,0.31
320 DATA -0.96,0.0,-0.26,-0.43,-0.65,0.57,-0.97,-0.47,-0.03,-0.72,-0.64,-0.57,0.15,-0.25
325 DATA -0.43,0.47,-0.88,-0.12,-0.9,-0.58,0.62,-0.48,0.05,-0.79,-0.92,-0.42,-0.09,-0.76,0.65,-0.77,-0.76
330 DATA -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
340 DATA -1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,1
350 DATA 1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1