0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于概率的常见的分类方法--朴素贝叶斯

算法&编程学院 来源:网络整理 2018-02-03 14:37 次阅读

今天介绍机器学习中一种基于概率的常见的分类方法,朴素贝叶斯,之前介绍的KNN, decision tree 等方法是一种 hard decision,因为这些分类器的输出只有0 或者 1,朴素贝叶斯方法输出的是某一类的概率,其取值范围在 0-1 之间,朴素贝叶斯在做文本分类,或者说垃圾邮件识别的时候非常有效。

朴素贝叶斯就是基于我们常用的贝叶斯定理:

假设我们要处理一个二分类问题: c1,c2,给定一个样本,比如说是一封邮件,可以用向量 x 来表示,邮件就是一个文本,而文本是由单词构成的,所以 x 其实包含了这封邮件里出现的单词的信息,我们要求的就是,给定样本 x ,我们需要判断这个样本是属于 c1 还是属于 c2,当然,我们可以用概率表示为:

这个就是我们常见的后验概率。根据贝叶斯定理,我们可以得到:

机器学习:朴素贝叶斯--python

这就是我们说的朴素贝叶斯,接下来的就是各种统计了。

我们给出一个利用朴素贝叶斯做文本分类的例子:

首先建立一个数据库:

def Load_dataset():

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 Create_vocablist(dataset):

vocabSet = set([])

for document in dataset :

vocabSet = vocabSet | set(document)

return list(vocabSet)

我们可以将样本转成向量:一种方法是只统计该单词是否出现,另外一种是可以统计该单词出现的次数。

def Word2Vec(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 the vocabulary” % word)

return returnVec

def BoW_Vec(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 the vocabulary” % word)

return returnVec

接下来,我们建立分类器:这里需要注意的是,由于概率都是 0-1 之间的数,连续的相乘,会让最终结果趋于0,所以我们可以把概率相乘转到对数域的相加:

def Train_NB(trainMat, trainClass) :

Num_doc = len(trainMat)

Num_word = len(trainMat[0])

P_1 = sum(trainClass) / float(Num_doc)

P0_num = np.zeros(Num_word) + 1

P1_num = np.zeros(Num_word) + 1

P0_deno = 2.0

P1_deno = 2.0

for i in range(Num_doc):

if trainClass[i] == 1:

P1_num += trainMat[i]

P1_deno +=sum(trainMat[i])

else:

P0_num += trainMat[i]

P0_deno += sum(trainMat[i])

P1_vec = np.log(P1_num / P1_deno)

P0_vec = np.log(P0_num / P0_deno)

return P_1, P1_vec, P0_vec

def Classify_NB(testVec, P0_vec, P1_vec, P1):

p1 = sum(testVec * P1_vec) + math.log(P1)

p0 = sum(testVec * P0_vec) + math.log(1-P1)

if p1 》 p0:

return 1

else:

return 0

def Text_parse(longstring):

import re

regEx = re.compile(r‘\W*’)

Listoftokens = regEx.split(longstring)

return [tok.lower() for tok in Listoftokens if len(tok)》0]

# return Listoftokens

这里给出简单的测试:

test_string = ‘This book is the best book on Python or M.L.\

I have ever laid eyes upon.’

wordList = Text_parse(test_string)

Mydata, classVec = Load_dataset()

‘’‘

Doc_list = []

Full_list = []

for i in range (len(Mydata)):

Doc_list.append(Mydata[i])

Full_list.extend(Mydata[i])

’‘’

Vocablist = Create_vocablist(Mydata)

Wordvec = Word2Vec(Vocablist, Mydata[0])

trainMat = []

for doc in Mydata:

trainMat.append(Word2Vec(Vocablist, doc))

P_1, P1_vec, P0_vec = Train_NB(trainMat, classVec)

print Mydata

print classVec

print wordList

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    66

    文章

    8457

    浏览量

    133190
  • python
    +关注

    关注

    56

    文章

    4811

    浏览量

    85126
收藏 人收藏

    相关推荐

    非常通俗的朴素算法(Naive Bayes)

    朴素算法(Naive Bayes)阅读目录一、病人分类的例子二、朴素贝叶斯
    发表于 10-08 10:14

    机器学习的朴素讲解

    秦刚刚的机器学习成长之路之朴素
    发表于 05-15 14:41

    朴素法的优缺点

    朴素法(1) 之 基础概念
    发表于 08-05 11:32

    朴素法的恶意留言过滤

    朴素法(2) 之 恶意留言过滤
    发表于 08-26 14:40

    常用的分类方法朴素

    统计学习方法朴素
    发表于 11-05 09:24

    朴素算法的理解

    我对朴素算法的理解
    发表于 05-15 14:13

    机器学习之朴素应用教程

    今天介绍机器学习中一种基于概率常见分类方法朴素
    发表于 11-25 12:49 1399次阅读
    机器学习之<b class='flag-5'>朴素</b><b class='flag-5'>贝</b><b class='flag-5'>叶</b><b class='flag-5'>斯</b>应用教程

    朴素算法的后延概率最大化的认识与理解

    朴素法是基于贝叶斯定理与特征条件独立假设的分类方法。最为广泛的两种
    发表于 11-30 17:11 3350次阅读
    <b class='flag-5'>朴素</b><b class='flag-5'>贝</b><b class='flag-5'>叶</b><b class='flag-5'>斯</b>算法的后延<b class='flag-5'>概率</b>最大化的认识与理解

    分类算法及其实现

     算法描述及实现根据朴素公式,每个测试样
    发表于 02-02 15:54 7470次阅读
    <b class='flag-5'>贝</b><b class='flag-5'>叶</b><b class='flag-5'>斯</b><b class='flag-5'>分类</b>算法及其实现

    朴素NB经典案例

    分类算法是统计学的一种分类方法,其分类原理就是
    发表于 02-28 10:17 2次下载

    机器学习之朴素

    学习过概率的人一定知道贝叶斯定理,在信息领域内有着无与伦比的地位。算法是基于贝叶斯定理的一类算法,主要用来解决分类和回归问题。人工智能
    发表于 05-29 09:01 928次阅读

    朴素算法详细总结

    朴素法是基于贝叶斯定理与特征条件独立假设的分类方法,是经典的机器学习算法之一,处理很多问题
    的头像 发表于 07-01 08:37 3.5w次阅读
    <b class='flag-5'>朴素</b><b class='flag-5'>贝</b><b class='flag-5'>叶</b><b class='flag-5'>斯</b>算法详细总结

    带你入门常见的机器学习分类算法——逻辑回归、朴素、KNN、SVM、决策树

    朴素方法是一组基于贝叶斯定理的监督学习算法,在给定类变量值的情况下,朴素假设每对特征之间存
    的头像 发表于 05-06 09:29 1w次阅读

    朴素分类 朴素算法的优点

    。 虽然这个简化方式在一定程度上降低了分类算法的分类效果,但是在实际的应用场景中,极大地简化了
    的头像 发表于 10-02 17:14 9428次阅读

    使用朴素和GPU进行更快的文本分类

    朴素( NB )是一种简单但功能强大的概率分类技术,具有良好的并行性,可以扩展到大规模数据
    的头像 发表于 10-10 14:50 1389次阅读
    使用<b class='flag-5'>朴素</b><b class='flag-5'>贝</b><b class='flag-5'>叶</b><b class='flag-5'>斯</b>和GPU进行更快的文本<b class='flag-5'>分类</b>