朴素贝叶斯算法

简介: 朴素贝叶斯算法

基于贝叶斯决策理论的分类方法


优点:在数据较少的情况下仍然有效,可以处理多类别问题。

缺点:对于输入数据的准备方式较为敏感。

适用数据:标称型数据。


使用Python进行文本分类


准备数据:从文本中构建词向量

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([])
  for document in dataSet:
    vocabSet = vocabSet | set(document)
  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
listOPosts, listClasses = loadDataSet()
myVocabList = createVocabList(listOPosts)
myVocabList
output

['quit',
 'him',
 'is',
 'food',
 'to',
 'so',
 'please',
 'maybe',
 'love',
 'problems',
 'flea',
 'park',
 'stop',
 'not',
 'how',
 'take',
 'dog',
 'has',
 'i',
 'my',
 'dalmation',
 'garbage',
 'ate',
 'buying',
 'steak',
 'mr',
 'worthless',
 'stupid',
 'cute',
 'help',
 'licks',
 'posting']
setOfWords2Vec(myVocabList, listOPosts[0])

output

[0,
 0,
 0,
 0,
 0,
 0,
 1,
 0,
 0,
 1,
 1,
 0,
 0,
 0,
 0,
 0,
 1,
 1,
 0,
 1,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 0,
 1,
 0,
 0]

训练算法:从词向量计算概率

from numpy import *
def trainNB0(trainMatrix, trainCategory):
  numTrainDocs = len(trainMatrix)
  numWords = len(trainMatrix[0])
  pAbusive = sum(trainCategory) / float(numTrainDocs)
  p0Num = ones(numWords)
  p1Num = ones(numWords)
  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])
  p1Vect = log(p1Num / p1Denom)
  p0Vect = log(p0Num / p0Denom)
  return p0Vect, p1Vect, pAbusive
listOPosts, listClasses = loadDataSet()
myVocabList = createVocabList(listOPosts)
trainMat = []
for postinDoc in listOPosts:
  trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
listOPosts

output

[['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']]

trainMat
len(trainMat[0])

output

32


  trainMatrix = trainMat
  trainCategory = listClasses
  numTrainDocs = len(trainMatrix)
  numWords = len(trainMatrix[0])
  pAbusive = sum(trainCategory) / float(numTrainDocs)
  p0Num = ones(numWords)
  p1Num = ones(numWords)
  p0Denom = 2.0
  p1Denom = 2.0
  for i in range(numTrainDocs):
    if trainCategory[i] == 1:
      p1Num += trainMatrix[i]
      print(p1Num)
      p1Denom += sum(trainMatrix[i])
      print(p1Denom)
    else:
      p0Num += trainMatrix[i]
      print(p0Num)
      p0Denom += sum(trainMatrix[i])
      print(p0Denom)
  p1Vect = log(p1Num / p1Denom)
  p0Vect = log(p0Num / p0Denom)

output


[1. 1. 1. 1. 1. 1. 2. 1. 1. 2. 2. 1. 1. 1. 1. 1. 2. 2. 1. 2. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 2. 1. 1.]
9.0
[1. 2. 1. 1. 2. 1. 1. 2. 1. 1. 1. 2. 1. 2. 1. 2. 2. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 2. 1. 1. 1. 1.]
10.0
[1. 2. 2. 1. 1. 2. 2. 1. 2. 2. 2. 1. 1. 1. 1. 1. 2. 2. 2. 3. 2. 1. 1. 1.
 1. 1. 1. 1. 2. 2. 1. 1.]
17.0
[1. 2. 1. 1. 2. 1. 1. 2. 1. 1. 1. 2. 2. 2. 1. 2. 2. 1. 1. 1. 1. 2. 1. 1.
 1. 1. 2. 3. 1. 1. 1. 2.]
15.0
[1. 3. 2. 1. 2. 2. 2. 1. 2. 2. 2. 1. 2. 1. 2. 1. 2. 2. 2. 4. 2. 1. 2. 1.
 2. 2. 1. 1. 2. 2. 2. 1.]
26.0
[2. 2. 1. 2. 2. 1. 1. 2. 1. 1. 1. 2. 2. 2. 1. 2. 3. 1. 1. 1. 1. 2. 1. 2.
 1. 1. 3. 4. 1. 1. 1. 2.]
21.0

p0V, p1V, pAb = trainNB0(trainMat, listClasses)
pAb

output

0.5


p0V

output

