下面總結幾個我在學習貝葉斯公式的時候能夠對我的理解有所幫助的要點,首先引用一句話:
「概率論只不過把常識用數學公式表達了出來」——拉普拉斯貝葉斯公式將人的思維方式用數學公式表達出來,所以貝葉斯公式在機器學習中的應用則是將人的思維賦予機器。
先抄一遍貝葉斯公式:
貝葉斯公式的直觀理解就是,展示了先驗概率跟後驗概率之間的數學關係,那麼什麼是先驗概率,後驗概率又是什麼呢?後驗概率就是乙個在已知結果的情況下,對這個結果的可能原因的概率推測,是一種事後的原因推測,所以叫後驗,式中左邊需要求解的p(a|b)就是後驗概率,而當中的a可能存在多種基本事件,對於每個a都有乙個後驗概率值。相對應的先驗概率就是在事件發生前對基本事件的概率**,比如說我口袋裡有四顆球,2顆白色,2顆黑色,我下一次從中抓乙個球是黑色的概率就是1/2,這個是在我試驗發生之前的**,所以這個1/2就是先驗概率。公式當中的p(a)就是乙個先驗概率,另外在公式**現的p(b|a)就是類條件概率,這個就暫時按照條件概率這麼理解吧。大多時候,後驗概率都是乙個比較難求解的值,所以貝葉斯公式就提供一種數學表示式,利用先驗概率求解後驗概率。
回到我們的例子當中,單詞拼寫糾正就是對已經寫錯了的單詞,推測輸入人想要輸入的正確單詞,這就是我們的後驗概率p(a|b),原因是想輸入a單詞,結果是不小心輸入了b單詞。我們在推測他想輸入的詞的時候,這個正確的單詞存在多種情況,所以a存在a1,a2,a3…多個事件,只不過每個事件都可以用公式求出後驗概率,最終後驗概率最大的那個事件作為糾正的結果。這個就是糾正器的整體思路。
展開這個貝葉斯公式之後,不管存在多少個可能事件a,他們的分母都是p(b),所以我們比較分子的大小就可以了。p(a)是先驗概率,他的值就是下乙個輸入單詞是a的概率,我們拋去主觀原因,但從概率論的角度計算,它的概率就是已經輸入的單詞中,a出現的頻率。分子中的p(b|a)的直觀理解就是想輸入正確的a,結果輸入了錯誤的b的概率,這個很難量化,輸錯成某個單詞的概率跟鍵盤的位置有關,又跟某人的手殘程度有關,但是我們能夠確定的是做一次修改的概率肯定遠遠大於做兩次修改的概率(一次修改就是單詞中對字母只做一次修改,修改包括增加、刪除、替換、移動,這裡移動只考慮鄰近字母相互換位置,實際中也只存在這種錯誤)。所以如果有做一次修改就能變成正確單詞,就絕對不會讓做兩次修改才能正確的單詞作為它的糾正結果。那麼對於只做一次就修正正確的單詞,他的後驗概率就只需要比較p(a)這個先驗概率了,而p(a)可以根據詞庫**現的單詞頻率得到。
最終得到思路:
計算詞頻
import collections
import re
#讀取語料庫
file
=open
(r'big.txt'
,'r'
)text =
file
.read(
)#正規表示式提取所有英文單次
words = re.findall(
'\w+'
,text.lower())
#英文單次計數
counter = collections.counter(words)
print
(max
(counter,key=counter.get)
,counter[
max(counter,key=counter.get)
])
一次糾正的單詞集合#定義一次糾正可能得到的單詞集合
deffirst_transformation
(word)
:#26個字母構成的列表
letters =
[chr
(i)for i in
range(97
,123)]
m =len(word)
edit_word =
for i in
range
(m):
if i < m -2:
0:i]
+ word[i+1]
+ word[i]
+ word[i+2:
])#移動,只考慮相鄰兩個之間的交換位置
0:i]
+ word[i+1:
])#刪除for letter in letters:
0:i]
+ letter + word[i+1:
])#替換0
:i]+ letter + word[i:])
#增加elif i == m -2:
0:i]
+ word[i+1]
+ word[i]
)#移動
0:i]
+ word[i+1:
])#刪除for letter in letters:
0:i]
+ letter + word[i+1:
])#替換0
:i]+ letter + word[i:])
#增加else
:for letter in letters:
0:i]
+ letter + word[i:])
#增加0
:i]+ letter)
#替換0
:i])
#刪除return edit_word
二次糾正形成的單詞集合#二次糾正形成的單詞集合
defsecond_transformation
(word)
: edit2_word =
first = first_transformation(word)
for j in first:
edit2_word.extend(first_transformation(j)
)return edit2_word
逐個比較#如果輸入單詞能在語料庫中找到,則返回原單詞
defitself
(word)
: correct =
set(
)if word in counter.keys():
correct.add(word)
return correct
#取備選集合跟語料庫字典中的交集
defintersect
(words)
: set_1 =
set(counter.keys())
set_2 =
set(words)
correct_word = set_1.intersection(set_2)
return correct_word
#糾正器
defcorrect
(word)
: correction = itself(word)
or intersect(first_transformation(word)
)or intersect(second_transformation(word)
) frequency =
iflen
(correction)==0
:return word
else
:for predict_word in correction:
frequency[predict_word]
= counter.setdefault(predict_word,0)
return
max(frequency,key=frequency.get)
最終的結果是即使需要修改兩次也能找出正確單詞,只不過準確率取決於詞庫當中的詞頻。
總結了這麼多貝葉斯公式的要點,下面再扯一扯似然函式跟最大似然估計。假如把f(x|θ)當做乙個θ固定的概率密度函式,那麼反過來θ–>f(x|θ)就是認為x是固定的似然函式。似然函式一般寫成l(θ|x)=f(x|θ)。
最大似然估計就是在θ的定義域中,似然函式取得最大值時θ的大小。意思就是後驗概率取得最大值時,θ的取值最大似然估計就是最符合實際情況的θ的取值。就是說結果已經發生了,既然能發生這個結果,那麼發生這個結果的可能性一定要盡可能的大,所以一定是當前的後驗概率取得最大值的θ取值作為最優解。
貝葉斯單詞拼寫檢查器
記錄一下簡單的單詞拼寫檢查器,達到能對錯誤單詞進行簡單的修正的目的。要是遇到我們從來沒有過見過的新詞怎麼辦.假如說乙個詞拼寫完全正確,但是語料庫中沒有包含這個詞,從而這個詞也永遠不會出現在訓練集中.於是,我們就要返回出現這個詞的概率是0.這個情況不太妙,因為概率為0這個代表了這個事件絕對不可能發生,...
貝葉斯演算法(2)貝葉斯演算法實現單詞拼寫檢查器
import re,collections 把語料中的單詞全部抽取出來,轉成小寫,並且去除單詞中間的特殊符號 defwords text return re.findall a z text.lower deftrain features 要是遇到我們從來沒有過見過的新詞怎麼辦.假如說乙個詞拼寫完全...
利用樸素貝葉斯實現拼寫檢查器
import re import collections class spellcheck p c w p w c p c p w p c 文章出現正確拼寫詞c的概率,程式中直接用詞頻表示 p w c 使用者把詞c錯敲成w的概率 alphabet list abcdefghijklmnopqrstu...