上文中的一些自己定义的一些函数还没说明白,例如
bayesBinary(B’)
这是自己定义的一个函数,bayesBinary()从名字就可以看出来这是基于贝叶斯的二值化处理过程函数。
下面放代码:
function y = bayesBinary(sample)
%基于概率统计的贝叶斯分类器
%sample为要识别的图片的特征(1列100行的概率)
%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.1111 即 1/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函数求得最大值和位置(这里的位置是一个数字信息)可以通过另一个函数得到具体的汉字。
记录学习过程,一起进步