利用朴素贝叶斯(Navie Bayes)进行垃圾邮件分类

贝叶斯公式描写叙述的是一组条件概率之间相互转化的关系。

在机器学习中。贝叶斯公式能够应用在分类问题上。

这篇文章是基于自己的学习所整理。并利用一个垃圾邮件分类的样例来加深对于理论的理解。

这里我们来解释一下朴素这个词的含义:

1)各个特征是相互独立的,各个特征出现与其出现的顺序无关;

2)各个特征地位同等重要;

以上都是比較强的如果

以下是朴素贝叶斯分类的流程:

这样我们就分别求出了这些特征各个类别下的条件概率,非常直观的,对于各个特征的联合概率分布就是各个条件概率进行相乘。如上式。可是这样会出现下面几个问题:

1)若某一个词未出如今字典中,那么其条件概率就会为0。那么总体的联合概率也就为0。为了避免这样的情况的

出现,这里会引入 Laplace smoothing的操作:假定输入样本中各个特征出现的次数至少为1,这样在求一个特征出

现的概率时对于分母。要加上其总的类别m;能够表述为例如以下公式,

p(w|h)=(实际出现的次数+1)/(总的特征出现次数+m)

2)还有一个问题是,若一个样本中特征个数非常多,那 么可能会出现这种情况,单个特征出现的概率非常少,那么联合

概率相乘时。终于的值会很小。在计算机中可能出现下溢。为了避免这样的情况出现,能够对联合概率取对数

log(a*b)=log(a)+log(b)

上式能够转换为:

以上都是训练过程中会常常遇到的问题。

经过训练后,就能够得到非常多组这种公式。那么对于一封新的邮件过来了

怎么去判定其是否为垃圾邮件呢?

这里就会涉及到怎么样将 单词这种特征转化成计算机能够方便处理的数字,非常直观的就是建立一个已知垃圾邮件中常常出现的单词的字典(向量)。对于新邮件。就能够将其转换到一个与字典相同大小的向量,出现的单词在对应的索引处标为‘1’,否则标 ‘0’。

下一步就是将得到的这个向量分别与训练得到的对数概率进行相乘了。

以下是python代码,来自机器学习实战这本书。

from numpy import *

def loadDataSet():
    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]    #1 is abusive, 0 not
    return postingList,classVec

def createVocabList(dataSet):
    vocabSet = set([])  #create empty set
    for document in dataSet:
        vocabSet = vocabSet | set(document) #union of the two sets
    return list(vocabSet)

def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] = 1
        else: print "the word: %s is not in my Vocabulary!" % word
    return returnVec

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    p0Num = ones(numWords); p1Num = ones(numWords)      #change to ones()
    p0Denom = 2.0; p1Denom = 2.0                        #change to 2.0
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = log(p1Num/p1Denom)          #change to log()
    p0Vect = log(p0Num/p0Denom)          #change to log()
    return p0Vect,p1Vect,pAbusive

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else:
        return 0

很多其它内容能够參考下面博客:

朴素贝叶斯分类器的应用:

贝叶斯判断及基互联网应用:过滤垃圾邮件

时间: 2024-09-30 09:44:47

利用朴素贝叶斯(Navie Bayes)进行垃圾邮件分类的相关文章

使用朴素贝叶斯算法简单实现垃圾邮件过滤

一.算法介绍 朴素贝叶斯法,简称NB算法,是贝叶斯决策理论的一部分,是基于贝叶斯定理与特征条件独立假设的分类方法: 首先理解两个概念: · 先验概率是指根据以往经验和分析得到的概率,它往往作为"由因求果"问题中的"因"出现: · 后验概率是指在得到"结果"的信息后重新修正的概率,是"执果寻因"问题中的"因" . 1 贝叶斯定理 贝叶斯理论是以18世纪的一位神学家托马斯贝叶斯(Thomas Bayes)命名.

使用朴素贝叶斯算法简单实现垃圾邮件过滤之算法介绍实现过程

