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 相关文章推荐
linux系统使用python监测系统负载脚本分享
Jan 15 Python
仅用500行Python代码实现一个英文解析器的教程
Apr 02 Python
Python实现建立SSH连接的方法
Jun 03 Python
在Django的通用视图中处理Context的方法
Jul 21 Python
浅谈python中的正则表达式(re模块)
Oct 17 Python
pandas 读取各种格式文件的方法
Jun 22 Python
Python函数定义及传参方式详解(4种)
Mar 18 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 Python
python判断元素是否存在的实例方法
Sep 24 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 Python
你需要掌握的20个Python常用技巧
Feb 28 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
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
PHPMailer使用教程(PHPMailer发送邮件实例分析)
2012/12/06 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
超级强大的表单验证
2006/06/26 Javascript
拖动一个HTML元素
2006/12/22 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
jquery把int类型转换成字符串类型的方法
2016/10/07 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
vue 组件基础知识总结
2021/01/26 Vue.js
[03:28]2014DOTA2国际邀请赛 走近EG战队天才中单Arteezy
2014/07/12 DOTA
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
python检测IP地址变化并触发事件
2018/12/26 Python
Django项目使用CircleCI的方法示例
2019/07/14 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
python实现邮件自动发送
2019/08/10 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
Django的ListView超详细用法(含分页paginate)
2020/05/21 Python
利用Python优雅的登录校园网
2020/10/21 Python
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
亚洲在线旅行门户网站:Expedia.com.hk(智游网)
2020/04/14 全球购物
物业客服专员岗位职责
2013/11/30 职场文书
大学生自荐信
2013/12/11 职场文书
小学二年级评语
2014/04/21 职场文书
社区服务活动小结
2014/07/08 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
总经理岗位职责范本
2015/04/01 职场文书
爱国影片观后感
2015/06/18 职场文书
Hive导入csv文件示例
2022/06/25 数据库
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS