python实现朴素贝叶斯算法


Posted in Python onNovember 19, 2018

本代码实现了朴素贝叶斯分类器(假设了条件独立的版本),常用于垃圾邮件分类,进行了拉普拉斯平滑。

关于朴素贝叶斯算法原理可以参考博客中原理部分的博文。

#!/usr/bin/python
# -*- coding: utf-8 -*-
from math import log
from numpy import*
import operator
import matplotlib
import matplotlib.pyplot as plt
from os import listdir
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]
  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)  #拉普拉斯平滑
  p0Denom = 0.0+2.0; p1Denom = 0.0 +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)    #用log()是为了避免概率乘积时浮点数下溢
  p0Vect = log(p0Num/p0Denom)
  return p0Vect,p1Vect,pAbusive
 
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
  p1 = sum(vec2Classify * p1Vec) + log(pClass1)
  p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
  if p1 > p0:
    return 1
  else:
    return 0
 
def bagOfWords2VecMN(vocabList, inputSet):
  returnVec = [0] * len(vocabList)
  for word in inputSet:
    if word in vocabList:
      returnVec[vocabList.index(word)] += 1
  return returnVec
 
def testingNB():  #测试训练结果
  listOPosts, listClasses = loadDataSet()
  myVocabList = createVocabList(listOPosts)
  trainMat = []
  for postinDoc in listOPosts:
    trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
  p0V, p1V, pAb = trainNB0(array(trainMat), array(listClasses))
  testEntry = ['love', 'my', 'dalmation']
  thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
  print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb)
  testEntry = ['stupid', 'garbage']
  thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
  print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb)
 
def textParse(bigString): # 长字符转转单词列表
  import re
  listOfTokens = re.split(r'\W*', bigString)
  return [tok.lower() for tok in listOfTokens if len(tok) > 2]
 
def spamTest():  #测试垃圾文件 需要数据
  docList = [];
  classList = [];
  fullText = []
  for i in range(1, 26):
    wordList = textParse(open('email/spam/%d.txt' % i).read())
    docList.append(wordList)
    fullText.extend(wordList)
    classList.append(1)
    wordList = textParse(open('email/ham/%d.txt' % i).read())
    docList.append(wordList)
    fullText.extend(wordList)
    classList.append(0)
  vocabList = createVocabList(docList) 
  trainingSet = range(50);
  testSet = [] 
  for i in range(10):
    randIndex = int(random.uniform(0, len(trainingSet)))
    testSet.append(trainingSet[randIndex])
    del (trainingSet[randIndex])
  trainMat = [];
  trainClasses = []
  for docIndex in trainingSet: 
    trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))
    trainClasses.append(classList[docIndex])
  p0V, p1V, pSpam = trainNB0(array(trainMat), array(trainClasses))
  errorCount = 0
  for docIndex in testSet: 
    wordVector = bagOfWords2VecMN(vocabList, docList[docIndex])
    if classifyNB(array(wordVector), p0V, p1V, pSpam) != classList[docIndex]:
      errorCount += 1
      print "classification error", docList[docIndex]
  print 'the error rate is: ', float(errorCount) / len(testSet)
 
 
 
listOPosts,listClasses=loadDataSet()
myVocabList=createVocabList(listOPosts)
print myVocabList,'\n'
# print setOfWords2Vec(myVocabList,listOPosts[0]),'\n'
trainMat=[]
for postinDoc in listOPosts:
  trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
print trainMat
p0V,p1V,pAb=trainNB0(trainMat,listClasses)
print pAb
print p0V,'\n',p1V
testingNB()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python重新引入被覆盖的自带function
Jul 16 Python
Python字符编码与函数的基本使用方法
Sep 30 Python
Python实现使用卷积提取图片轮廓功能示例
May 12 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
Python实现手机号自动判断男女性别(实例解析)
Dec 22 Python
Tensorflow Summary用法学习笔记
Jan 10 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
Python自动创建Excel并获取内容
Sep 16 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
Dec 17 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 Python
朴素贝叶斯Python实例及解析
Nov 19 #Python
python版大富翁源代码分享
Nov 19 #Python
python获取微信小程序手机号并绑定遇到的坑
Nov 19 #Python
python实现推箱子游戏
Mar 25 #Python
详解python中的Turtle函数库
Nov 19 #Python
python绘制简单彩虹图
Nov 19 #Python
python微信好友数据分析详解
Nov 19 #Python
You might like
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
Symfony2针对输入时间进行查询的方法分析
2017/06/28 PHP
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
实现非常简单的js双向数据绑定
2015/11/06 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
Vue数据绑定实例写法
2019/08/06 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
Python多线程编程(一):threading模块综述
2015/04/05 Python
使用Python实现将list中的每一项的首字母大写
2019/06/11 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
CSS3 background-image颜色渐变的实现代码
2018/09/13 HTML / CSS
解决img标签上下出现间隙的方法
2016/12/14 HTML / CSS
介绍一些UNIX常用简单命令
2014/11/11 面试题
医务工作者先进事迹材料
2014/01/26 职场文书
会计助理岗位职责
2014/02/17 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
2014年社区工作总结
2014/11/18 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
感恩教师主题班会
2015/08/12 职场文书
python基础学习之生成器与文件系统知识总结
2021/05/25 Python