一.算法介绍https://www.cnblogs.com/love528/p/10125089.html 二.实现过程 实验步骤 (1)收集数据:提供文本文件. (2)准备数据:将文本文件解析成词条向量. (3)分析数据:检查词条确保解析的正确性. (4)训练算法:计算不同的独立特征的条件概率. (5)测试算法:计算错误率. (6)使用算法:构建一个完整的程序对一组文档进行分类. 主要代码解析 (1)    分词 使用正则表达式将邮件文本其划分成一个个单词的形式 import re def t

朴素贝叶斯(naive bayes)

朴素贝叶斯(naive bayes) 主要参考资料:<机器学习实战><统计学习方法> 1.朴素贝叶斯分类原理 朴素贝叶斯法是基于贝叶斯定理和特征条件独立假设(称为朴素的原因)的分类方法.先看看维基百科中贝叶斯定理的描述: 贝叶斯定理(维基百科) 通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A的条件下的概率是不一样的:然而,这两者是有确定的关系,贝叶斯定理就是这种关系的陈述. 公式描述如下: P(A|B)=P(A|B)P(A)P(B) 其中P(A|B)是在B发生的情况下

利用朴素贝叶斯算法进行分类-Java代码实现

http://www.crocro.cn/post/286.html 利用朴素贝叶斯算法进行分类-Java代码实现 鳄鱼  3个月前 (12-14)  分类:机器学习  阅读(44)  评论(0) Java package cn.crocro.classifier; import java.util.ArrayList; /** * 朴素贝叶斯分类器,只能针对有限个情况的分类下面是实例代码 * * @author 鳄鱼 * */ public class NaiveBayesClassifier

利用朴素贝叶斯实现简单的留言过滤

一.朴素贝叶斯 首先第一个问题,什么是朴素贝叶斯? 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法.而我们所想要实现的留言过滤其实是一种分类行为,是通过对于概率的判断,来对样本进行一个归类的过程. 朴素贝叶斯分类(NBC)是以贝叶斯定理为基础并且假设特征条件之间相互独立的方法,先通过已给定的训练集,以特征词之间独立作为前提假设,学习从输入到输出的联合概率分布,再基于学习到的模型,输入A求出使得后验

机器学习算法整理(六)— 贝叶斯算法_实现垃圾邮件过滤

垃圾邮件过滤实例 原文地址:https://www.cnblogs.com/douzujun/p/8457865.html

利用朴素贝叶斯对名字进行性别预测

完整代码 #-*-coding:utf-8-*- import pandas as pd import math from collections import defaultdict # load the data and preprocess the data train = pd.read_csv("./data/train.txt") test = pd.read_csv("./data/test.txt") def loadData(): # divide

机器学习Matlab打击垃圾邮件的分类————朴素贝叶斯模型

该系列来自于我<人工智能>课程回顾总结,以及实验的一部分进行了总结学习机 垃圾分类是有监督的学习分类最经典的案例,本文首先回顾了概率论的基本知识.则以及朴素贝叶斯模型的思想.最后给出了垃圾邮件分类在Matlab中用朴素贝叶斯模型的实现 1.概率 1.1 条件概率 定义:事件B发生的情况下,事件A发生的概率记作条件概率P(A|B) P(A|B)=P(A∧B)P(B) 条件概率也叫后验概率.无条件概率也叫先验概率(在没有不论什么其他信息存在的情况下关于命题的信度) 能够得到乘法规则: P(A∧B)

机器学习Matlab实战之垃圾邮件分类————朴素贝叶斯模型

本系列来自于我<人工智能>课程复习总结以及机器学习部分的实验总结 垃圾邮件分类是监督学习分类中一个最经典的案例,本文先复习了基础的概率论知识.贝叶斯法则以及朴素贝叶斯模型的思想,最后给出了垃圾邮件分类在Matlab中用朴素贝叶斯模型的实现 1.概率 1.1 条件概率 定义:事件B发生的情况下,事件A发生的概率记作条件概率P(A|B) P(A|B)=P(A∧B)P(B) 条件概率也叫后验概率,无条件概率也叫先验概率(在没有任何其它信息存在的情况下关于命题的信度) 可以得到乘法规则: P(A∧B)