一、背景

看見這種以人名命名的理論我都會查一下這個人到底是誰,這是百度百科里貝恭弘=叶 恭弘斯的頭像:


Paste_Image.png

這一身神甫打扮不禁讓我想起了豌豆狂魔孟德爾,於是我又在網上搜索一下“貝恭弘=叶 恭弘斯生平”,發現了一篇奇文《貝恭弘=叶 恭弘斯身世之謎》,長篇大論地研究了一下貝恭弘=叶 恭弘斯到底是哪一年出生的,末尾還對貝恭弘=叶 恭弘斯的頭像真實性提出了質疑。這還是發在《統計研究》(中文核心期刊)的正經的期刊文獻。

我只想問一句,讀研期間發了這樣的論文給畢業嗎???

二、思路

貝恭弘=叶 恭弘斯公式

我在百度百科發現這麼一張配圖:


我們就按照這張圖來講吧,事件A發生的概率為P(A);事件B發生的概率為P(B);在事件A發生的條件下事件B發生的概率為P(B|A);在事件B發生的條件下事件A發生的概率為P(A|B);事件A,B同時發生的概率為P(A∩B)。

可以得到P(A∩B)=P(A)×P(B|A),同樣的P(A∩B)=P(B)×P(A|B)
那麼有P(A)×P(B|A)=P(B)×P(A|B)轉化一下變成P(B|A)=P(A|B)×P(B)/P(A),這就是我們後面需要用到的公式。

樸素貝恭弘=叶 恭弘斯分類器

假設一個樣本,每個個體有四個特徵參數,分別為F1,F2,F3,F4,有兩個類別,分別為C0,C1。

那麼對於某個特定的樣本,其屬於C0類的概率為:P(C0|F1F2F3F4)=P(F1F2F3F4|C0)×P(C0)/P(F1F2F3F4)
屬於C1的概率為:P(C1|F1F2F3F4)=P(F1F2F3F4|C1)×P(C1)/P(F1F2F3F4)

樸素貝恭弘=叶 恭弘斯之所以有樸素兩個字,就是因為它把問題簡化了,假設所有特徵參數均相互獨立,這樣就有:

P(F1F2F3F4|C0)=P(F1|C0)×P(F2|C0)×P(F3|C0)×P(F4|C0)

我們把這個式子帶回去,樸素貝恭弘=叶 恭弘斯分類就變成了比較P(F1|C0)×P(F2|C0)×P(F3|C0)×P(F4|C0)×P(C0)以及P(F1|C1)×P(F2|C1)×P(F3|C1)×P(F4|C1)×P(C1)兩個量那個大的問題。

三、代碼

這次的實例與上一篇k近鄰算法相同,我們直接使用上次經過歸一化處理之後的數據。

  BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade
0           0.508755  0.526555      0.418244   0.325203               0.0
1           0.436707  0.481032      0.567986   0.443089               1.0
2           0.529417  0.412747      0.459552   0.483740               1.0
3           0.000000  0.613050      0.656627   0.609756               1.0
4           0.704730  0.464340      0.786575   0.723577               1.0
5           0.569675  0.429439      0.464716   0.686992               0.0
6           0.545946  0.347496      0.431153   0.752033               1.0
7           0.305294  0.391502      0.555077   0.609756               0.0
8           0.594509  0.335357      0.444062   0.776423               1.0
9           0.506505  0.074355      0.302926   0.691057               1.0

..               ...       ...           ...        ...               ...

處理數據
由於我們的數據是連續性數據,所以要先對數據進行區間分級:

for i in range(149):
    df['BallMillAbility'][i] = int(df['BallMillAbility'][i]/0.1)
    df['OreGrade'][i] = int(df['OreGrade'][i]/0.1)
    df['RateofMagnet'][i] = int(df['RateofMagnet'][i]/0.1)
    df['TailGrade'][i] = int(df['TailGrade'][i]/0.1)

得到:

BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade
0                5.0       5.0           4.0        3.0               0.0
1                4.0       4.0           5.0        4.0               1.0
2                5.0       4.0           4.0        4.0               1.0
3                0.0       6.0           6.0        6.0               1.0
4                7.0       4.0           7.0        7.0               1.0
5                5.0       4.0           4.0        6.0               0.0
6                5.0       3.0           4.0        7.0               1.0
7                3.0       3.0           5.0        6.0               0.0
8                5.0       3.0           4.0        7.0               1.0
9                5.0       0.0           3.0        6.0               1.0
..               ...       ...           ...        ...               ...

我們假設一個樣本歸一化處理之後是這樣的:
這裏之所以不使用上一篇文章中的那個樣本是因為,那個樣本最後預測出來的結果合格概率為0,太過絕對,所以我換了一個測試樣本,應該是因為樣本數量不夠大才出現這種情況)

BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade
         6.0          2.0         1.0         7.0           --

兩個變量的比較
指標合格的可能性:

P(F1|C=1)×P(F2|C=1)×P(F3|C=1)×P(F4|C=1)×P(C=1)

不合格的可能性:

P(F1|C=0)×P(F2|C=0)×P(F3|C=0)×P(F4|C=0)×P(C=0)

統計方法很簡單:

m = 0
for i in range(149):
    if df['BallMillAbility'][i] == 6 and df['ConcentrateGrade'][i] == 1:
        m+=1
print(m/149)
合格:0.0738×0.0469×0.0067×0.0402×0.3356=0.0000003128
不合格:0.1812×0.0604×0.0201×0.0738×0.6644=0.00001078

不合格的概率是合格的概率的34.46倍,基本可以確定這個樣本為不合格樣本。

四、總結

  1. 這次講的跟上次一樣,是一個沒有不包含模型訓練這一環節的簡單預測模型,可以看到我們預測的結果比k近鄰算法得到的結果傾向性更強一些。
  2. 使用這個方法最好數據量大一些,否則會出現某一項概率為零的情況,這樣就不好估計了。