**** Create some sample data *******; data percept; do example = 1 to 20; X1 = ranuni(1827655); X2=ranuni(1827655); Y = 1 - X1 - X2; YY = -1 + 2*(Y>0); Radius = sqrt(x1*x1+x2*x2); output; end; proc print; ***** Compute sample radius *****************; proc means max; var radius; output out=R max=R; ***** Rosenblatt perceptron ***************; proc iml; use percept; read all var{x1 X2} into X; read all var{Y} into Y; read all var{YY} into YY; use R; read all var {R} into R; RR=R*R; RR=1.355254; print X Y YY R RR; W={0,0}; b=0; k=0; L=nrow(X); eta=.8; print w b k L eta; do step = 1 to 6; *** <--- stop after 6 steps max ***; mistakes=0; do i=1 to L; if Y[i, ]*(X[i, ]*W + b) <= 0 then do; W = W + eta*Y[i, ]*X[i, ]`; b = b + eta*Y[i, ]*RR; k=k+1; mistakes=mistakes+1; end; end; print W b k mistakes; end; print "Final values" W b; *** Assemble data then output to data set gdat ****; data = shape(0,20,4); do i = 1 to 20; data[i,1] = i/20; data[i,2] = -( b + W[1,1]*data[i,1])/W[2,1]; data[i,3:4] = {. 2}; end; print data; out = (X||y||YY)//data; print out; create gdat from out; append from out; *** Using gdat data, graph data and splitter ***; proc gplot data=gdat; plot col1*col2 = col4; symbol1 v=dot c=red; symbol2 v=dot c=green; symbol3 v=none i=join c=black; run; quit;