京公网安备 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
在回归分析的结果解读中,R方(决定系数)是衡量模型拟合效果的核心指标——它代表因变量的变异中能被自变量解释的比例,取值通 ...
2025-12-04在城市规划、物流配送、文旅分析等场景中,经纬度热力图是解读空间数据的核心工具——它能将零散的GPS坐标(如外卖订单地址、景 ...
2025-12-04在CDA(Certified Data Analyst)数据分析师的指标体系中,“通用指标”与“场景指标”并非相互割裂的两个部分,而是支撑业务分 ...
2025-12-04每到“双十一”,电商平台的销售额会迎来爆发式增长;每逢冬季,北方的天然气消耗量会显著上升;每月的10号左右,工资发放会带动 ...
2025-12-03随着数字化转型的深入,企业面临的数据量呈指数级增长——电商的用户行为日志、物联网的传感器数据、社交平台的图文视频等,这些 ...
2025-12-03在CDA(Certified Data Analyst)数据分析师的工作体系中,“指标”是贯穿始终的核心载体——从“销售额环比增长15%”的业务结论 ...
2025-12-03在神经网络训练中,损失函数的数值变化常被视为模型训练效果的“核心仪表盘”——初学者盯着屏幕上不断下降的损失值满心欢喜,却 ...
2025-12-02在CDA(Certified Data Analyst)数据分析师的日常工作中,“用部分数据推断整体情况”是高频需求——从10万条订单样本中判断全 ...
2025-12-02在数据预处理的纲量统一环节,标准化是消除量纲影响的核心手段——它将不同量级的特征(如“用户年龄”“消费金额”)转化为同一 ...
2025-12-02在数据驱动决策成为企业核心竞争力的今天,A/B测试已从“可选优化工具”升级为“必选验证体系”。它通过控制变量法构建“平行实 ...
2025-12-01在时间序列预测任务中,LSTM(长短期记忆网络)凭借对时序依赖关系的捕捉能力成为主流模型。但很多开发者在实操中会遇到困惑:用 ...
2025-12-01引言:数据时代的“透视镜”与“掘金者” 在数字经济浪潮下,数据已成为企业决策的核心资产,而CDA数据分析师正是挖掘数据价值的 ...
2025-12-01数据分析师的日常,常始于一堆“毫无章法”的数据点:电商后台导出的零散订单记录、APP埋点收集的无序用户行为日志、传感器实时 ...
2025-11-28在MySQL数据库运维中,“query end”是查询执行生命周期的收尾阶段,理论上耗时极短——主要完成结果集封装、资源释放、事务状态 ...
2025-11-28在CDA(Certified Data Analyst)数据分析师的工具包中,透视分析方法是处理表结构数据的“瑞士军刀”——无需复杂代码,仅通过 ...
2025-11-28在统计分析中,数据的分布形态是决定“用什么方法分析、信什么结果”的底层逻辑——它如同数据的“性格”,直接影响着描述统计的 ...
2025-11-27在电商订单查询、用户信息导出等业务场景中,技术人员常面临一个选择:是一次性查询500条数据,还是分5次每次查询100条?这个问 ...
2025-11-27对数据分析从业者和学生而言,表结构数据是最基础也最核心的分析载体——CRM系统的用户表、门店的销售明细表、仓库的库存表,都 ...
2025-11-27在业务数据可视化中,热力图(Heat Map)是传递“数据密度与分布特征”的核心工具——它通过颜色深浅直观呈现数据值的高低,让“ ...
2025-11-26在企业数字化转型中,业务数据分析师是连接数据与决策的核心纽带。但“数据分析师”并非单一角色,从初级到高级,其职责边界、能 ...
2025-11-26