
一、概述
朴素贝叶斯分类算法是基于概率论中的贝叶斯公式得到的,也是比较常用的一种算法,而朴素代表的是属性之间的独立性,这样联合概率可以转换成各概率分量的乘积。
二、算法思想
其实这个算法的思想就是贝叶斯公式,如果不是很了解也没什么关系,只要看点例子就明白了,但由于这里只想给大家提供一些实用代码,因此就不仔细说例子了,《机器学习实战》中的那个灰石头的例子就不错,另外,如果还感觉不是很清楚,推荐看一下《数据挖掘导论》中贝叶斯分类器部分。
三、实例算法
不说废话了,现在开始介绍朴素贝叶斯的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
PowerBI 累计曲线制作指南:从 DAX 度量到可视化落地 在业务数据分析中,“累计趋势” 是衡量业务进展的核心视角 —— 无论是 “ ...
2025-08-15Python 函数 return 多个数据:用法、实例与实战技巧 在 Python 编程中,函数是代码复用与逻辑封装的核心载体。多数场景下,我们 ...
2025-08-15CDA 数据分析师:引领商业数据分析体系构建,筑牢企业数据驱动根基 在数字化转型深化的今天,企业对数据的依赖已从 “零散分析” ...
2025-08-15随机森林中特征重要性(Feature Importance)排名解析 在机器学习领域,随机森林因其出色的预测性能和对高维数据的适应性,被广 ...
2025-08-14t 统计量为负数时的分布计算方法与解析 在统计学假设检验中,t 统计量是常用的重要指标,其分布特征直接影响着检验结果的判断。 ...
2025-08-14CDA 数据分析师与业务数据分析步骤 在当今数据驱动的商业世界中,数据分析已成为企业决策和发展的核心驱动力。CDA 数据分析师作 ...
2025-08-14前台流量与后台流量:数据链路中的双重镜像 在商业数据分析体系中,流量数据是洞察用户行为与系统效能的核心依据。前台流量与 ...
2025-08-13商业数据分析体系构建与 CDA 数据分析师的协同赋能 在企业数字化转型的浪潮中,商业数据分析已从 “可选工具” 升级为 “核 ...
2025-08-13解析 CDA 数据分析师:数据时代的价值挖掘者 在数字经济高速发展的今天,数据已成为企业核心资产,而将数据转化为商业价值的 ...
2025-08-13解析 response.text 与 response.content 的核心区别 在网络数据请求与处理的场景中,开发者经常需要从服务器返回的响应中提取数 ...
2025-08-12MySQL 统计连续每天数据:从业务需求到技术实现 在数据分析场景中,连续日期的数据统计是衡量业务连续性的重要手段 —— 无论是 ...
2025-08-12PyTorch 中 Shuffle 机制:数据打乱的艺术与实践 在深度学习模型训练过程中,数据的呈现顺序往往对模型性能有着微妙却关键的影响 ...
2025-08-12Pandas 多列条件筛选:从基础语法到实战应用 在数据分析工作中,基于多列条件筛选数据是高频需求。无论是提取满足特定业务规则的 ...
2025-08-12人工智能重塑 CDA 数据分析领域:从工具革新到能力重构 在数字经济浪潮与人工智能技术共振的 2025 年,数据分析行业正经历着前所 ...
2025-08-12游戏流水衰退率:计算方法与实践意义 在游戏行业中,流水(即游戏收入)是衡量一款游戏商业表现的核心指标之一。而游戏流水衰退 ...
2025-08-12CDA 一级:数据分析入门的基石 在当今数据驱动的时代,数据分析能力已成为职场中的一项重要技能。CDA(Certified Data Anal ...
2025-08-12破解游戏用户流失困局:从数据洞察到留存策略 在游戏行业竞争白热化的当下,用户流失率已成为衡量产品健康度的核心指标。一款游 ...
2025-08-11数据时代的黄金入场券:CDA 认证解锁职业新蓝海 一、万亿级市场需求下的数据分析人才缺口 在数字化转型浪潮中,数据已成为企业核 ...
2025-08-11DBeaver 实战:实现两个库表结构同步的高效路径 在数据库管理与开发工作中,保持不同环境(如开发库与生产库、主库与从库)的表 ...
2025-08-08t 检验与卡方检验:数据分析中的两大统计利器 在数据分析领域,统计检验是验证假设、挖掘数据规律的重要手段。其中,t 检验和卡 ...
2025-08-08