该系列来自于我《人工智能》课程回顾总结,以及实验的一部分进行了总结学习机

垃圾分类是有监督的学习分类最经典的案例,本文首先回顾了概率论的基本知识、则以及朴素贝叶斯模型的思想。最后给出了垃圾邮件分类在Matlab中用朴素贝叶斯模型的实现


1.概率

1.1 条件概率

定义:事件B发生的情况下,事件A发生的概率记作条件概率P(A|B)

P(A|B)=P(A∧B)P(B)

条件概率也叫后验概率。无条件概率也叫先验概率(在没有不论什么其他信息存在的情况下关于命题的信度)

能够得到乘法规则:

P(A∧B)=P(A|B)P(B)

推广有链式法则:

P(X1,...,Xn)=P(Xn|X1,...,Xn−1)P(X1,...,Xn−1)=P(Xn|X1,...,Xn−1)P(Xn−1|X1,...,Xn−2)P(X1,...,Xn−2)...=∏i=1nP(Xi)P(x1,...,Xi−1)

1.2 概率公理

P(¬A)=1−P(A)

P(A∨B)=P(A)+P(B)−P(A∧B)

1.3 联合分布和边缘概率分布

X是随机变量x取值集合,Y是随机变量y取值集合。那么称P(X,Y)为x和y的联合分布P(X,Y)

边缘概率定义为联合分布中某一个随机变量发生的概率:

P(X)=∑y∈YP(X,y)=∑y∈YP(X|y)P(y)

1.4 独立性

若事件A和B满足:P(A|B)=P(A) 或 P(B|A)=P(B) 或 P(A∧B)=P(A)P(B),则称A和B是独立的

称A和B关于C**条件独立**,则有:

P(A|B,C)=P(A|B)

P(B|A,C)=P(B|A)

P(A,B|C)=P(A|C)P(B|C)


2.贝叶斯法则

2.1 贝叶斯法则

从乘法规则P(A∧B)=P(A|B)P(B)=P(B|A)P(A)能够推导出贝叶斯法则:

P(B|A)=P(A|B)P(B)P(A)

常常我们把把未知因素cause造成的结果effect看作证据。去确定未知因素cause发生的概率,那么有:

P(cause|effect)=P(effect|cause)P(cause)P(effect)

P(effect|cause)刻画了因果关系。P(cause|effect)刻画了诊断关系

举个样例:

我们预先知道在感冒(cause)的情况下头痛(effect)发生的概率为50%,而感冒的概率为0.025且头痛的概率为0.1,那么某天早上醒来我头痛了,这时我感冒的概率是0.5*0.025/0.1=0.125而不是感觉上的50%

2.2 朴素贝叶斯模型

给定cause的情况下有n个彼此条件独立的症状effect,那么他们的联合分布有:

P(cause,effect1,...,effectn)=P(cause)∏iP(effecti|cause)

通常称这个概率分布为朴素贝叶斯模型贝叶斯分类器

那么朴素贝叶斯模型怎么实现分类呢?

我们设有非常多种cause(m个),这些cause下分别会表现为n个effect(effect也有多种)。我们统计训练集(已做标记)的结果仅仅能统计知道某个cause的情况下这n个effect的取值。也就是P(effecti|causej),i=1,..,n,j=1,...,m,以及这些cause分别的发生的概率P(causej)。

那么当我们有未标记的測试数据须要预測时,仅仅须要输入这些測试数据的表现。也就是n个effect,我们就能通过一下公式计算出条件概率最大的causej作为我们的预測:

P(causej|effect1,...,effectn)其中j=1,...,m=P(causej,effect1,...,effectn)P(effect1,...,effectn)=P(causej)∏iP(effecti|causej)∑kP(effect1,...,effectn|causek)P(causek)=P(causej)∏iP(effecti|causej)∑k[P(causek)∏iP(effecti|causek)]

之所以称之为朴素。是由于其对effect条件独立性的如果,可是往往实际情况中effect并不是条件独立的。


3.朴素贝叶斯模型下的垃圾邮件分类

3.1 模型

如果:

  • 设有n个单词wordi,i=1,...,n:wordi=0表示这个单词在这封email中不出现。wordi=1表示这个单词在这封email中出现。
  • 设训练集每封email有label标记邮件是否为垃圾邮件spam,label=1则该邮件是垃圾邮件

