189 8069 5689

怎么用贝叶斯分类器给图书分类

这篇文章主要讲解了“怎么用贝叶斯分类器给图书分类”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用贝叶斯分类器给图书分类”吧!

成都创新互联公司服务项目包括新民网站建设、新民网站制作、新民网页制作以及新民网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,新民网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到新民省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

从问题开始:

我们解决的问题是,对图书进行二元分类。分类的依据是图书的tag。这样tag可能来自专家,或者编辑,或者用户。例如“外国文学”,“侦探”,“计算机”,“python”都属于tag。简化问题,我们现在把图书分为“人文”或者“非人文”两类。

例如《计算机科学导论》,它的tag有“计算机”,“科学”,“经典”,“导论”,它属于“非人文”。《麦田里的守望者》,它的tag有“小说”,“文学”,“美国”,它属于“人文”。

基本原理:

贝叶斯分类器的工作原理:

P(a|b) = P(b|a)*P(a) / P(b)

这个意思就是:想要求P(a|b),而你又知道P(b|a),P(a),P(b)的值,那你就可以通过贝叶斯公式求得

已知一本书有些tag:tag1,tag2,tag3....它属于“人文”分类的概率是多少?属于“非人文”分类的概率呢?

假设p1表示在这种情况下,它属于“人文”的概率,p2表示这种情况下,它属于“非人文”的概率。

如果p1 > p2 那么就属于“人文”

条件概率:

其实,这是一个条件概率的问题。所谓条件概率,就是求:在已知b发生的情况下,a发生的概率,我们写作P(a|b)

结合我们的实际问题,那就是tag1,tag2,tag3已经发生的情况下,这本书属于“人文”和“非人文”的概率。我们写做

P(人文|tag1,tag2,tag3...)的意思就是在tag1,tag2,tag3...发生的情况下,这本书属于“人文”

P(非人文|tag1,tag2,tag3...)的意思就是在tag1,tag2,tag3...发生的情况下,这本书属于“非人文”

P(人文|tag1,tag2,tag3...) = P(tag1,tag2,tag3...|人文) * P(人文) / P(tag1,tag2,tag3...)

==>

P(tag1,tag2,tag3...|人文) :就是你知道在一本书已经被分类了“人文”的情况,tag1,tag2,tag3...一起出现的概率

P(人文):就是在被标记为“人文”分类的书,(在训练集)在所有书(“人文”和“非人文”)中出现的概率

P(tag1,tag2,tag3...):也就是tag1,tag2,tag3...在(训练集)所有tag出现的概率

这里有个值得注意的技巧,其实P(tag1,tag2,tag3...),我们不需要计算,因为我们的目的是比较

P(人文|tag1,tag2,tag3...)  和 P(非人文|tag1,tag2,tag3...) 的大小,不是为了得到实际的值,由于上述公式中分母

P(tag1,tag2,tag3...)是一样的。所以我们只需要比较分子的大小就可以了。

P(tag1,tag2,tag3...|人文) * P(人文)  和 P(tag1,tag2,tag3...|非人文) * P(非人文)的大小

朴素贝叶斯:

那么我们如何计算P(tag1,tag2,tag3...|人文) 呢?这里要用到朴素贝叶斯的概念,就是说,我们认为,在一本书中的标签里,每个标签都是相互独立的,与对方是否出现没有关系,也就是说“计算机”和“经典”出现的概率是互不相关的,不会因为出现了“计算机”就导致“经典”的出现概率高。

P(tag1,tag2,tag3...|人文)  = P(tag1|人文) * P(tag2|人文) * P(tag3|人文) ....

也就是计算每个tag,分别在“人文”和“非人文”书籍所有tag出现概率,然后将它们乘

举例分析:

我们现在有一本书《计算机科学导论》,它标签是“计算机”,“科学”,“理论”,“经典”,“导论”我们想知道这几个标签出现的情况下,《计算机科学导论》分别属于“人文”和“非人文”的概率

那么我们已经有了什么呢?幸运的是,我们目前有10本书,已知其中6本是“人文”,4本“非人文”。这个10本书,经过排重,一共有70个不同的标签,“计算机”,“科学”,“理论”,“导论”也在其中。

基于此,我们可以得出,P(人文)=6/10=0.6  P(非人文)=1-0.6=0.4 也就是说“人文”书在所有的书的概念0.6 “非人文”是0.4

