1 %% Perceptron Regression 2 close all 3 clear 4 5 %%load data 6 x = load('ex4x.dat'); 7 y = load('ex4y.dat'); 8 9 x=ones(80,2); 10 for i=1:80 11 x(i,1)=mod(i,10); 12 x(i,2)=floor(i/10); 13 end 14 15 for i=1:80 16 if (x(i,1)+x(i,2))<10 17 y(i)=0; 18 else 19 y(i)=1; 20 end 21 end 22 23 [m, n] = size(x); 24 25 % Add intercept term to x 26 x = [ones(m, 1), x]; 27 28 %%draw picture 29 % find returns the indices of the 30 % rows meeting the specified condition 31 pos = find(y == 1); 32 neg = find(y == 0); 33 % Assume the features are in the 2nd and 3rd 34 % columns of x 35 figure('NumberTitle', 'off', 'Name', '感知机'); 36 plot(x(pos, 2), x(pos,3), '+'); 37 hold on; 38 plot(x(neg, 2), x(neg, 3), 'o'); 39 40 %进行初始化 41 s = 1; % 标识符,当s=0时,表示迭代终止 42 n = 0; % 表示迭代的次数 43 N = 10000; %定义N为最大分类判别次数,判别次数超过此值则认定样本无法分类。 44 w= [0,0,0]'; % 取权向量初始值 45 46 % 开始迭代 47 while s 48 J = 0; % 假设初始的分类全部正确 49 for i = 1:size(pos) 50 if (x(pos(i),:)*w)<=0 % 查看x1分类是否错误,在x属于w1却被错误分类的情况下,w'x<0 51 w = w+x(pos(i),:)';% 分类错误,对权向量进行修正 52 J = 1; % 置错误标志位为1 53 end 54 end 55 for i = 1:size(neg) 56 if (x(neg(i),:)*w)>=0 % 查看x2分类是否错误,在x属于w2却被错误分类的情况下,w'x>0 57 w = w-x(neg(i),:)';% 分类错误,对权向量进行修正 58 J = 1; % 置错误标志位为1 59 end 60 end 61 if J==0 % 代价为0,即分类均正确 62 s = 0; % 终止迭代 63 end 64 n = n+1; % 迭代次数加1 65 if n == N 66 s=0; 67 end 68 end 69 70 w=[1;w(2)/w(1);w(3)/w(1)]; 71 72 %%Calculate the decision boundary line 73 plot_x = [min(x(:,2)), max(x(:,2))]; 74 plot_y = (-1./w(3)).*(w(2).*plot_x +w(1)); 75 plot(plot_x, plot_y) 76 legend('Admitted', 'Not admitted', 'Decision Boundary') 77 hold off