模型:

P(spam|word1,...,wordn)其中j=1,...,m=P(spam)∏iP(wordi|spam)P(spam)∏iP(wordi|spam)+P(norm)∏iP(wordi|norm)=11+P(norm)∏iP(wordi|norm)P(spam)∏iP(wordi|spam)=11+P(norm)P(spam)∏iP(wordi|norm)P(wordi|spam)

3.2 训练

我们须要用训练集计算出:

  • 正常邮件概率P(norm)
  • 垃圾邮件概率P(spam)
  • 单词i在正常邮件中不出现概率P(wordi=0|norm)
  • 单词i在正常邮件中出现概率P(wordi=1|norm)
  • 单词i在垃圾邮件中不出现概率P(wordi=0|spam)
  • 单词i在垃圾邮件中出现概率P(wordi=1|spam)

那么我们依据朴素贝叶斯模型就可以计算出P(spam|word1,...,wordn),选取一个threshold。若測试集某邮件的P(spam|word1,...,wordn)>threshold则标记该邮件为垃圾邮件

3.3 Matlab实现

用Matlab实现朴素贝叶斯模型垃圾邮件分类器例如以下:

function [ypred,accuracy]= nbayesclassifier (traindata, trainlabel, testdata, testlabel, threshold)
trainnum = size(traindata, 1);
wordnum = size(traindata, 2); p = zeros(wordnum, 2, 2);
count = zeros(2, 1); for i = 1 : trainnum
count(trainlabel(i) + 1) = count(trainlabel(i) + 1) + 1;
for j = 1 : wordnum
p(j, trainlabel(i) + 1, traindata(i, j) + 1) = p(j, trainlabel(i) + 1, traindata(i, j) + 1) + 1;
end
end pnorm = count(1) / trainnum;
pspam = count(2) / trainnum; p(:, 1, :) = (p(:, 1, :)+1) / (count(1)+1);
p(:, 2, :) = (p(:, 2, :)+1) / (count(2)+1); testnum = size(testdata, 1);
ypred = zeros(testnum, 1);
correct = 0; for i = 1 : testnum
q = pnorm / pspam;
for j = 1 : wordnum
q = q * p(j, 1, testdata(i, j) + 1) / p(j, 2, testdata(i, j) + 1);
end q = 1 / (1 + q); if q > threshold
ypred(i) = 1;
end
if ypred(i) == testlabel(i)
correct = correct + 1;
end
end accuracy = correct / testnum; end

当中有几个要点:

  • 我们将已标记数据集划分为训练集和測试集,训练集用来训练模型參数,測试集用来測试模型准确率。依据比較模型预測和測试集真实标记。我们能够计算出模型的准确率threshold
  • p(:, 1, :) = (p(:, 1, :)+1) / (count(1)+1);是为了避免某个单词在某个分类(正常邮件或垃圾邮件)中一直没有出现而导致p(:, 1, :)=0的情况减少分类器鲁棒性的情况(称之为Laplace校准。在数据规模较大时,加1产生的偏差忽略不计)

3.4 分类结果

通过枚举threshold的能够确定在某个训练集和測试集划分下,最优的阈值选取

我简单測试1000个邮件的数据量,6:4划分下最优预測准确率仅仅有90%(待优化)

版权声明:本文博主原创文章,博客,未经同意不得转载。

