欢迎使用CSDN-markdown编辑器

单层感知器

一、实验原理:参见《模式识别(第四版)》(电子工业出版社)p68,例3.2

二、实验步骤:代码见code.txt

%程序思想参见《模式识别》p68,例3.2
%训练数据.其中每行的最后一位数字表示分类。
%为'1'则属于w1类,为'-1'则属于w2类。
X = [-1,0,1,1; 0,1,1,1; 0,-1,1,-1; 1,0,1,-1];   
w = [0;0;0];      %初始权值向量
p = 1;            %学习率
[row,col] = size(X);
num = 0;          %被正确分类的点的个数,一旦w有改变,则 num 清零;否则加一。

while num < row
    for i=1:1:row
        temp_x = X(i,:)';       %提取一组数据(某一行)
        xi = temp_x(1:col-1);   %提取出xi
        xi_kind = temp_x(col);  %提取出xi的分类标识
        temp = w' * xi;
        if (temp <= 0) && (xi_kind == 1)
            w = w + p*xi; 
            num = 0;
        elseif (temp >= 0) && (xi_kind == -1)
            w = w - p*xi;
            num = 0;
        else
            num = num + 1;
        end;
        if(num == row) %当所有的点都正确分类,退出循环
            break;
        end;
    end;
end;

%绘制分类线
figure;
x1 = -2:0.01:2;
x2 = (-1) * (w(1)/w(2)) * x1 ;
plot(x1,x2); % x1作为横轴
hold on;
%在图片中显示所有数据点
for i=1:1:row
    temp_x = X(i,:)';       %提取一组数据(某一行)
    xi = temp_x(1:col-1);   %提取出xi
    xi_kind = temp_x(col);  %提取出xi的分类标识
    x1 = xi(1);
    x2 = xi(2);
    if (xi_kind == 1)
        plot(x1,x2,'r.','markersize',10); %w1类的数据点用红色
    elseif (xi_kind == -1)
        plot(x1,x2,'b.','markersize',10); %w2类的数据点用蓝色
    end;
end;

三、实验结果:
欢迎使用CSDN-markdown编辑器_第1张图片
四、总结与思考:
1,数据量较大时,应存入txt 文本,所以应该采用从txt 文件中读取样本数据;
2,本次的分类函数为过原点的直线 y=x; 下一步应增加难度(数据增多,类别间距离减小)。
3,增加【训练次数、训练时间】,最后显示出来。

你可能感兴趣的:(matlab,读取文件)