机器学习Matlab实战之垃圾邮件分类————朴素贝叶斯模型
2015-06-07 11:08
1031 查看
本系列来自于我《人工智能》课程复习总结以及机器学习部分的实验总结
垃圾邮件分类是监督学习分类中一个最经典的案例,本文先复习了基础的概率论知识、贝叶斯法则以及朴素贝叶斯模型的思想,最后给出了垃圾邮件分类在Matlab中用朴素贝叶斯模型的实现
P(A|B)=P(A∧B)P(B)P(A|B)=\frac{P(A\land B)}{P(B)}
条件概率也叫后验概率,无条件概率也叫先验概率(在没有任何其它信息存在的情况下关于命题的信度)
可以得到乘法规则:
P(A∧B)=P(A|B)P(B)P(A\land 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)
\begin{align}
P(X_1,...,X_n)&=P(X_n|X_1,...,X_{n-1})P(X_1,...,X_{n-1}) \\\\
&=P(X_n|X_1,...,X_{n-1})P(X_{n-1}|X_1,...,X_{n-2})P(X_1,...,X_{n-2}) \\\\
&...\\\\
&=\prod_{i=1}^n P(X_i)P(x_1,...,X_{i-1})
\end{align}
P(A∨B)=P(A)+P(B)−P(A∧B)P(A\lor B)=P(A)+P(B)-P(A\land B)
边缘概率定义为联合分布中某一个随机变量发生的概率:
P(X)=∑y∈YP(X,y)=∑y∈YP(X|y)P(y)
\begin{align}
P(X)&=\sum_{y\in Y} P(X,y) \\\\
&=\sum_{y\in Y} P(X|y)P(y)
\end{align}
称A和B关于C**条件独立**,则有:
P(A|B,C)=P(A|B)P(A|B,C)=P(A|B)
P(B|A,C)=P(B|A)P(B|A,C)=P(B|A)
P(A,B|C)=P(A|C)P(B|C)P(A,B|C)=P(A|C)P(B|C)
P(B|A)=P(A|B)P(B)P(A)
P(B|A)=\frac{P(A|B)P(B)}{P(A)}
经常我们把把未知因素cause造成的结果effect看作证据,去确定未知因素cause发生的概率,那么有:
P(cause|effect)=P(effect|cause)P(cause)P(effect)
P(cause|effect)=\frac{P(effect|cause)P(cause)}{P(effect)}
P(effect|cause)P(effect|cause)刻画了因果关系,P(cause|effect)P(cause|effect)刻画了诊断关系。
举个例子:
我们预先知道在感冒(cause)的情况下头痛(effect)发生的概率为50%,而感冒的概率为0.025且头痛的概率为0.1,那么某天早上醒来我头痛了,这时我感冒的概率是0.5*0.025/0.1=0.125而不是感觉上的50%
P(cause,effect1,...,effectn)=P(cause)∏iP(effecti|cause)
P(cause,effect_1,...,effect_n)=P(cause)\prod_i P(effect_i|cause)
通常称这个概率分布为朴素贝叶斯模型或贝叶斯分类器
那么朴素贝叶斯模型怎么实现分类呢?
我们设有很多种cause(m个),这些cause下分别会表现为n个effect(effect也有多种)。我们统计训练集(已做标记)的结果只能统计知道某个cause的情况下这n个effect的取值,也就是P(effecti|causej),i=1,..,n,j=1,...,mP(effect_i|cause_j),i=1,..,n,j=1,...,m,以及这些cause分别的发生的概率P(causej)P(cause_j)。那么当我们有未标记的测试数据需要预测时,只需要输入这些测试数据的表现,也就是n个effect,我们就能通过一下公式计算出条件概率最大的causejcause_j作为我们的预测:
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)]
\begin{align}
P(cause_j|effect_1,...,effect_n)
&=\frac{P(cause_j,effect_1,...,effect_n)}{P(effect_1,...,effect_n)}\\\\
&=\frac{P(cause_j)\prod_i P(effect_i|cause_j)}{\sum_k P(effect_1,...,effect_n|cause_k)P(cause_k)}\\\\
&=\frac{P(cause_j)\prod_i P(effect_i|cause_j)}{\sum_k [P(cause_k) \prod_i P(effect_i|cause_k)] }\\\\
其中j=1,...,m
\end{align}\\\\
之所以称之为朴素,是因为其对effect条件独立性的假设,但是往往实际情况中effect并非条件独立的。
设有n个单词wordi,i=1,...,nword_i,i=1,...,n:wordi=0word_i=0表示这个单词在这封email中不出现,wordi=1word_i=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)
\begin{align}
P(spam|word_1,...,word_n)
&=\frac{P(spam)\prod_i P(word_i|spam)}{P(spam) \prod_i P(word_i|spam) + P(norm) \prod_i P(word_i|norm)}\\\\
&=\frac{1}{1 + \frac{P(norm) \prod_i P(word_i|norm)}{P(spam) \prod_i P(word_i|spam)}}\\\\
&=\frac{1}{1 + \frac{P(norm)}{P(spam)} \prod_i \frac{P(word_i|norm)}{P(word_i|spam)}}\\\\
其中j=1,...,m
\end{align}\\\\
正常邮件概率P(norm)P(norm)
垃圾邮件概率P(spam)P(spam)
单词i在正常邮件中不出现概率P(wordi=0|norm)P(word_i=0|norm)
单词i在正常邮件中出现概率P(wordi=1|norm)P(word_i=1|norm)
单词i在垃圾邮件中不出现概率P(wordi=0|spam)P(word_i=0|spam)
单词i在垃圾邮件中出现概率P(wordi=1|spam)P(word_i=1|spam)
那么我们根据朴素贝叶斯模型即可计算出P(spam|word1,...,wordn)P(spam|word_1,...,word_n),选取一个threshold,若测试集某邮件的P(spam|word1,...,wordn)>thresholdP(spam|word_1,...,word_n)>threshold则标记该邮件为垃圾邮件
其中有几个要点:
我们将已标记数据集划分为训练集和测试集,训练集用来训练模型参数,测试集用来测试模型准确率。根据比较模型预测和测试集真实标记,我们可以计算出模型的准确率threshold
我简单测试1000个邮件的数据量,6:4划分下最优预测准确率只有90%(待优化)
垃圾邮件分类是监督学习分类中一个最经典的案例,本文先复习了基础的概率论知识、贝叶斯法则以及朴素贝叶斯模型的思想,最后给出了垃圾邮件分类在Matlab中用朴素贝叶斯模型的实现
1.概率
1.1 条件概率
定义:事件B发生的情况下,事件A发生的概率记作条件概率P(A|B)P(A|B)P(A|B)=P(A∧B)P(B)P(A|B)=\frac{P(A\land B)}{P(B)}
条件概率也叫后验概率,无条件概率也叫先验概率(在没有任何其它信息存在的情况下关于命题的信度)
可以得到乘法规则:
P(A∧B)=P(A|B)P(B)P(A\land 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)
\begin{align}
P(X_1,...,X_n)&=P(X_n|X_1,...,X_{n-1})P(X_1,...,X_{n-1}) \\\\
&=P(X_n|X_1,...,X_{n-1})P(X_{n-1}|X_1,...,X_{n-2})P(X_1,...,X_{n-2}) \\\\
&...\\\\
&=\prod_{i=1}^n P(X_i)P(x_1,...,X_{i-1})
\end{align}
1.2 概率公理
P(¬A)=1−P(A)P(\lnot A)=1-P(A)P(A∨B)=P(A)+P(B)−P(A∧B)P(A\lor B)=P(A)+P(B)-P(A\land B)
1.3 联合分布和边缘概率分布
X是随机变量x取值集合,Y是随机变量y取值集合,那么称P(X,Y)P(X,Y)为x和y的联合分布P(X,Y)P(X,Y)边缘概率定义为联合分布中某一个随机变量发生的概率:
P(X)=∑y∈YP(X,y)=∑y∈YP(X|y)P(y)
\begin{align}
P(X)&=\sum_{y\in Y} P(X,y) \\\\
&=\sum_{y\in Y} P(X|y)P(y)
\end{align}
1.4 独立性
若事件A和B满足:P(A|B)=P(A)P(A|B)=P(A) 或 P(B|A)=P(B)P(B|A)=P(B) 或 P(A∧B)=P(A)P(B)P(A\land B)=P(A)P(B),则称A和B是独立的称A和B关于C**条件独立**,则有:
P(A|B,C)=P(A|B)P(A|B,C)=P(A|B)
P(B|A,C)=P(B|A)P(B|A,C)=P(B|A)
P(A,B|C)=P(A|C)P(B|C)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(A\land B)=P(A|B)P(B)=P(B|A)P(A)可以推导出贝叶斯法则:P(B|A)=P(A|B)P(B)P(A)
P(B|A)=\frac{P(A|B)P(B)}{P(A)}
经常我们把把未知因素cause造成的结果effect看作证据,去确定未知因素cause发生的概率,那么有:
P(cause|effect)=P(effect|cause)P(cause)P(effect)
P(cause|effect)=\frac{P(effect|cause)P(cause)}{P(effect)}
P(effect|cause)P(effect|cause)刻画了因果关系,P(cause|effect)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)
P(cause,effect_1,...,effect_n)=P(cause)\prod_i P(effect_i|cause)
通常称这个概率分布为朴素贝叶斯模型或贝叶斯分类器
那么朴素贝叶斯模型怎么实现分类呢?
我们设有很多种cause(m个),这些cause下分别会表现为n个effect(effect也有多种)。我们统计训练集(已做标记)的结果只能统计知道某个cause的情况下这n个effect的取值,也就是P(effecti|causej),i=1,..,n,j=1,...,mP(effect_i|cause_j),i=1,..,n,j=1,...,m,以及这些cause分别的发生的概率P(causej)P(cause_j)。那么当我们有未标记的测试数据需要预测时,只需要输入这些测试数据的表现,也就是n个effect,我们就能通过一下公式计算出条件概率最大的causejcause_j作为我们的预测:
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)]
\begin{align}
P(cause_j|effect_1,...,effect_n)
&=\frac{P(cause_j,effect_1,...,effect_n)}{P(effect_1,...,effect_n)}\\\\
&=\frac{P(cause_j)\prod_i P(effect_i|cause_j)}{\sum_k P(effect_1,...,effect_n|cause_k)P(cause_k)}\\\\
&=\frac{P(cause_j)\prod_i P(effect_i|cause_j)}{\sum_k [P(cause_k) \prod_i P(effect_i|cause_k)] }\\\\
其中j=1,...,m
\end{align}\\\\
之所以称之为朴素,是因为其对effect条件独立性的假设,但是往往实际情况中effect并非条件独立的。
3.朴素贝叶斯模型下的垃圾邮件分类
3.1 模型
假设:设有n个单词wordi,i=1,...,nword_i,i=1,...,n:wordi=0word_i=0表示这个单词在这封email中不出现,wordi=1word_i=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)
\begin{align}
P(spam|word_1,...,word_n)
&=\frac{P(spam)\prod_i P(word_i|spam)}{P(spam) \prod_i P(word_i|spam) + P(norm) \prod_i P(word_i|norm)}\\\\
&=\frac{1}{1 + \frac{P(norm) \prod_i P(word_i|norm)}{P(spam) \prod_i P(word_i|spam)}}\\\\
&=\frac{1}{1 + \frac{P(norm)}{P(spam)} \prod_i \frac{P(word_i|norm)}{P(word_i|spam)}}\\\\
其中j=1,...,m
\end{align}\\\\
3.2 训练
我们需要用训练集计算出:正常邮件概率P(norm)P(norm)
垃圾邮件概率P(spam)P(spam)
单词i在正常邮件中不出现概率P(wordi=0|norm)P(word_i=0|norm)
单词i在正常邮件中出现概率P(wordi=1|norm)P(word_i=1|norm)
单词i在垃圾邮件中不出现概率P(wordi=0|spam)P(word_i=0|spam)
单词i在垃圾邮件中出现概率P(wordi=1|spam)P(word_i=1|spam)
那么我们根据朴素贝叶斯模型即可计算出P(spam|word1,...,wordn)P(spam|word_1,...,word_n),选取一个threshold,若测试集某邮件的P(spam|word1,...,wordn)>thresholdP(spam|word_1,...,word_n)>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 plot符号
- C#调用MATLAB 库函数记录
- VC与Matlab混合编程及复杂数据:结构体传递
- matlab中提示m文件不在current folder下(实际上在)
- MATLAB导入数据importdata功能
- Matlab图像处理系列4———图像傅立叶变换与反变换
- matlab灰度变换rgb2gray与直方图均衡化histeq
- Matlab Instrument Control Toolsbox Serial Send/Receive 基本使用
- 用支持向量机做OCR(MATLAB)
- MATLAB新手教程
- Opencv与matlab的混合编程
- Matlab 常用功能
- 编写Matlab过程中一些实用的小知识,记录下
- 积分图像的应用(一):局部标准差 分类: 图像处理 Matlab 2015-06-06 13:31 137人阅读 评论(0) 收藏
- 积分图像 分类: 图像处理 Matlab 2015-06-06 10:30 149人阅读 评论(0) 收藏
- Matlab图像处理系列3———空间域锐化滤波器
- 文章标题
- MATLAB产生的导频经QPSK调制后的精度的问题
- matlab使用reshape应该注意的问题
- MATLAB实现控制鼠标移动和点击