机器学习Matlab打击垃圾邮件的分类————朴素贝叶斯模型的更多相关文章

  1. Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案

    Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案 1.1. 七.什么是贝叶斯过滤器?1 1.2. 八.建立历史资料库2 1.3. 十.联合概率的计算3 1.4. 十一. ...

  2. Stanford大学机器学习公开课(六):朴素贝叶斯多项式模型、神经网络、SVM初步

    (一)朴素贝叶斯多项式事件模型 在上篇笔记中,那个最基本的NB模型被称为多元伯努利事件模型(Multivariate Bernoulli Event Model,以下简称 NB-MBEM).该模型有多 ...

  3. PGM:贝叶斯网表示之朴素贝叶斯模型naive Bayes

    http://blog.csdn.net/pipisorry/article/details/52469064 独立性质的利用 条件参数化和条件独立性假设被结合在一起,目的是对高维概率分布产生非常紧凑 ...

  4. 一步步教你轻松学朴素贝叶斯模型算法Sklearn深度篇3

    一步步教你轻松学朴素贝叶斯深度篇3(白宁超   2018年9月4日14:18:14) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受欢迎,对 ...

  5. 第十三次作业——回归模型与房价预测&第十一次作业——sklearn中朴素贝叶斯模型及其应用&第七次作业——numpy统计分布显示

    第十三次作业——回归模型与房价预测 1. 导入boston房价数据集 2. 一元线性回归模型,建立一个变量与房价之间的预测模型,并图形化显示. 3. 多元线性回归模型,建立13个变量与房价之间的预测模 ...

  6. 统计学习1:朴素贝叶斯模型(Numpy实现)

    模型 生成模型介绍 我们定义样本空间为\(\mathcal{X} \subseteq \mathbb{R}^n\),输出空间为\(\mathcal{Y} = \{c_1, c_2, ..., c_K\ ...

  7. 11.sklearn中的朴素贝叶斯模型及其应用

    #1.使用朴素贝叶斯模型对iris数据集进行花分类 #尝试使用3种不同类型的朴素贝叶斯: #高斯分布型,多项式型,伯努利型 from sklearn import datasets iris=data ...

  8. 【机器学习】文本分类——朴素贝叶斯Bayes

    朴素贝叶斯主要用于文本分类.文本分类常见三大算法:KNN.朴素贝叶斯.支持向量机SVM. 一.贝叶斯定理 贝叶斯公式思想:利用已知值来估计未知概率.已知某条件概率,如何得到两个事件交换后的概率,也就是 ...

  9. Python实现 利用朴素贝叶斯模型(NBC)进行问句意图分类

    目录 朴素贝叶斯分类(NBC) 程序简介 分类流程 字典(dict)构造:用于jieba分词和槽值替换 数据集构建 代码分析 另外:点击右下角魔法阵上的[显示目录],可以导航~~ 朴素贝叶斯分类(NB ...

随机推荐

  1. oc对象互相引用内存释放解决方案

    1.ARC 一端用strong,一端用weak 2.非ARC 一端用retain,一端用assign

  2. 用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...

  3. Spring、整合Spring+JDBC

    首先引入Spring包和JDBC所使用到的包: 配置beans.xml步骤: 1.配置dataSource的属性 2.将DataSource交给DataSourceTransactionManager ...

  4. hdu 5590 ZYB's Biology

    Problem Description After getting scores ) begins to work with biological questions.Now he give you ...

  5. 浅谈css盒模型

    在我们网页上的每一个元素,一个按钮,一段文本,一张图片等等,浏览器都将它们当做一个“盒子”看待,并把这样的盒子称为盒模型(box model).使用Chrome的右键>审查元素对某个网页上的元素 ...

  6. sharepoint 2013 reporting services 远程server返回错误: (500) 内部server错误。

    在sharepoint 2013部署reporting services过程中,点击管理中心,server上的服务.系统配置.提示了一个错误: 远程server返回错误: (500) 内部server ...

  7. 【APP UI 设计模式】(一)APP UI 设计原则和流程

    一.基本原则         1.用户体验原则UCD,以用户为中心去设计         2.设计模式是可重用的设计规范实现         3.反模式是糟糕设计的典型,极力避免使用         ...

  8. DDL

    在DDL(Data Definition Language)中,创建.删除.修改使用create.drop.alter关键字 数据库的创建 create database 数据库名选择数据库 use ...

  9. Ubuntu引导修复问题

    Ubuntu和Win7双系统,一不小心在Ubuntu下把Win7 C盘的boot目录给删了(手贱呀),然后Win7就没了,后来找了张WinPE启动盘修复了Win7引导结果,Ubuntu系统的引导没了. ...

  10. Java SE基础部分——常用类库之SimpleDateFormat(日期格式化)

    取得当前日期,并按照不同日期格式化输入.代码如下: // 20160618 SimpleDateFomat类的使用 日期格式化 练习 package MyPackage; //自己定义的包 impor ...