貝葉斯分類器給圖書分類

從問題開始:python

咱們解決的問題是,對圖書進行二元分類。分類的依據是圖書的tag。這樣tag可能來自專家,或者編輯,或者用戶。例如「外國文學」,「偵探」,「計算機」,「python」都屬於tag。簡化問題,咱們如今把圖書分爲「人文」或者「非人文」兩類。c++

例如《計算機科學導論》,它的tag有「計算機」,「科學」,「經典」,「導論」,它屬於「非人文」。《麥田裏的守望者》,它的tag有「小說」,「文學」,「美國」,它屬於「人文」。shell

基本原理:編程

貝葉斯分類器的工做原理:數組

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 那麼就屬於「人文」學習

條件機率:
spa

其實,這是一個條件機率的問題。所謂條件機率,就是求:在已知b發生的狀況下,a發生的機率,咱們寫做P(a|b)code

結合咱們的實際問題,那就是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
相關文章
相關標籤/搜索