日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Educoder 机器学习 第1关:基于贝叶斯决策理论的分类方法

發(fā)布時(shí)間:2023/12/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Educoder 机器学习 第1关:基于贝叶斯决策理论的分类方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。