機器學習實戰 ---- 樸素貝葉斯

一、貝葉斯的數學知識:

如圖所示,有三個罐子,1號罐子裏裝有2紅1黑三個球,2號裝有3紅1黑4個球,3號裝有2紅2黑4個球。從中隨機取一罐,再從中任意取出一球,如果已知取出的球爲紅球,求其屬於i號罐的概率:(設Bi事件爲取出的球來自i號罐,A事件爲取得的爲紅球)

                                                          

以上的公式稱爲貝葉斯公式。此題簡單,沒有太好的體現此公式的作用,在某些複雜的場景,直接求 比較困難,而利用此公式算更簡單。

 

       以下是貝葉斯在本章節的運用:

                                                     

 

樸素貝葉斯的樸素體現在文章的各個單詞出現的機率彼此之間不影響。比如可樂二字在可口後面出現的概率肯定是比出現在娃哈哈之後的概率的大,而樸素則表示它在可口娃哈哈之後出現的概率相同。而我們再學習的時候並沒有發現貝葉斯公式在代碼中的體現,我們判斷是因爲是“樸素”,特徵相互獨立,不存在包含,所以自然就不會有這個公式了。可以理解爲只有一個罐子裏裝有紅球,其他兩個罐子裏沒有紅球。

 

二、函數代碼


 

 
<strong><span style="color:#009900">#program4-1
def createVocabList(dataSet):
    vocabSet = set([ ])                      </span><span style="color:#ff0000">#創建一個空的不重複集合 ,並不是列表  </span><span style="color:#009900">   
     for document in dataSet:
        vocabSet = vocabSet | set(document) #取並集    </span><span style="color:#ff0000"> #set是一種數據類型,| 需是相同的數據類型    </span></strong>
<span style="color:#009900">return list(vocabSet)		</span>				

當測試這段代碼時會發現,相同的程序,我們多點幾次編譯,每次返回的結果的都不同。如下,雖然每次都是這些單詞,數量也不會改變,但是他們的順序會隨機改變。這是因爲一般的list是鏈表實現,而set是hash表實現。hash表實現就意味着無序。這也符合數學上的集合中的元素無序的規則。

 

 

def setOfWords2Vec(vocabList, inputSet): 
      returnVec = [0] * len(vocabList)                                         #創建一個其中所含元素都爲0的向量   [0]*5 = [0,0,0,0,0] 
      for word in inputSet:                                                    #遍歷每個詞條 
            if word in vocabList:                                              #如果詞條存在於詞彙表中,則置1 
               returnVec[vocabList.index(word)] = 1                            # vocabList.index(word)]:word在vocabList中的索引
               else: print("the word: %s is not in my Vocabulary!" % word) 
return returnVec 
[0]*5 = [0,0,0,0,0] 
      for word in inputSet:                                                    #遍歷每個詞條 
            if word in vocabList:                                              #如果詞條存在於詞彙表中,則置1 
               returnVec[vocabList.index(word)] = 1                            # vocabList.index(word)]:word在vocabList中的索引
               else: print("the word: %s is not in my Vocabulary!" % word) 
return returnVec 
#program4-2
for i in range(numTrainDocs): 
      if trainCategory[i] == 1:               #統計屬於侮辱類的條件概率所需的數劇:P(w0|1),P(w1|1),P(w2|1)··· 
      p1Num += trainMatrix[i] 
      p1Denom += sum(trainMatrix[i]) 
else: 			                     #統計屬於非侮辱類的條件概率所需的數據:P(w0|0),P(w1|0),P(w2|0)··· 
      p0Num += trainMatrix[i] 
      p0Denom += sum(trainMatrix[i]) 
p1Vect = log(p1Num/p1Denom)             
p0Vect = log(p0Num/p0Denom) 
#統計屬於侮辱類的條件概率所需的數劇:P(w0|1),P(w1|1),P(w2|1)··· 
      p1Num += trainMatrix[i] 
      p1Denom += sum(trainMatrix[i]) 
else: 			                     #統計屬於非侮辱類的條件概率所需的數據:P(w0|0),P(w1|0),P(w2|0)··· 
      p0Num += trainMatrix[i] 
      p0Denom += sum(trainMatrix[i]) 
p1Vect = log(p1Num/p1Denom)             
p0Vect = log(p0Num/p0Denom) 

 
#program4-3:
thisDoc = np.array(setOfWords2Vec(myVocabList, testEntry))         #測試樣本向量化 
if classifyNB(thisDoc,p0V,p1V,pAb): 
    print(testEntry,'屬於侮辱類’)                                   #執行分類並打印分類結果 
else: 
    print(testEntry,'屬於非侮辱類’) 
thisDoc = np.array(setOfWords2Vec(myVocabList, testEntry))         #此處如果爲矩陣則不能相乘,所以要轉化爲array。#此處如果爲矩陣則不能相乘,所以要轉化爲array。

 

 

#新瞭解到的函數
#Zeros():輸出的元素都爲0;
#Ones():輸出的元素都爲1;
#Str.lower():將字符串裏的字母全部轉變爲小寫
#Str.upper():將字符串裏的字母全部轉變爲大寫
#trainingSet = list(range(50))        #構建一個0-50的列表
#Zeros():輸出的元素都爲0;
#Ones():輸出的元素都爲1;
#Str.lower():將字符串裏的字母全部轉變爲小寫
#Str.upper():將字符串裏的字母全部轉變爲大寫
#trainingSet = list(range(50))        #構建一個0-50的列表

 

 

<span style="color:#009900">#randIndex = int(random.uniform(0, len(trainingSet)))  #取一個0到len(trainingSet)的隨機整形數字</span>
<span style="color:#009900">#uniform(x,y) 方法將隨機生成下一個實數,它在[x,y]範圍內。

</span>

 
<span style="color:#ff0000">#特殊使用格式</span>
<span style="color:#009900">Y = [2,3,1,4]
A = [x for x in y if x>2]
A = [3,4]</span>

 

三、正則表達式:

 

正則表達式的大致匹配過程是:依次拿出表達式和文本中的字符比較,如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則失敗。

<span style="color:#ff0000">Import re
regEx = re.compile(‘\\W*’)
listOfTokens = regEx.spilt(mySent)

等價於
listOfTokens = re.spilt(r’\W*’,mySent)

# re.compile(‘\\W*’):表示匹配任意個非單詞字符,等價於“[^A-Z a-z 0-9_]”。</span>

 

關於正則表達式的詳細介紹參考以下文章

四、零碎知識

1)RSS

     什麼叫RSS呢,如果訂閱了一個網站的RSS,那麼這麼這網站更新了內容之後,訂閱的相關內容會自動更新,讓我們不需要進入這個網站就可以知道網站更新了哪些文章,然後再直接選擇性的閱讀,這是我的拙見,可能不夠精確。詳細介紹參考此文章:

2)import xxfrom xx  import*的區別

舉個列子說明:

<span style="color:#009900">def test():
a = 1
b = 2
#使用import xx輸出a,b
import test
print(test.a)
print(test.b)
#使用from test import*輸出a,b
from test import*
print(a)
print(b)</span>

3)三個小概念

· 詞集模型:set of words,這是單詞構成的集合,集合每個元素數量只有一個。

·詞袋模型:bag of words ,此模型裏的單詞在文檔中出現了不止一次,該模型會統計出其出現的次數(頻率)

·留存交差驗證:從某個集合中隨機選擇一部分作爲訓練集,而剩餘的部分作爲測試集的過程。

4)算法對比

 

 

 

 

 

 

             

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章