贝叶斯字母分类设计

数据集分析
特征向量生成
决策函数

更多:贝叶斯

接下来,趁热打铁,我们接着撸一个类似的例子。同学们可以根据需求,自己先推一边。过程是一模一样的。

数据集来自于UCI: UCI字母分类数据集链接

4.2.0 数据集分析

老套路,我们对数据集先做个简单的分析,主要是知道数据集的数据形式,便于写程序进行读取和预处理。

这个数据集原始数据一共包含20000张图像(一般取前16000张图像作为训练,后4000张图像作为测试),每张图像经过作者处理后得到了一个16维的特征(特征值是一个0-15的整数),标签就是所代表的字母A-Z。数据形式如下:

  lettr   capital letter  (26 values from A to Z)  
  x-box   horizontal position of box  (integer)  
  y-box   vertical position of box    (integer)  
  width   width of box            (integer)  
  high    height of box           (integer)  
  onpix   total # on pixels       (integer)  
  x-bar   mean x of on pixels in box  (integer)  
  y-bar   mean y of on pixels in box  (integer)  
  x2bar   mean x variance         (integer)  
  y2bar   mean y variance         (integer)  
  xybar   mean x y correlation        (integer)  
  x2ybr   mean of x * x * y       (integer)  
  xy2br   mean of x * y * y       (integer)  
  x-ege   mean edge count left to right   (integer)  
  xegvy   correlation of x-ege with y (integer)  
  y-ege   mean edge count bottom to top   (integer)  
  yegvx   correlation of y-ege with x (integer)

其中20000张图像的分布如下:

  789 A      766 B     736 C     805 D     768 E     775 F     773 G  
  734 H      755 I     747 J     739 K     761 L     792 M     783 N  
  753 O      803 P     783 Q     758 R     748 S     796 T     813 U  
  764 V      752 W     787 X     786 Y     734 Z

整理一下这个数据集。

  • 一个文件。共20000条数据,我们将前16000条数据作为训练数据,后4000条数据作为测试数据。
  • 数据格式。16维的特征向量,一个A-Z的label
4.2.1 特征向量生成

由第1章问题的描述中我们可以知道,字母数据集已经帮我们做好了特征向量提取的工作。数据形式如下所示。

由此我们只需要经过简单的处理就能得到我们想要的数据。

  • Image数据。上图所示每行16维向量,每个特征值取值为0-15的整数。形式为16*N。
  • Label。上图中每行第1列,A-Z。

Step1:数据读入(loadData.m)

% load data from file, start --start line, end --end line
function [labels, features] = loadData(filename,start,endl)
[data1,data2,data3,data4,data5,data6,data7,data8,data9,data10,data11,data12,data13,data14,data15,data16,data17] = textread(filename, '%c%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d','delimiter',',');
labels  = data1(start:endl,1);
features = [data2,data3,data4,data5,data6,data7,data8,data9,data10,data11,data12,data13,data14,data15,data16,data17];
features = features(start:endl,:);

features = features.' + 1;

end
4.2.2 决策函数
4.2.2.1 模型建立

我们需要训练的模型跟上述数字手写体分类一样,目标如下。

物理解释是:针对每个输入测试样本,我们需要求解一个它属于j类的后验概率,这个后验概率等于16维特征属于j类的后验概率。

因为我们认为每个样本特征之间是相互独立的,所以采用乘法。

由此我们的目标就变成了如何计算这个样本第个元素值属于第  类的后验概率问题。

这个就是我们需要训练的模型。

Step2: 训练模型(bc_train.m)

function [model] = bc_train(x, y, J)
[K,N] = size(x);     %K为维度,N为样本数

py = zeros(J,1);
for i=1:J
    py(i,:) = sum(y == i)/N;
end

pki = zeros(16,16);
for k=1:16
    for i=1:16
        pki(k,i) = sum(x(k,:) == i)/N;  
    end
end

pkij = zeros(16,16,J);
for j=1:J
    for k=1:16
        xj = x(:,y==j);  %属于第j类的样本
        for i=1:16
            pkij(k,i,j) = sum(xj(k,:)==i)/size(xj,2);
        end
    end
end
model.pki = pki;
model.py = py;
model.pkij = pkij;
end
4.2.2.2 模型测试

根据上述得到的model,我们就能计算出属于第j类的后验概率了。最后将特征值的后验概率相乘,取最大值所在的类,就是我们计算得到的类别。

其中,runChar.m文件为主程序,代码如下: 

经测试,模型在测试集上的分类正确率为:73.43%。

Step3: 测试数据(bc_predict.m)

function [yp] = bc_predict(model,x,J)
[K,N] = size(x);
pki = model.pki;
py = model.py;
pkij = model.pkij;

pyji = zeros(J,16,N);
for j=1:J
    for i = 1:16
        for n=1:N
            pyji(j,i,n) = pkij(i,x(i,n),j) * py(j) / pki(i,x(i,n)); 
        end
    end
end
result = prod(pyji,2);
yp = zeros(N,1);
for i=1:N
    [m,yp(i,:)] = max(result(:,:,i));
end

Step4: 主程序(runChar.m)

clear
clc

[train_labels,train_char] = loadData('./char/letter-recognition.data.txt',1,16000);
[test_labels,test_char] = loadData('./char/letter-recognition.data.txt',16001,20000);

train_labels = train_labels - 'A' + 1;
model = bc_train(train_char, train_labels, 26);

test_labels = test_labels - 'A' + 1;
yp = bc_predict(model,test_char,26);
accuary_test = sum(yp == test_labels) / length(test_labels);

4.4 参考文献

[1] MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges. 下载链接 
[2] UCI Machine Learning Repository: Letter Recognition Data Set. 下载链接 
[3] Using the MNIST Dataset. 下载链接 
[4] 周志华. 《机器学习》[M]. 清华大学出版社, 2016. 
[5] 李航. 《统计学习方法》[M].清华大学出版社,2013. 

发表评论

电子邮件地址不会被公开。 必填项已用*标注