好的,回去看完了Andrew Ng的關於這一節的公開課,還有中文的課堂筆記
然後參照了一下《集體智慧編程》這本書,現在對這個算法有一個全面的理解了
貝葉斯決策,基本上,從直觀理解就是做了這樣的事情:
給定歷史的數據和類別,然後新來一個數據,計算新來的數據屬於每個類別的概率,然後將新來的數據歸爲概率最大的那一類。
貝葉斯定理:
p(c|w)=p(w|c)p(c)p(w)
爲什麼說是樸素貝葉斯:
- n個特徵相互獨立 (爲了簡化條件概率的計算)
- n個特徵同等重要
問題場景:
就舉《機器學習實戰》的例子吧,做一個文本分類,如果一段文本里,包含侮辱性詞彙,標記爲不當言論。
直觀理解:
c is category, w is words,可以理解成郵件
c = 0 : 不是垃圾郵件
c = 1 : 是垃圾郵件
先看怎樣運作:
對一個特定的郵件 w,
我計算
判斷這兩個概率哪個大,就把文檔歸爲哪一類。
本來我們計算兩個概率,是應該根據貝葉斯定理的公式(如上)的,但是對於一篇文檔來說,
目標函數:
p(c|w)=p(w|c)p(c)
以下闡述幫助理解,實際用時要做優化,優化在最後提一下
該如何建模?
生成詞集模型:
把所有郵件(假設我把我目前郵箱裏的所有郵件都用做訓練),分詞,將所有出現過的詞語包含到一個set當中。
生成文本向量:
假設剛剛set有1000個詞,那麼我將每個郵件做成一個1000維的向量,每一維對應這個詞是否在該文檔出現,用0,1表示。
訓練模型:
我們是對這樣一個生成模型建模,生成模型求的是聯合概率。
先說個簡單的,
那麼
我們還是分爲兩部分:
p(w|c=1) :
在那些標記爲垃圾郵件的文本向量中,假設有n個:
我們把他們全部加起來,得到一個向量,然後再將這個向量的每一位都除以n。
好的我們就得到了一個特徵向量
同理可得
這裏就可以看出,生成模型是什麼,我們之前不知道參數的大小,是通過訓練集生成參數,然後再來求條件概率,換句話說,我們是對參數進行了最大似然估計。
驗證方法:
用了向量乘積來判別
p1 = sum(vec2Classify * p1Vec) + log(pClass1) #element-wise mult
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
if p1 > p0:
return 1
else:
return 0
vec2Classify 爲待檢驗的文本向量;
這裏做了一下數學處理(log)
我想說的是,爲什麼驗證方法中的前半部分是文本向量與特徵向量對位相乘然後求和呢?
我們知道,特徵向量中是對位該詞出現的概率,而文本向量中是是否出現,用0,1表示
所以,對位相乘,粗淺理解,就是表現該文檔中這些特徵詞一共出現了多少。
換句話說吧,我們會不會有這樣的疑問?
爲什麼我們不建立一個dirty words的dict,然後去掃新郵件中有沒有包含dict中的詞語,這樣不就可以直接確定分類了麼?要概率幹嘛?
我個人的理解,特徵向量,就是最能夠表示該類別特性的一個向量,那些再特徵向量中出現的概率高的詞,最能代表了該類別文本的特性,也就是說,如果有一個文檔,包含了這些詞,是有極大可能屬於該類別的。
所以,如果只建立dict的話,有這樣的問題,垃圾郵件只是說明包含這些特徵詞的概率大,但是不能完全確定一封郵件只要有這個詞,就是屬於垃圾郵件,所以只是概率的問題。
這樣結合考慮,應該能夠明白了吧。
所以,上述只是幫助理解的一個小例子,如果實用,要優化:
1. 換詞集爲詞袋,考慮文本中單詞出現的頻次,而不是簡單用0,1表示是否出現
2. 中間步驟
還有更多優化步驟,我就不多說了…..