array([-3.25809654, -2.15948425, -2.56494936, -3.25809654, -2.56494936,
       -2.56494936, -2.56494936, -3.25809654, -2.56494936, -2.56494936,
       -2.56494936, -3.25809654, -2.56494936, -3.25809654, -2.56494936,
       -3.25809654, -2.56494936, -2.56494936, -2.56494936, -1.87180218,
       -2.56494936, -3.25809654, -2.56494936, -3.25809654, -2.56494936,
       -2.56494936, -3.25809654, -3.25809654, -2.56494936, -2.56494936,
       -2.56494936, -3.25809654])
p1V

output

array([-2.35137526, -2.35137526, -3.04452244, -2.35137526, -2.35137526,
       -3.04452244, -3.04452244, -2.35137526, -3.04452244, -3.04452244,
       -3.04452244, -2.35137526, -2.35137526, -2.35137526, -3.04452244,
       -2.35137526, -1.94591015, -3.04452244, -3.04452244, -3.04452244,
       -3.04452244, -2.35137526, -3.04452244, -2.35137526, -3.04452244,
       -3.04452244, -1.94591015, -1.65822808, -3.04452244, -3.04452244,
       -3.04452244, -2.35137526])

测试算法:根据现实情况修改分类器

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 testingNB():
  listOPosts, listClasses = loadDataSet()
  myVocabList = createVocabList(listOPosts)
  trainMat = []
  for postinDoc in listOPosts:
    trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
  p0V, p1V, pAb = trainNB0(trainMat, listClasses)
  testEntry = ['love', 'my', 'dalmation']
  thisDoc = setOfWords2Vec(myVocabList, testEntry)
  print(testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb))
  testEntry = ['stupid', 'garbage']
  thisDoc = setOfWords2Vec(myVocabList, testEntry)
  print(testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb))
  testEntry = ['stupid']
  thisDoc = setOfWords2Vec(myVocabList, testEntry)
  print(testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb))
testingNB()

output

['love', 'my', 'dalmation'] classified as:  0
['stupid', 'garbage'] classified as:  1
['stupid'] classified as:  1
目录
相关文章
|
18天前
|
机器学习/深度学习 人工智能 自然语言处理
算法金 | AI 基石,无处不在的朴素贝叶斯算法
```markdown 探索贝叶斯定理:从默默无闻到AI基石。18世纪数学家贝叶斯的理论,初期未受重视,后成为20世纪机器学习、医学诊断和金融分析等领域关键。贝叶斯定理是智能背后的逻辑,朴素贝叶斯分类器在文本分类等应用中表现出色。贝叶斯网络则用于表示变量间条件依赖,常见于医学诊断和故障检测。贝叶斯推理通过更新信念以适应新证据,广泛应用于统计和AI。尽管有计算复杂性等局限,贝叶斯算法在小数据集和高不确定性场景中仍极具价值。了解并掌握这一算法,助你笑傲智能江湖! ```
25 2
算法金 | AI 基石,无处不在的朴素贝叶斯算法
|
16天前
|
算法 Serverless
使用朴素贝叶斯算法过滤垃圾邮件
使用朴素贝叶斯算法过滤垃圾邮件
21 2
|
18天前
|
机器学习/深度学习 算法 大数据
【机器学习】朴素贝叶斯算法及其应用探索
在机器学习的广阔领域中,朴素贝叶斯分类器以其实现简单、计算高效和解释性强等特点,成为了一颗璀璨的明星。尽管名字中带有“朴素”二字,它在文本分类、垃圾邮件过滤、情感分析等多个领域展现出了不凡的效果。本文将深入浅出地介绍朴素贝叶斯的基本原理、数学推导、优缺点以及实际应用案例,旨在为读者构建一个全面而深刻的理解框架。
47 1
|
9天前
|
算法
朴素贝叶斯算法
朴素贝叶斯算法
7 0
|
1月前
|
机器学习/深度学习 算法
【机器学习】比较朴素贝叶斯算法与逻辑回归算法
【5月更文挑战第10天】【机器学习】比较朴素贝叶斯算法与逻辑回归算法
|
1月前
|
算法 Python
使用Python实现朴素贝叶斯算法
使用Python实现朴素贝叶斯算法
52 0
|
1月前
|
算法
朴素贝叶斯算法应用
朴素贝叶斯算法应用
40 4
|
1月前
|
算法
朴素贝叶斯典型的三种算法
朴素贝叶斯主要有三种算法:贝努利朴素贝叶斯、高斯贝叶斯和多项式贝叶斯三种算法
|
1月前
|
机器学习/深度学习 算法
SVM算法、朴素贝叶斯算法讲解及对iris数据集分类实战(附源码)
SVM算法、朴素贝叶斯算法讲解及对iris数据集分类实战(附源码)
136 0
|
2天前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
23 8