[贝叶斯六]之朴素贝叶斯分类器设计
2018-02-07 21:50
417 查看
同样,类似于[贝叶斯四]之贝叶斯分类器设计,我们用一个例子:字母分类,来阐述朴素贝叶斯分类器的设计。
老套路,搞个三部曲:
特征向量生成
决策函数设计
模型训练
在做问题分析之前,请先做数据集的分析。
这个数据集原始数据一共包含20000张图像(一般取前16000张图像作为训练,后4000张图像作为测试),每张图像经过作者处理后得到了一个16维的特征(特征值是一个0-15的整数),标签就是所代表的字母A-Z。数据形式如下:
其中20000张图像的分布如下:
整理一下这个数据集。
一个文件。共20000条数据,我们将前16000条数据作为训练数据,后4000条数据作为测试数据。
数据格式。16维的特征向量,一个A-Z的label
由此我们只需要经过简单的处理就能得到我们想要的数据。
Image数据。上图所示每行16维向量,每个特征值取值为0-15的整数。形式为16*N。
Label。上图中每行第1列,A-Z。
Step1:数据读入(loadData.m)
p(wi|x)=p(x|wi)p(wi)p(x)=p(wi)p(x)∏k=1dp(xk|wi)(1)(2)(1)p(wi|x)=p(x|wi)p(wi)p(x)(2)=p(wi)p(x)∏k=1dp(xk|wi)
朴素贝叶斯的目标函数如下所示。
f=argmaxi p(wi|x)=argmaxi p(wi)∏k=1dp(xk|wi)(3)(4)(3)f=argmaxi p(wi|x)(4)=argmaxi p(wi)∏k=1dp(xk|wi)
对于字母数据集的训练数据集来说:
类别ww共有26类
样本xx是16维,每个元素的取值是0~15整数
gi(x)=p(wi)∏k=1dp(xk|wi)(5)(5)gi(x)=p(wi)∏k=1dp(xk|wi)
其中:
p(wi)p(wi)是先验概率,表示每类样本出现的概率。
p(wi)=#类别i的训练样本数量#训练样本总数n(6)(6)p(wi)=#类别i的训练样本数量#训练样本总数n
p(xk|wi)p(xk|wi)是用来统计类别ii的条件下,xkxk在各种取值下的可能性(概率)。
p(xk=j|wi)=#类别i的所有训练样本中第k个元素为j的样本数#类别为i的训练样本总数(7)(7)p(xk=j|wi)=#类别i的所有训练样本中第k个元素为j的样本数#类别为i的训练样本总数
在模型建立的时候,我们只需要计算上面两个参数即可。
Step2: 训练模型(bc_train.m)
针对输入样本xx,每个样本的p(wi)p(wi)肯定是相同的。根据式子。
gi(x)=p(wi)∏k=1dp(xk|wi)(8)(8)gi(x)=p(wi)∏k=1dp(xk|wi)
我们只需要得到p(xk|wi)p(xk|wi)即可,因为有输入样本xx,所以其实我们是知道xkxk的值的,然后加上模型中已经计算出了p(xk=j|wi)p(xk=j|wi),由此我们将xkxk带入,得到了p(xk|wi)p(xk|wi)。然后统计出所有类别的最大值 maxi gi(x) maxi gi(x),这个类别就是预测得到的类别。
Step3: 测试数据(bc_predict.m)
Step4: 主程序(runChar.m)
最终得到的测试精度是: 72.9%
读者可以在特征向量生成的时候做点文章以此来提高精度,具体的可以查看我们写的特征生成部分,比如PCA等等。
[2] Using the MNIST Dataset. 下载链接
[3] 周志华. 《机器学习》[M]. 清华大学出版社, 2016.
[4] 李航. 《统计学习方法》[M].清华大学出版社,2013.
[5] 机器学习之贝叶斯分类器
[6] 机器学习通俗入门-朴素贝叶斯分类器
PS: 如需数据和代码请上faiculty留言
<个人网页blog已经上线,一大波干货即将来袭:https://faiculty.com/>
/* 版权声明:公开学习资源,只供线上学习,不可转载,如需转载请联系本人 .*/
老套路,搞个三部曲:
特征向量生成
决策函数设计
模型训练
在做问题分析之前,请先做数据集的分析。
一、数据集分析
数据集来自于UCI: UCI字母分类数据集链接这个数据集原始数据一共包含20000张图像(一般取前16000张图像作为训练,后4000张图像作为测试),每张图像经过作者处理后得到了一个16维的特征(特征值是一个0-15的整数),标签就是所代表的字母A-Z。数据形式如下:
1. lettr capital letter (26 values from A to Z) 2. x-box horizontal position of box (integer) 3. y-box vertical position of box (integer) 4. width width of box (integer) 5. high height of box (integer) 6. onpix total # on pixels (integer) 7. x-bar mean x of on pixels in box (integer) 8. y-bar mean y of on pixels in box (integer) 9. x2bar mean x variance (integer) 10. y2bar mean y variance (integer) 11. xybar mean x y correlation (integer) 12. x2ybr mean of x * x * y (integer) 13. xy2br mean of x * y * y (integer) 14. x-ege mean edge count left to right (integer) 15. xegvy correlation of x-ege with y (integer) 16. y-ege mean edge count bottom to top (integer) 17. yegvx correlation of y-ege with x (integer)
其中20000张图像的分布如下:
1. 789 A 766 B 736 C 805 D 768 E 775 F 773 G 2. 734 H 755 I 747 J 739 K 761 L 792 M 783 N 3. 753 O 803 P 783 Q 758 R 748 S 796 T 813 U 4. 764 V 752 W 787 X 786 Y 734 Z
整理一下这个数据集。
一个文件。共20000条数据,我们将前16000条数据作为训练数据,后4000条数据作为测试数据。
数据格式。16维的特征向量,一个A-Z的label
二、特征向量生成
由上述的数据集的描述中我们可以知道,字母数据集已经帮我们做好了特征向量提取(16维数据)的工作。数据形式如下所示。由此我们只需要经过简单的处理就能得到我们想要的数据。
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,:); %labels = labels.'; features = features.' + 1; % 注意:这里的下标是0~15 end
三、决策函数分析
这里我们也使用最小错分准则来设计贝叶斯分类器。所以,我们的目的是求解后验概率 p(wi|x) p(wi|x).3.1 决策函数
由[贝叶斯五]之朴素贝叶斯分析可以知道。p(wi|x)=p(x|wi)p(wi)p(x)=p(wi)p(x)∏k=1dp(xk|wi)(1)(2)(1)p(wi|x)=p(x|wi)p(wi)p(x)(2)=p(wi)p(x)∏k=1dp(xk|wi)
朴素贝叶斯的目标函数如下所示。
f=argmaxi p(wi|x)=argmaxi p(wi)∏k=1dp(xk|wi)(3)(4)(3)f=argmaxi p(wi|x)(4)=argmaxi p(wi)∏k=1dp(xk|wi)
对于字母数据集的训练数据集来说:
类别ww共有26类
样本xx是16维,每个元素的取值是0~15整数
3.2 模型建立
根据训练数据和决策函数,我们需要计算模型的参数(也可以称为训练过程)。决策函数如下。gi(x)=p(wi)∏k=1dp(xk|wi)(5)(5)gi(x)=p(wi)∏k=1dp(xk|wi)
其中:
p(wi)p(wi)是先验概率,表示每类样本出现的概率。
p(wi)=#类别i的训练样本数量#训练样本总数n(6)(6)p(wi)=#类别i的训练样本数量#训练样本总数n
p(xk|wi)p(xk|wi)是用来统计类别ii的条件下,xkxk在各种取值下的可能性(概率)。
p(xk=j|wi)=#类别i的所有训练样本中第k个元素为j的样本数#类别为i的训练样本总数(7)(7)p(xk=j|wi)=#类别i的所有训练样本中第k个元素为j的样本数#类别为i的训练样本总数
在模型建立的时候,我们只需要计算上面两个参数即可。
Step2: 训练模型(bc_train.m)
function [model] = bc_train(x, y, J) [K,N] = size(x); %K为维度,N为样本数 % p(w): 类别 i 出现的概率 py = zeros(J,1); for i=1:J py(i,:) = sum(y == i)/N; end % p(x_k_i): 样本中第k个元素为i的个数 / 样本总数 pki = zeros(16,16); for k=1:16 for i=1:16 pki(k,i) = sum(x(k,:) == i)/N; end end % p(x_k_i | j): 第j类样本中第k个元素为i的样本数 / 第j类样本总数 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
3.3 模型测试
决策函数有了,模型有了,那么我们如何来测试一个数据呢?简而言之就是输入样本xx,如何得到xx所属的类别?针对输入样本xx,每个样本的p(wi)p(wi)肯定是相同的。根据式子。
gi(x)=p(wi)∏k=1dp(xk|wi)(8)(8)gi(x)=p(wi)∏k=1dp(xk|wi)
我们只需要得到p(xk|wi)p(xk|wi)即可,因为有输入样本xx,所以其实我们是知道xkxk的值的,然后加上模型中已经计算出了p(xk=j|wi)p(xk=j|wi),由此我们将xkxk带入,得到了p(xk|wi)p(xk|wi)。然后统计出所有类别的最大值 maxi gi(x) maxi gi(x),这个类别就是预测得到的类别。
Step3: 测试数据(bc_predict.m)
function [yp] = bc_predict(model,x,J) [K,N] = size(x); pki = model.pki; py = model.py; pkij = model.pkij; % p(y_j|i): 样本第i个元素为 x(:,i) 情况下,类别为j的概率 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 %% Step1: read data [train_labels,train_char] = loadData('./char/letter-recognition.data.txt',1,16000); [test_labels,test_char] = loadData('./char/letter-recognition.data.txt',16001,20000); %% Step2: train model train_labels = train_labels - 'A' + 1; model = bc_train(train_char, train_labels, 26); %% Step3: predict test_labels = test_labels - 'A' + 1; yp = bc_predict(model,test_char,26); accuary_test = sum(yp == test_labels) / length(test_labels);
最终得到的测试精度是: 72.9%
读者可以在特征向量生成的时候做点文章以此来提高精度,具体的可以查看我们写的特征生成部分,比如PCA等等。
四、参考文献
[1] UCI Machine Learning Repository: Letter Recognition Data Set. 下载链接[2] Using the MNIST Dataset. 下载链接
[3] 周志华. 《机器学习》[M]. 清华大学出版社, 2016.
[4] 李航. 《统计学习方法》[M].清华大学出版社,2013.
[5] 机器学习之贝叶斯分类器
[6] 机器学习通俗入门-朴素贝叶斯分类器
PS: 如需数据和代码请上faiculty留言
<个人网页blog已经上线,一大波干货即将来袭:https://faiculty.com/>
/* 版权声明:公开学习资源,只供线上学习,不可转载,如需转载请联系本人 .*/
相关文章推荐
- 贝叶斯模型构建分类器的设计与实现
- 贝叶斯与朴素贝叶斯分类器
- 大数据入门——新闻文本数据类别预测(朴素贝叶斯分类器)
- 机器学习与R之朴素贝叶斯分类器
- 《机器学习实战》读书笔记5:朴素贝叶斯分类器的原理
- 贝叶斯推断|朴素贝叶斯分类|贝叶斯定理
- 组合分类器设计
- 机器学习|朴素贝叶斯算法(二)-用sklearn实践贝叶斯
- 朴素贝叶斯分类器的应用
- 朴素贝叶斯分类器的应用
- 朴素贝叶斯分类器的python实现
- 数据挖掘经典算法总结-朴素贝叶斯分类器
- 【语言处理与Python】6.4决策树/6.5朴素贝叶斯分类器/6.6最大熵分类器
- 基于朴素贝叶斯分类器的文本分类算法(转)
- 分类器设计之线性分类器和线性SVM(含Matlab代码)
- 生成式和判别式分类器:朴素贝叶斯与逻辑回归
- 【机器学习算法-python实现】扫黄神器-朴素贝叶斯分类器的实现
- 分类器设计之线性分类器和线性SVM(含Matlab代码)
- 朴素贝叶斯分类器的应用
- OpenCV实现朴素贝叶斯分类器诊断病情