基于学习手写汉字特征的简易汉字识别程序-MATLAB(二)

上文中的一些自己定义的一些函数还没说明白,例如
bayesBinary(B’)
这是自己定义的一个函数,bayesBinary()从名字就可以看出来这是基于贝叶斯的二值化处理过程函数。
下面放代码:

function y = bayesBinary(sample)
%基于概率统计的贝叶斯分类器
%sample为要识别的图片的特征(1100行的概率)
%clc;    %清屏
load templet pattern;   %加载汉字特征
sum = 0;                %初始化sum
prior = [];             %先验概率
p = [];                 %各类别代表点
likelihood = [];        %类条件概率
pwx = [];               %贝叶斯概率
%%计算先验概率
for i=1:9
    %disp(pattern(i).num)均为5
    sum = sum+pattern(i).num; %特征总数
end
for i=1:9
    prior(i) = pattern(i).num/sum;  %出现每个汉字的可能性(先验概率)
    %disp(prior(i));均为0.11111/9
end
%%计算类条件概率
for i=1:9   %9个汉字
    for j=1:100 %100个模块
        sum = 0;
        for k=1:pattern(i).num %特征数
            %disp(pattern(i).feature(j,k));
            if(pattern(i).feature(j,k)>0.05)  %概率大于阈值0.05则数量+1
                sum = sum+1;
            end 
        end
        p(j,i) = (sum+1)/(pattern(i).num+2);%计算概率估计值即Pj(ωi),注意拉普拉斯平滑处理
    end
end
for i=1:9
    sum = 1;
    for j=1:100
        if(sample(j)>0.05)
            sum = sum*p(j,i);%如果待测图片当前概率大于0.05认为特征值为1,直接乘Pj(ωi)
        else
            sum = sum*(1-p(j,i));%如果待测图片当前概率小于0.05认为特征值为0,乘(1-Pj(ωi))
        end
    end
    likelihood(i) = sum;  %将类条件概率赋值给likelihood
end
%%计算后验概率
sum = 0;
for i=1:9
    sum = sum+prior(i)*likelihood(i);  %求和即得P(X)
end
for i=1:9
    pwx(i) = prior(i)*likelihood(i)/sum;  %贝叶斯公式
end
[maxval maxpos] = max(pwx);   %计算最大值和其所在位置
y=maxpos;                     %返回类的下标即汉字的类号

最开始是关于贝叶斯函数的一些定义,
for i=1:9
%pattern(i).num均为5
sum = sum+pattern(i).num; %特征总数
end
这段函数是用于特征总数的提取,也是用于计算先验概率prior的,先验概率=每个汉字的特征总数/总的特征数。
for i=1:9
prior(i) = pattern(i).num/sum; %出现每个汉字的可能性(先验概率)
%均为0.1111 即 1/9
end
下一步的一个大循环其实就是拿这5个训练样本集的对应的特征去比较阈值,并记录像素大于0.05的数量。计算这5个样本中大于0.05的概率。记得拉普拉斯平滑处理。Laplace校准,它的思想非常简单,就是对每个类别下所有划分的计数加1,这样如果训练样本集数量充分大时,并不会对结果产生影响,并且解决了上述频率为0的尴尬局面。
for i=1:9
sum = 1;
for j=1:100
if(sample(j)>0.05)
sum = sump(i,j);%如果待测图片当前概率大于0.05认为特征值为1,直接乘Pj(ωi)
else
sum = sum
(1-p(i,j));%如果待测图片当前概率小于0.05认为特征值为0,乘(1-Pj(ωi))
end
end
likelihood(i) = sum; %将类条件概率赋值给likelihood
end
这一个大循环是将待识别的文字与9个样本数字比较,并记录待识别样本对这9个字的类条件概率的值。即likelihood(i) 。

pattern中的样式如下:
图一

for i=1:9
sum = sum+prior(i)*likelihood(i); %求和即得P(X)
end
for i=1:9
pwx(i) = prior(i)*likelihood(i)/sum; %贝叶斯公式
end
[maxval maxpos] = max(pwx); %计算最大值和其所在位置
y=maxpos; %返回类的下标即汉字的类号
最后一个循环,利用贝叶斯公式,计算得到后验概率,概率越大,说明相似度越高,也就是说就是这个字了,然后用max函数求得最大值和位置(这里的位置是一个数字信息)可以通过另一个函数得到具体的汉字。
记录学习过程,一起进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值