用matlab通过感知器算法程序实现2分类

代码直接复制到matlab就可以直接运行,如下:

%编写感知器算法程序,求下列模式分类的解向量:(三维,8个样本,二分类的题)
%8个样本分别是
x1=[0;0;0],x2=[1;0;0],x3=[1;0;1],x4=[1;1;0]
x5=[0;0;1],x6=[0;1;1],x7=[0;1;0],x8=[1;1;1]
%放入一个2维数组里面,方便计算
x=[[0;0;0],[1;0;0],[1;0;1],[1;1;0],[0;0;1],[0;1;1],[0;1;0],[1;1;1]]
%初始w
w1=[-1,-2,-2,0]
%转变成增广向量
x(4,:)=1
x1=x
%属于第二类样本*(-1)
for i=5:8
    x1(:,i)=-1*x1(:,i)
end

% 初始化参数,c是校正增量,这里设置为1,W是存储每次更新后的权向量参数w,
% D表示存储计算准则函数后的结果
% flag:表示如果准则函数为大于0的值,就会+1,一共8个样本,一轮过后如果都满足要求的话
%       flag=8,则可以退出循环了,如果不满足的话,就会flag清零,并继续迭代
% j表示迭代数次数

c=1
W=[]
D=[]
flag=0
j=0
while flag<8 %记录是否都大于0
    for i =1:8
        d = w1*x1(:,i);

        if d <= 0
            w1 = w1 + c*x1(:,i).';
        else
            w1 = w1;
            flag = flag+1
        end
        W = [W;w1];
        D = [D;d]
    end
    j=j+1 
    if flag<8
        flag=0
    end
end
%画图,x,y都取值在[-1,1],去了50个
x3 = linspace(-1,1,50);
y3 = x3; %设置y轴范围
[X,Y] = meshgrid(x3,y3); %将其x,y轴网格化
%由得出的w1将公式化简得到Z
Z3=(1+3*X-2*X)/3
%绘制曲面
Fig = mesh(X,Y,Z3); %绘制三维曲面图
hold on;%保留图形
%将样本点画在幕布上,实心点
x2=x(1,:);y2=x(2,:);z=x(3,:);
scatter3(x2,y2,z,'filled')%散点图
saveas(gcf,'result.jpg');

结果如图所示:

猜你喜欢

转载自blog.csdn.net/lishijie258/article/details/124043026