京公网安备 11010802034615号
经营许可证编号:京B2-20210330
一、概述
朴素贝叶斯分类算法是基于概率论中的贝叶斯公式得到的,也是比较常用的一种算法,而朴素代表的是属性之间的独立性,这样联合概率可以转换成各概率分量的乘积。
二、算法思想
其实这个算法的思想就是贝叶斯公式,如果不是很了解也没什么关系,只要看点例子就明白了,但由于这里只想给大家提供一些实用代码,因此就不仔细说例子了,《机器学习实战》中的那个灰石头的例子就不错,另外,如果还感觉不是很清楚,推荐看一下《数据挖掘导论》中贝叶斯分类器部分。
三、实例算法
不说废话了,现在开始介绍朴素贝叶斯的matlab代码编写,这里我们的目标是利用朴素贝叶斯进行文档分类,即确定该文档是侮辱类还是非侮辱类,分别以1和0表示。
1. 创建测试数据
%% 建立测试数据
postingList = [{‘my dog has flea problems help please’};
{‘maybe not take him to dog park stupid’};
{‘my dalmation is so cute I love him’};
{‘stop posting stupid worthless garbage’};
{‘mr licks ate my steak how to stop him’};
{‘quit buying worthless dog food stupid’}];
classVec = [0, 1, 0, 1, 0, 1];
意义应该还是比较明确的,就是说2,4,6是带有侮辱性语句的文档
2. 创建无重复单词的列表
%% 创建无重复单词的列表
[m, n] = size(postingList);
VocabList = [];
for i = 1: m
tempstr = postingList{i};
str_split = regexp(tempstr, ‘W*s+’, ‘split’);
VocabList = [VocabList, str_split];
end
VocabList_unique = unique(VocabList);
可以看一下单词列表
>> VocabList_unique
VocabList_unique =
Columns 1 through 8
‘I’ ‘ate’ ‘buying’ ‘cute’ ‘dalmation’ ‘dog’ ‘flea’ ‘food’
Columns 9 through 16
‘garbage’ ‘has’ ‘help’ ‘him’ ‘how’ ‘is’ ‘licks’ ‘love’
Columns 17 through 24
‘maybe’ ‘mr’ ‘my’ ‘not’ ‘park’ ‘please’ ‘posting’ ‘problems’
Columns 25 through 32
‘quit’ ‘so’ ‘steak’ ‘stop’ ‘stupid’ ‘take’ ‘to’ ‘worthless’
3. 创建列表向量
由于单词不好进行表述,我们需要根据单词列表创建一个向量表示列表中的单词是否出现,出现用1表示,未出现用0表示。
setOfWords2Vec.m文件如下
function wordsVec = setOfWords2Vec(vocabList, inputSet)
vocabList = unique(vocabList);
inputSet = unique(inputSet);
Listnum = length(vocabList);
inputnum = length(inputSet);
wordsVec = zeros(1, Listnum);
for i = 1: inputnum
for j = 1: Listnum
if (strcmp(vocabList{j}, inputSet{i}))
wordsVec(j) = 1;
end
end
end
列表向量测试代码如下
%% 创建列表向量测试
tempstr = postingList{1};
str_split = regexp(tempstr, ‘W*s+’, ‘split’);
wordsVec = setOfWords2Vec(VocabList_unique, str_split);
测试结果如下
wordsVec =
Columns 1 through 14
0 0 0 0 0 1 1 0 0 1 1 0 0 0
Columns 15 through 28
0 0 0 0 1 0 0 1 0 1 0 0 0 0
Columns 29 through 32
0 0 0 0
上面的意思是测试postingList第一句’my dog has flea problems help please’
在单词表中的描述,对照上面的单词列表可以看到结果是正确的,比如wordsVec中的第六第七项为1,在单词表中表示的是dog 和 flea,这连个此时在上面那句话中出现的。
4. 贝叶斯分类函数编写
trainNB0.m文件
function [p0Vect, p1Vect, pAbusive] = trainNB0(trainMatrix, trainCategory)
[m, n] = size(trainMatrix);
pAbusive = sum(trainCategory) / m;
p1words = trainMatrix(find(trainCategory), :);
p0words = trainMatrix(find(1 – trainCategory), :);
p0wordscount = sum(p0words, 1) + 1; % 加1是为了防止出现0概率
p1wordscount = sum(p1words, 1) + 1;
p0Vect = log(p0wordscount ./ sum(p0wordscount));
p1Vect = log(p1wordscount ./ sum(p1wordscount));
这段代码还是要说明一下的
(1)注释位置那句对每个单词的出现初始化为1,就是说就算单词没出现,也将其计算为1,这是防止出现0概率,导致乘积为0。当然避免这个的方法有很多,每本书都不太一样,这里的+1采用的是Laplace平滑方法。
(2)最后算概率加了个log是减少其动态范围。
这两个都是为了实际应用对代码进行的修改,也就是说,就基本原理而言,不需要+1和增加log。
下面,我们对这个代码进行测试
%% 测试trainNB0
trainMatrix = [];
for i = 1: m
tempstr = postingList{i};
str_split = regexp(tempstr, ‘W*s+’, ‘split’);
wordsVec = setOfWords2Vec(VocabList_unique, str_split);
trainMatrix = [trainMatrix;wordsVec];
end
[p0V, p1V, pAb] = trainNB0(trainMatrix, classVec);
p0V代表0分类下,每个单词的出现概率,也就是先验概率(由于用了log,所以是负数,并且由于+1,故没有无穷大项目)
p0V =
Columns 1 through 8
-3.3322 -3.3322 -4.0254 -3.3322 -3.3322 -3.3322 -3.3322 -4.0254
Columns 9 through 16
-4.0254 -3.3322 -3.3322 -2.9267 -3.3322 -3.3322 -3.3322 -3.3322
Columns 17 through 24
-4.0254 -3.3322 -2.6391 -4.0254 -4.0254 -3.3322 -4.0254 -3.3322
Columns 25 through 32
-4.0254 -3.3322 -3.3322 -3.3322 -4.0254 -4.0254 -3.3322 -4.0254
p1V意义类似
p1V =
Columns 1 through 8
-3.9318 -3.9318 -3.2387 -3.9318 -3.9318 -2.8332 -3.9318 -3.2387
Columns 9 through 16
-3.2387 -3.9318 -3.9318 -3.2387 -3.9318 -3.9318 -3.9318 -3.9318
Columns 17 through 24
-3.2387 -3.9318 -3.9318 -3.2387 -3.2387 -3.9318 -3.2387 -3.9318
Columns 25 through 32
-3.2387 -3.9318 -3.9318 -3.2387 -2.5455 -3.2387 -3.2387 -2.8332
pAb代表的是分类为1的文件占所有文件的比例
pAb = 0.5
这个很明显,因为测试数据中有三个分类为1,并且一个有6项。
5. 分类测试
训练部分的代码已经写完了,下面我们的分类器就可以使用了,利用贝叶斯公式计算p(c | w)并比较大小可以确定分类c。
对于本例来说
p(w|0) = 待分类语句中每个单词在0类出现的概率的乘积
p(w|1) = 待分类语句中每个单词在1类出现的概率的乘积
p(0|w) = p(w|0)*p(0) / p(w)
p(1|w) = p(w|1)*p(1) / p(w)
如果p(0|w) > p(1|w)分类就是0,反之就是1
代码如下
classifyNB.m
function classRes = classifyNB(vec2Classify, p0Vec, p1Vec, pClass1)
p1 = sum(vec2Classify .* p1Vec) + log(pClass1);
p0 = sum(vec2Classify .* p0Vec) + log(1 – pClass1);
if p1 > p0
classRes = 1;
else
classRes = 0;
end
说明:
由于前面的概率是以log形式表示的,所以乘积就变成了加法,还有就是p(w)不影响比较结果,因此未予计算。
测试代码如下
%% 进行分类测试
testEntry = ‘love my dalmation’;
str_split = regexp(testEntry, ‘W*s+’, ‘split’);
wordsVec1 = setOfWords2Vec(VocabList_unique, str_split);
classRes1 = classifyNB(wordsVec1, p0V, p1V, pAb);
testEntry = ‘stupid garbage’;
str_split = regexp(testEntry, ‘W*s+’, ‘split’);
wordsVec2 = setOfWords2Vec(VocabList_unique, str_split);
classRes2 = classifyNB(wordsVec2, p0V, p1V, pAb);
结果就是
classRes1 = 0
classRes2 = 1
也就是说,分类确定第二句带有侮辱性,其实从其中的stupid就可以看出
四、算法应用
前面就说过,这个算法应用很广,《实战》中给出了两个实例,一个是垃圾邮件分类,这个和我们这里做的文本分类非常类似,另外一个就是从个人广告中获取区域倾向。都是平时我们经常使用的功能,如果有兴趣可以自己编着试一下,很多还是挺有意思的。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在MySQL数据库优化中,分区表是处理海量数据的核心手段——通过将大表按分区键(如时间、地域、ID范围)分割为多个独立的小分区 ...
2026-03-19在商业智能与数据可视化领域,同比、环比增长率是分析数据变化趋势的核心指标——同比(YoY)聚焦“长期趋势”,通过当前周期与 ...
2026-03-19在数据分析与建模领域,流传着一句行业共识:“数据决定上限,特征决定下限”。对CDA(Certified Data Analyst)数据分析师而言 ...
2026-03-19机器学习算法工程的核心价值,在于将理论算法转化为可落地、可复用、高可靠的工程化解决方案,解决实际业务中的痛点问题。不同于 ...
2026-03-18在动态系统状态估计与目标跟踪领域,高精度、高鲁棒性的状态感知是机器人导航、自动驾驶、工业控制、目标检测等场景的核心需求。 ...
2026-03-18“垃圾数据进,垃圾结果出”,这是数据分析领域的黄金法则,更是CDA(Certified Data Analyst)数据分析师日常工作中时刻恪守的 ...
2026-03-18在机器学习建模中,决策树模型因其结构直观、易于理解、无需复杂数据预处理等优势,成为分类与回归任务的首选工具之一。而变量重 ...
2026-03-17在数据分析中,卡方检验是一类基于卡方分布的假设检验方法,核心用于分析分类变量之间的关联关系或实际观测分布与理论期望分布的 ...
2026-03-17在数字化转型的浪潮中,企业积累的数据日益庞大且分散——用户数据散落在注册系统、APP日志、客服记录中,订单数据分散在交易平 ...
2026-03-17在数字化时代,数据分析已成为企业决策、业务优化、增长突破的核心支撑,从数据仓库搭建(如维度表与事实表的设计)、数据采集清 ...
2026-03-16在数据仓库建设、数据分析(尤其是用户行为分析、业务指标分析)的实践中,维度表与事实表是两大核心组件,二者相互依存、缺一不 ...
2026-03-16数据是CDA(Certified Data Analyst)数据分析师开展一切工作的核心载体,而数据读取作为数据生命周期的关键环节,是连接原始数 ...
2026-03-16在用户行为分析实践中,很多从业者会陷入一个核心误区:过度关注“当前数据的分析结果”,却忽视了结果的“泛化能力”——即分析 ...
2026-03-13在数字经济时代,用户的每一次点击、浏览、停留、转化,都在传递着真实的需求信号。用户行为分析,本质上是通过收集、整理、挖掘 ...
2026-03-13在金融、零售、互联网等数据密集型行业,量化策略已成为企业挖掘商业价值、提升决策效率、控制经营风险的核心工具。而CDA(Certi ...
2026-03-13在机器学习建模体系中,随机森林作为集成学习的经典算法,凭借高精度、抗过拟合、适配多场景、可解释性强的核心优势,成为分类、 ...
2026-03-12在机器学习建模过程中,“哪些特征对预测结果影响最大?”“如何筛选核心特征、剔除冗余信息?”是从业者最常面临的核心问题。随 ...
2026-03-12在数字化转型深度渗透的今天,企业管理已从“经验驱动”全面转向“数据驱动”,数据思维成为企业高质量发展的核心竞争力,而CDA ...
2026-03-12在数字经济飞速发展的今天,数据分析已从“辅助工具”升级为“核心竞争力”,渗透到商业、科技、民生、金融等各个领域。无论是全 ...
2026-03-11上市公司财务报表是反映企业经营状况、盈利能力、偿债能力的核心数据载体,是投资者决策、研究者分析、从业者复盘的重要依据。16 ...
2026-03-11