Educoder 机器学习 第1关:基于贝叶斯决策理论的分类方法
第1關(guān):基于貝葉斯決策理論的分類方法
任務(wù)描述
本關(guān)任務(wù):理解樸素貝葉斯的分類思想,完成編程習(xí)題。
相關(guān)知識(shí)
為了完成本關(guān)任務(wù),你需要掌握:1.貝葉斯,2.樸素貝葉斯。
貝葉斯
樸素貝葉斯是貝葉斯決策理論的一部分,所以講述樸素負(fù)葉斯之前有必要快速了解一下貝葉斯決策理論。 假設(shè)現(xiàn)在我們有一個(gè)數(shù)據(jù)集,它由兩類數(shù)據(jù)組成,數(shù)據(jù)分布如圖1所示。
圖1 兩個(gè)參數(shù)已知的概率分布,參數(shù)決定了分布的形狀。
假設(shè)有位讀者找到了描述圖中兩類數(shù)據(jù)的統(tǒng)計(jì)參數(shù)。(暫且不用管如何找到描述這類數(shù)據(jù)的統(tǒng)計(jì)參數(shù),后面會(huì)詳細(xì)介紹。)我們現(xiàn)在用p1(x,y)表示數(shù)據(jù)點(diǎn)(x,y)屬于類別1(以圖中用圓點(diǎn)表示的類別)的概率,用p2(x,y) 表示數(shù)據(jù)點(diǎn)(x,y)屬于類別2 ( 圖中用三角形表示的類別)的概率,那么對于一個(gè)新數(shù)據(jù)點(diǎn)(x,y),可以用下面的規(guī)則來判斷它的類別: (1)如果 p1(x,y) > p2(x,y),那么類別為1。 (2)如果 p2(x,y) > pl(x,y),那么類別為2。 也就是說,我們會(huì)選擇高概率對應(yīng)的類別。這就是貝葉斯決策理論的核心思想,即選擇具有最高概率的決策。
樸素貝葉斯
優(yōu)點(diǎn):在數(shù)據(jù)較少的情況下仍然有效,可以處理多類別問題。 缺點(diǎn):對于輸入數(shù)據(jù)的準(zhǔn)備方式較為敏感。 適用數(shù)據(jù)類型:標(biāo)稱型數(shù)據(jù)。
回到圖1,如果該圖中的整個(gè)數(shù)據(jù)使用6個(gè)浮點(diǎn)數(shù)來表示,并且計(jì)算類別概 率的python代碼只有兩行,那么你會(huì)更傾向于使用下面哪種方法來對該數(shù)據(jù)點(diǎn)進(jìn)行分類? (1)使用第1章的kNN,進(jìn)行1000次距離計(jì)算; (2)使用第2章的決策樹,分別沿x軸 、y軸劃分?jǐn)?shù)據(jù); (3)計(jì)算數(shù)據(jù)點(diǎn)屬于每個(gè)類別的概率,并進(jìn)行比較。 使用決策樹不會(huì)非常成功;而和簡單的概率計(jì)算相比,kNN的計(jì)算量太大。因此,對于上述問題,最佳選擇是使用剛才提到的概率比較方法。
編程要求
根據(jù)提示,在右側(cè)編輯器補(bǔ)充代碼,運(yùn)行程序。
測試說明
根據(jù)所學(xué)完成右側(cè)編程題。
開始你的任務(wù)吧,祝你成功!
import numpy as np''' Parameters:無 Returns:postingList - 實(shí)驗(yàn)樣本切分的詞條classVec - 類別標(biāo)簽向量 ''' # 函數(shù)說明:創(chuàng)建實(shí)驗(yàn)樣本 def loadDataSet():postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], #切分的詞條['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],['stop', 'posting', 'stupid', 'worthless', 'garbage'],['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]classVec = [0,1,0,1,0,1]#類別標(biāo)簽向量,1代表侮辱性詞匯,0代表不是return postingList,classVec''' Parameters:vocabList - createVocabList返回的列表inputSet - 切分的詞條列表 Returns:returnVec - 文檔向量,詞集模型 ''' # 函數(shù)說明:根據(jù)vocabList詞匯表,將inputSet向量化,向量的每個(gè)元素為1或0 def setOfWords2Vec(vocabList, inputSet):returnVec = [0] * len(vocabList) #創(chuàng)建一個(gè)其中所含元素都為0的向量for word in inputSet: #遍歷每個(gè)詞條if word in vocabList: #如果詞條存在于詞匯表中,則置1returnVec[vocabList.index(word)] = 1else: print("the word: %s is not in my Vocabulary!" % word)return returnVec #返回文檔向量''' Parameters:dataSet - 整理的樣本數(shù)據(jù)集 Returns:vocabSet - 返回不重復(fù)的詞條列表,也就是詞匯表 ''' # 函數(shù)說明:將切分的實(shí)驗(yàn)樣本詞條整理成不重復(fù)的詞條列表,也就是詞匯表 def createVocabList(dataSet):vocabSet = set([]) #創(chuàng)建一個(gè)空的不重復(fù)列表for document in dataSet:vocabSet = vocabSet | set(document) #取并集return list(vocabSet)''' Parameters:trainMatrix - 訓(xùn)練文檔矩陣,即setOfWords2Vec返回的returnVec構(gòu)成的矩陣trainCategory - 訓(xùn)練類別標(biāo)簽向量,即loadDataSet返回的classVec Returns:p0Vect - 侮辱類的條件概率數(shù)組p1Vect - 非侮辱類的條件概率數(shù)組pAbusive - 文檔屬于侮辱類的概率 ''' # 函數(shù)說明:樸素貝葉斯分類器訓(xùn)練函數(shù) def trainNB0(trainMatrix,trainCategory):numTrainDocs = len(trainMatrix) #計(jì)算訓(xùn)練的文檔數(shù)目numWords = len(trainMatrix[0]) #計(jì)算每篇文檔的詞條數(shù)pAbusive = sum(trainCategory)/float(numTrainDocs) #文檔屬于侮辱類的概率p0Num = np.ones(numWords); p1Num = np.ones(numWords)#創(chuàng)建numpy.ones數(shù)組,詞條出現(xiàn)數(shù)初始化為1,拉普拉斯平滑p0Denom = 2.0; p1Denom = 2.0 #分母初始化為2,拉普拉斯平滑for i in range(numTrainDocs):##########if trainCategory[i]==1:p1Num+=trainMatrix[i]p1Denom+=sum(trainMatrix[i])else:p0Num+=trainMatrix[i]p0Denom+=sum(trainMatrix[i])##########p1Vect = np.log(p1Num/p1Denom) #取對數(shù),防止下溢出p0Vect = np.log(p0Num/p0Denom)#返回屬于侮辱類的條件概率數(shù)組,屬于非侮辱類的條件概率數(shù)組,文檔屬于侮辱類的概率return p0Vect,p1Vect,pAbusiveif __name__ == '__main__':postingList, classVec = loadDataSet()myVocabList = createVocabList(postingList)print('myVocabList:\n', myVocabList)trainMat = []#for循環(huán)使用詞向量來填充trainMat列表for postinDoc in postingList:trainMat.append(setOfWords2Vec(myVocabList, postinDoc))p0V, p1V, pAb = trainNB0(trainMat, classVec)print('p0V:\n', p0V)print('p1V:\n', p1V)print('classVec:\n', classVec)print('pAb:\n', pAb)?
總結(jié)
以上是生活随笔為你收集整理的Educoder 机器学习 第1关:基于贝叶斯决策理论的分类方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于spring cloud 免费搭建开
- 下一篇: 决策理论与方法