基于感知器算法的手写数字识别matlab实现

基于感知器算法的手写数字识别

% --------------------------------------------------------------------
% 感知器算法
% --------------------------------------------------------------------
load('template.mat');
img=imread('untitled.bmp');  %读入测试图像
feature=Getfeature(img);   %提取测试样本特征
w = zeros(10,26);   %10个类别的增广权值
d = zeros(1,10);    %迭代过程中判别函数计算结果
x = zeros(1,26);    %增广样本,前25维为样本特征,第26维为1
hx = zeros(1,10);   %测试样本判别函数计算结果
c = 0;  %迭代次数
flag=0;%标志符(只使用01)


%%%%%%%%%% Begin %%%%%%%%%%
%   用全部训练样本迭代训练(使用梯度下降法,迭代结束求出10个类别的权矢量存入w(10,26))
while ~flag
    flag = 1;
    for n = 1:10
        for i = 1:pattern(n).num
            %依次读取训练样本
            x = pattern(n).feature(i,:);
            x(26) = 1;
            for j = 1:10
            %%%%%%%%%% Begin %%%%%%%%%%
            %计算判别函数值d(j)
                d(j)=w(j,:)*x';

            %%%%%%%%%% End %%%%%%%%%%
            end
            %判断d(n)是否是最大值
            if d(n)~=max(d)||max(d)==min(d)       
            %%%%%%%%%% Begin %%%%%%%%%%
            %d(n)不是最大值,修正权矢量w
            for k=1:10
                if k==n
                w(k,:)=w(k,:)+x;
            else
                w(k,:)=w(k,:)-x;
            end
            end
            %%%%%%%%%% End %%%%%%%%%%
                flag=0; %将标志符置为0
            end
        end
    end
    c = c+1;
    if(c>500)  %迭代超过500次停止
       break
    end
end
%%%%%%%%%% End %%%%%%%%%%


%   测试样品
num = feature;
num(26) = 1;

%   计算判别函数
for n = 1:10
    hx(n) = w(n,:)*num';

end

[tem,num] = max(hx);    %找到其中的最大值
num = num-1;

str = num2str(num);
str = ['应用感知器算法识别结果:' str];
fprintf('%s\n',str);

你可能感兴趣的:(模式识别,matlab,算法,开发语言)