关闭

机器学习项目实战之贝叶斯垃圾邮件分类

标签: 机器学习
553人阅读 评论(3) 收藏 举报
分类:
#coding:utf-8
'''
Created on 2017年3月19日

@author: qiujiahao
'''


import numpy as np
#贝叶斯实质上也是一个二分类

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 侮辱性文字 , 0 代表正常言论
    return postingList,classVec

def createVocabList(dataset):#创建词汇表
    #set基本功能包括关系测试和消除重复元素
    vocabset = set([])

    for document in dataset:
        #取出dataset里的每一行,进行去重和合并操作,最后得到一个一维的数据
        vocabset = vocabset | set(document) #创建并集,实现去重的功能
    #将set数据转化为列表    
    return list(vocabset)

def setOfWord2VecMN(vocabList,inputSet):
    #根据词汇表,将句子转化为向量
    #classVec中0的类别一条向量,类别为1的一条向量
    #生成一个全0的,和vocabList一样维度的列表,相同的index对应着对应的单词,
    #不同的值代表这个单词出现的次数
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] += 1
    return returnVec
#训练:trainMatrix是转换好的向量,trainCategory是对应的类别
def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    p0Num = np.ones(numWords);p1Num = np.ones(numWords)#计算频数初始化为1
    p0Denom = 2.0;p1Denom = 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])
    #单词出现在第0类的概率和第1类的概率
    p1Vect = np.log(p1Num/p1Denom)#注意
    p0Vect = np.log(p0Num/p0Denom)#注意
    return p0Vect,p1Vect,pAbusive

def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
    p1 = sum(vec2Classify * p1Vec) + np.log(pClass1)
    p0 = sum(vec2Classify * p0Vec) + np.log(1-pClass1)
    #在向量0和向量1中的概率高,那么就属于哪一类
    if p1 > p0:
        return 1
    else:
        return 0

def testingNB():#流程展示
    listOPosts,listClasses = loadDataSet()#加载数据
    myVocabList = createVocabList(listOPosts)#建立词汇表
    trainMat = []
    for postinDoc in listOPosts:
        trainMat.append(setOfWord2VecMN(myVocabList,postinDoc))
    p0V,p1V,pAb = trainNB0(trainMat,listClasses)#训练
    #测试,指定一条新输入的语句
    testEntry = ['love','my','dalmation']
    thisDoc = setOfWord2VecMN(myVocabList,testEntry)
    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)

    testEntry = ['stupid','dog']
    thisDoc = setOfWord2VecMN(myVocabList,testEntry)
    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)

if __name__ == "__main__":
    testingNB()
['love', 'my', 'dalmation'] classified as:  0
['stupid', 'dog'] classified as:  1
0
0
查看评论

文本处理之贝叶斯垃圾邮件分类

本文所讲解的是如何通过Python将文本读取,并且将每一个文本生成对应的词向量并返回. 文章的背景是将50封邮件(包含25封正常邮件,25封垃圾邮件)通过贝叶斯算法对其进行分类.主要分为如下几个部分: ①读取所有邮件; ②建立词汇表; ③生成没封邮件对应的词向量(词集模型); ④用sklea...
  • The_lastest
  • The_lastest
  • 2017-12-17 19:43
  • 195

《机器学习实战》学习笔记:基于朴素贝叶斯的垃圾邮件过滤

概率是许多机器学习算法的基础,在前面生成决策树的过程中使用了一小部分关于概率的知识,即统计特征在数据集中取某个特定值的次数,然后除以数据集的实例总数,得到特征取该值的概率。之前的基础实验中简单实现了朴素贝叶斯分类器,并正确执行了文本分类,这一节将贝叶斯运用到实际场景,垃圾邮件过滤这一实际应用。
  • liyuefeilong
  • liyuefeilong
  • 2015-09-15 09:59
  • 5970

基于朴素贝叶斯分类算法实现垃圾邮箱分类

贝叶斯决策理论在机器学习中,朴素贝叶斯是基于贝叶斯决策 的一种简单形式,下面给出贝叶斯的基本公式,也是最重要的公式: 其中X是一个m*n的矩阵,m为他的样本数,n为特征的个数,即我们要求的是:在已知的样本情况下的条件概率。 )表示的是条件概率 )为先验概率 为什么需要朴...
  • taoyanqi8932
  • taoyanqi8932
  • 2016-11-08 18:24
  • 5407

朴素贝叶斯实现垃圾邮件分类------matlab实现

之所以用matleb实现,是因为这是数据挖掘课的几个大作业之一,作业要求,不然也不会这么蛋疼用matlab....(因为我不会matlab...) 朴素贝叶斯原理非常简单,最重要的就是概率公式: 其余的内容介绍可以参考:http://zh.wikipedia.org/wiki/%E6%9C%B...
  • wangyuquanliuli
  • wangyuquanliuli
  • 2013-11-30 22:55
  • 7025

【机器学习实战二:朴素贝叶斯算法之过滤垃圾邮件】

一、部分说明 ---------------------------------------------------------------- 1、本文代码是《机器学习实战》这本书的例程。点击下载《机器学习实战》及原书中的源代码; 2、运行环境为:window10+python3.2+各种pytho...
  • u013634684
  • u013634684
  • 2015-11-05 22:35
  • 2616

贝叶斯公式的理解及应用(垃圾邮件过滤)

全概公式 贝叶斯公式 贝叶斯推断 过滤垃圾邮件 条件概率
  • vivian_ll
  • vivian_ll
  • 2017-03-10 16:23
  • 1425

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

贝叶斯公式描述的是一组条件概率之间相互转化的关系。 在机器学习中,贝叶斯公式可以应用在分类问题上。这篇文章是基于自己的学习所整理,并利用一个垃圾邮件分类的例子来加深对于理论的理解。 这里我们来解释一下朴素这个词的含义: 1)各个特征是相互独立的,各个特征出现与其出现的顺序无关; 2)各个特征地位...
  • jxlijunhao
  • jxlijunhao
  • 2014-10-09 20:18
  • 1635

Python3:《机器学习实战》之朴素贝叶斯(3)过滤垃圾邮件

Python3:《机器学习实战》之朴素贝叶斯(3)过滤垃圾邮件 转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://github.com/WordZzzz/ML/tree/master/Ch04 操作系统:WINDOWS 10 软件版本:p...
  • u011475210
  • u011475210
  • 2017-09-10 21:56
  • 3845

基于朴素贝叶斯到中文垃圾邮件分类器

简介:    朴素 贝叶斯垃圾邮件分类器是在对邮件关键字进行统计分析到基础上利用贝叶斯公式进行分类到方法。相比其他模型,朴素贝叶斯模型到搭建比较简单,并且具有良好到分类效果。    朴素真贝叶斯分类器通过对邮件关键字进行统计,然后使用贝叶斯推理来计算一封电...
  • Searching_Bird
  • Searching_Bird
  • 2015-07-07 01:11
  • 3485

贝叶斯推断应用:垃圾邮件过滤

附上新博客地址:月光森林引入仍然是“信息内容安全” 课程的一个实验总结。为了理解整个原理,不但重新复习了一边贝叶斯,还因为对“联合概率”理解不透彻,直接翻译了一篇文章 —— 联合概率(翻译)。特此对整个实验进行总结。准备 50封邮件,25封垃圾邮件和25封正常邮件 操作系统: ubuntu 16.0...
  • ArrowLLL
  • ArrowLLL
  • 2017-04-06 18:47
  • 630
    个人资料
    • 访问:28376次
    • 积分:854
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:2篇
    • 译文:0篇
    • 评论:7条
    文章存档
    最新评论