接下来就是P(tag1,tag2,tag3...|人文) 和 P(tag1,tag2,tag3...|非人文)了,也就是说,我们要算出,在“人文”类里的所有数中,“计算机”,“科学”,“理论”,“经典”,“导论”这几个tag在“人文”数所有的tag的概率

1.准备训练集:

几乎所有的机器学习都需要训练集。贝叶斯分类也是一样的。上述,我们说的已知的数据,就是训练集。上面的例子列举的10本书,以及者10本书所排重后的tag,就是我们的训练集;而0.6 和 0.4 这两个概率就是P(tag1,tag2,tag3...|人文) 和 P(tag1,tag2,tag3...|非人文) 先验概率

基于我们的问题,我们需要准备100本书,人文分为“人文”和“非人文”两类,并且收集将这些书的所有tag。(可以爬去亚马逊或是豆瓣上的书籍资源)

2.形成tag集:

上述所说的tag,用python里的列表来保存,我们令其位dicts.dicts里的每一个元素是一个tag

dicts = [“科学”,“理论”,“c++”]这样的形式

3.计算训练集中的“人文”和“非人文”的概率

假设我们训练集中的这100本书,有60本是“人文”,那么P(人文) = 60 / 100 = 60 P(非人文) = 1 - P(人文) = 0.4

4.计算tag集中每个tag在训练集“人文”数据中tag出现的概率

首先,我们基于训练集构造一个列表,这个列表里的每一项又是一个列表,这个列表里的每一项,不是1就是0。1表示这个字典中这个位置的tag是这个书的一个tag

dicts=["计算机","小说","心理","科学","编程","行为","导论","经典","游记","美国",.....]   tag集

tag_vector_人文 = [

    [0,1,0,0,0,0,0,1,0,1],            第一本书《麦田的守望者》tag:"小说""经典""美国"

    [0,0,1,0,0,1,0,0,0,1],            第二本书《可预测的非理性》tag:"心理","行为","美国"

    [],            第三本书

......

tag_vector_非人文= [

    [],

    [],

    ....

]

有了这样的数据后,我们就好计算 P(tag1|人文)。对应tag1,我们计算出训练集里“人文”的所有书中,tag1出现的次数。

例如,在训练集里,“人文”有60本,其中40本都由经典的tag,那么我们就令num_of_tag1=40,依次类推

num_of_tag2=32,num_of_tag3=18...

然后,我们求出在“人文”类,所有书的tag标签总数,例如“人文”类2本书,第一本书的标签是“散文”,“经典”,“外国”,第二本书是“经典”,“小说”,那么所有本tag总数是3+2=5。现在我们求出训练集所有的100本tag的标签总数。假设总数是700.我们令total_人文=700

于是tag1在“人文”类里的出现的概率就是P(tag1|人文) = num_of_tag1 / total_人文 = 40/700=0.057

利用numpy

from numpy import *
num_tags_cate1 = ones(len(dicts))              #1
total_cate1 = 2.0                              #2
for item in tag_vector_cate1:
    num_tags_cate1 += item                     #3
    total_cate1 += sum(item)                   #4

p_tags_cate1 = num_tags_cate1 / total_cate1    #5

#1 表示生成一个numpy数组,ones()是numpy的函数,返回一个填充了数值为1的numpy数组。参数是这个数组的长度。
例如temp=ones(3),表示生成一个numpy的数组[1,1,1]并返回给temp。所以就是以训练集的tag集dicts的长度为参数,生成一个和dicts等长的填充了1的numpy数组。

#2 
#3 tag_vector_cate1 是 [[],[],[]] 而item是每个元素是一个列表,长度是dicts的长度,表示,对应的tag是否存在。
   numpy数组 + tag_vector_cate1的结果是,对应位置的元素相加
   a是一个numpy [1,2,3,5,0]  b是一个python的list [0,0,3,2,1]  a + b = [1,2,6,7,1] 结果是numpy的数组
#4 把每本书出现的所有tag数量相加,sum(item)也是numpy的函数,作用是讲item里面的每一项相加
   sum([2,5,-1]) = 2 + 5 - 1 = 6
   假如item是对应的list = [0,1,0,0,0,0,0,1,0,1]  对应是《麦田的守望者》  相当于总标签是3个
   
#5

感谢各位的阅读,以上就是“怎么用贝叶斯分类器给图书分类”的内容了,经过本文的学习后,相信大家对怎么用贝叶斯分类器给图书分类这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


名称栏目:怎么用贝叶斯分类器给图书分类
标题来源:http://cdxtjz.com/article/psgscp.html

其他资讯