Python實(shí)現(xiàn)貝葉斯分類器_第1頁(yè)
Python實(shí)現(xiàn)貝葉斯分類器_第2頁(yè)
Python實(shí)現(xiàn)貝葉斯分類器_第3頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、關(guān)于樸素貝葉斯樸素貝葉斯算法是一個(gè)直觀的方法,使用每個(gè)屬性歸屬于某個(gè)類的概率來(lái)做預(yù)測(cè)。你可以使用這種監(jiān)督性學(xué)習(xí)方法,對(duì)一個(gè)預(yù)測(cè)性建模問(wèn)題進(jìn)行概率建模。給定一個(gè)類,樸素貝葉斯假設(shè)每個(gè)屬性歸屬于此類的概率獨(dú)立于其余所有屬性,從而簡(jiǎn)化了概率的計(jì)算。這種強(qiáng)假定產(chǎn)生了一個(gè)快速、有效的方法。給定一個(gè)屬性值,其屬于某個(gè)類的概率叫做條件概率。對(duì)于一個(gè)給定的類值,將每個(gè)屬性的條件概率相乘,便得到一個(gè)數(shù)據(jù)樣本屬于某個(gè)類的概率。我們可以通過(guò)計(jì)算樣本歸屬于每個(gè)類的概率,然后選擇具有最高概率的類來(lái)做預(yù)測(cè)。通常,我們使用分類數(shù)據(jù)來(lái)描述樸素貝葉斯,因?yàn)檫@樣容易通過(guò)比率來(lái)描述、計(jì)算。一個(gè)符合我們目的、比較有用的算法需要支持?jǐn)?shù)

2、值屬性,同時(shí)假設(shè)每一個(gè)數(shù)值屬性服從正態(tài)分布(分布在一個(gè)鐘形曲線上),這又是一個(gè)強(qiáng)假設(shè),但是依然能夠給出一個(gè)健壯的結(jié)果。預(yù)測(cè)糖尿病的發(fā)生本文使用的測(cè)試問(wèn)題是“皮馬印第安人糖尿病問(wèn)題”。這個(gè)問(wèn)題包括768個(gè)對(duì)于皮馬印第安患者的醫(yī)療觀測(cè)細(xì)節(jié),記錄所描述的瞬時(shí)測(cè)量取自諸如患者的年紀(jì),懷孕和血液檢查的次數(shù)。所有患者都是21歲以上(含21歲)的女性,所有屬性都是數(shù)值型,而且屬性的單位各不相同。每一個(gè)記錄歸屬于一個(gè)類,這個(gè)類指明以測(cè)量時(shí)間為止,患者是否是在5年之內(nèi)感染的糖尿 病。如果是,則為 1,否則為0。機(jī)器學(xué)習(xí)文獻(xiàn)中已經(jīng)多次研究了這個(gè)標(biāo)準(zhǔn)數(shù)據(jù)集,好的預(yù)測(cè)精度為70%-76%下面是文件中的一個(gè)樣本,了解一

3、下我們將要使用的數(shù)據(jù)。注意:下載文件,然后以.csv擴(kuò)展名保存(如:)。查看文件中所有屬性的描述。Pytho nId 11 6,148,72,35,0,33.6,0.627,50,12 1,85,66,29,0,26.6,0.351,31,03 8,183,64,0,0,23.3,0.672,32,14 1,89,66,23,94,28.1,0.167,21,05 0,137,40,35,168,43.1,2.288,33,1樸素貝葉斯算法教程教程分為如下幾步:1. 處理數(shù)據(jù):從CSV文件中載入數(shù)據(jù),然后劃分為訓(xùn)練集和測(cè)試集。2. 提取數(shù)據(jù)特征:提取訓(xùn)練數(shù)據(jù)集的屬性特征,以便我們計(jì)算概率并做出

4、預(yù)測(cè)。3. 單一預(yù)測(cè):使用數(shù)據(jù)集的特征生成單個(gè)預(yù)測(cè)。4. 多重預(yù)測(cè):基于給定測(cè)試數(shù)據(jù)集和一個(gè)已提取特征的訓(xùn)練數(shù)據(jù)集生成預(yù)測(cè)。5. 評(píng)估精度:評(píng)估對(duì)于測(cè)試數(shù)據(jù)集的預(yù)測(cè)精度作為預(yù)測(cè)正確率。6. 合并代碼:使用所有代碼呈現(xiàn)一個(gè)完整的、獨(dú)立的樸素貝葉斯算法的實(shí)現(xiàn)。1. 處理數(shù)據(jù)首先加載數(shù)據(jù)文件。CSV格式的數(shù)據(jù)沒有標(biāo)題行和任何引號(hào)。我們可以使用csv模塊中的open函數(shù)打開文件,使用reader函數(shù)讀取行數(shù)據(jù)。我們也需要將以字符串類型加載進(jìn)來(lái)屬性轉(zhuǎn)換為我們可以使用的數(shù)字。下面是用來(lái)加載匹馬印第安人數(shù)據(jù)集(Pima indians dataset )的loadCsv()函數(shù)。Pytho nd 1L1FL

5、oaded data file iris.data.csv with 150 rows下一步,我們將數(shù)據(jù)分為用于樸素貝葉斯預(yù)測(cè)的訓(xùn)練數(shù)據(jù)集,以及用來(lái)評(píng)估模型精度的測(cè)試數(shù)據(jù)集。我們需要將數(shù)據(jù)集隨機(jī)分為包含67%勺訓(xùn)練集合和包含 33%勺測(cè)試集(這是在此數(shù)據(jù)集上測(cè)試算法的通常比率)。下面是splitDataset() 函數(shù),它以給定的劃分比例將數(shù)據(jù)集進(jìn)行劃分。Split 5 rows into train with 4,3,5 and test with 1,12提取數(shù)據(jù)特征樸素貝葉斯模型包含訓(xùn)練數(shù)據(jù)集中數(shù)據(jù)的特征,然后使用這個(gè)數(shù)據(jù)特征來(lái)做預(yù)測(cè)。所收集的訓(xùn)練數(shù)據(jù)的特征,包含相對(duì)于每個(gè)類的每個(gè)屬性的

6、均值和標(biāo)準(zhǔn)差。舉例來(lái)說(shuō),如果如果有2個(gè)類和7個(gè)數(shù)值屬性,然后我們需要每一個(gè)屬性(7)和類(2)的組合的均值和標(biāo)準(zhǔn)差,也就是14個(gè)屬性特征。在對(duì)特定的屬性歸屬于每個(gè)類的概率做計(jì)算、預(yù)測(cè)時(shí),將用到這些特征。1 dataset = 1,20,1, 2,21,0, 3,22,12 separated = separateByClass(dataset)3 prin t('Separated in sta nces: 0').format(separated)運(yùn)行測(cè)試,你會(huì)看到如下結(jié)果:Pythonnu mbers = 1,2,3,4,51prin t('Summary of 0

7、: mea n=1, stdev=2').format( nu mbers, mea n(nu mbers), 2stdev( nu mbers)運(yùn)行測(cè)試,你會(huì)看到如下結(jié)果:Python1 import csv2 def loadCsv(file name):3 lines = csv.reader(ope n( file name, "rb")4 dataset = list(l in es)5 for i in ran ge(le n( dataset):6 dataseti = float(x) for x in datase ti7 retur n data

8、set我們可以通過(guò)加載皮馬印第安人數(shù)據(jù)集,然后打印出數(shù)據(jù)樣本的個(gè)數(shù),以此測(cè)試這個(gè)函數(shù)。Pytho n3file name = 2 dataset = loadCsv(file name)prin t('Loaded data file 0 with 1 rows').format(file name,3len( dataset)運(yùn)行測(cè)試,你會(huì)看到如下結(jié)果:PythonPython1 import ran dom2 def splitDataset(dataset, splitRatio):3 trai nSize = in t(le n(dataset) * splitRati

9、o)4 trai nSet =5 copy = list(dataset)6 while len (tra in Set) < trai nSize:7 in dex = ran dom.ra ndran ge(le n( copy)8 train Set.appe nd(copy.pop(i ndex)9 retur n tra in Set, copy我們可以定義一個(gè)具有5個(gè)樣例的數(shù)據(jù)集來(lái)進(jìn)行測(cè)試,首先它分為訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集,然后打印出來(lái),看看每個(gè)數(shù)據(jù)樣本最終落在哪個(gè)數(shù)據(jù)集。Python1234dataset = 1, 2, 3, 4, 5splitRatio = 0.67tr

10、ain, test = splitDataset(dataset, splitRatio)print('Split 0 rows into train with 1 and test with 2').format(len(dataset), train, test)運(yùn)行測(cè)試,你會(huì)看到如下結(jié)果:Python我們將數(shù)據(jù)特征的獲取劃分為以下的子任務(wù):1. 按類別劃分?jǐn)?shù)據(jù)2. 計(jì)算均值3. 計(jì)算標(biāo)準(zhǔn)差4. 提取數(shù)據(jù)集特征5. 按類別提取屬性特征按類別劃分?jǐn)?shù)據(jù)首先將訓(xùn)練數(shù)據(jù)集中的樣本按照類別進(jìn)行劃分,然后計(jì)算出每個(gè)類的統(tǒng)計(jì)數(shù)據(jù)。我們可以創(chuàng)建一個(gè)類別到屬于此類別的樣本列表的的映射,并將整

11、個(gè)數(shù)據(jù)集中的樣本分類到相應(yīng)的列 表。下面的SeparateByClass() 函數(shù)可以完成這個(gè)任務(wù):Pytho nd I/1 def separateByClass(dataset):2 separated = 3 for i in ran ge(le n( dataset):4 vector = dataseti5 if (vector-1 not in separated):6 separatedvector-1=7 separatedvector-1.appe nd(vector)8 retur n separated可以看出,函數(shù)假設(shè)樣本中最后一個(gè)屬性(-1 )為類別值,返回一個(gè)類別值

12、到數(shù)據(jù)樣本列表的映射。我們可以用一些樣本數(shù)據(jù)測(cè)試如下:Python3d 1JSeparated instances: 0: 2,21, 0,1: 1,20, 1, 3,22,11計(jì)算均值我們需要計(jì)算在每個(gè)類中每個(gè)屬性的均值。均值是數(shù)據(jù)的中點(diǎn)或者集中趨勢(shì),在計(jì)算概率時(shí),我們用它作為高斯分布的中值。我們也需要計(jì)算每個(gè)類中每個(gè)屬性的標(biāo)準(zhǔn)差。標(biāo)準(zhǔn)差描述了數(shù)據(jù)散布的偏差,在計(jì)算概率時(shí),我們用它來(lái)刻畫高斯分布中,每個(gè)屬性所期望的散布。標(biāo)準(zhǔn)差是方差的平方根。方差是每個(gè)屬性值與均值的離差平方的平均數(shù)。注意我們使用N-1的方法(譯者注:參見無(wú)偏估計(jì)),也就是在在計(jì)算方差時(shí),屬性值的個(gè)數(shù)減1。Pythonimpo

13、rt math2 def mean(numbers):retur n sum(nu mbers)/float(le n(nu mbers)343 def stdev( nu mbers):4 avg = mean(nu mbers)5 varia nee = sum(pow(x-avg,2) for x in nu mbers)/float(le n(nu mbers)-1)8retur n math.sqrt(varia nee)通過(guò)計(jì)算從1到5這5個(gè)數(shù)的均值來(lái)測(cè)試函數(shù)。Python3d 1J1 Summary of 1,2, 3, 4, 5: mea n=3.0, stdev=1.5811

14、3883008提取數(shù)據(jù)集的特征現(xiàn)在我們可以提取數(shù)據(jù)集特征。對(duì)于一個(gè)給定的樣本列表(對(duì)應(yīng)于某個(gè)類),我們可以計(jì)算 每個(gè)屬性的均值和標(biāo)準(zhǔn)差。zip函數(shù)將數(shù)據(jù)樣本按照屬性分組為一個(gè)個(gè)列表,然后可以對(duì)每個(gè)屬性計(jì)算均值和標(biāo)準(zhǔn)差。Python丄J1234def summarize(dataset):summaries = (mea n( attribute), stdev(attribute) for attribute in zip(*dataset)del summaries-1retur n summaries我們可以使用一些測(cè)試數(shù)據(jù)來(lái)測(cè)試這個(gè)summarize()函數(shù),測(cè)試數(shù)據(jù)對(duì)于第一個(gè)和第二個(gè)數(shù)

15、據(jù)屬性的均值和標(biāo)準(zhǔn)差顯示出顯著的不同。Python1 dataset = 1,20,0, 2,21,1, 3,22,02 summary = summarize(dataset)3 print('Attribute summaries: 0').format(summary)運(yùn)行測(cè)試,你會(huì)看到如下結(jié)果:Pythonad 11 Attribute summaries: (2.0, 1.0), (21.0, 1.0)按類別提取屬性特征合并代碼,我們首先將訓(xùn)練數(shù)據(jù)集按照類別進(jìn)行劃分,然后計(jì)算每個(gè)屬性的摘要。Python3d 11 def summarizeByClass(datase

16、t):2 separated = separateByClass(dataset)3 summaries = 4 for classValue, in sta nces in separated.iteritems():5 summariesclassValue = summarize nsta nces)6 retur n summaries使用小的測(cè)試數(shù)據(jù)集來(lái)測(cè)試summarizeByClass()函數(shù)。Python1 dataset = 1,20,1, 2,21,0, 3,22,1, 4,22,02 summary = summarizeByClass(dataset)3 prin t(

17、'Summary by class value: 0').format(summary)運(yùn)行測(cè)試,你會(huì)看到如下結(jié)果:Pythond 11 Summary by class value:23預(yù)測(cè)我們現(xiàn)在可以使用從訓(xùn)練數(shù)據(jù)中得到的摘要來(lái)做預(yù)測(cè)。做預(yù)測(cè)涉及到對(duì)于給定的數(shù)據(jù)樣本, 計(jì)算其歸屬于每個(gè)類的概率,然后選擇具有最大概率的類作為預(yù)測(cè)結(jié)果。我們可以將這部分劃分成以下任務(wù):1. 計(jì)算高斯概率密度函數(shù)2. 計(jì)算對(duì)應(yīng)類的概率3. 單一預(yù)測(cè)4. 評(píng)估精度計(jì)算高斯概率密度函數(shù)給定來(lái)自訓(xùn)練數(shù)據(jù)中已知屬性的均值和標(biāo)準(zhǔn)差,我們可以使用高斯函數(shù)來(lái)評(píng)估一個(gè)給定的屬性值的概率。已知每個(gè)屬性和類值的屬性特

18、征,在給定類值的條件下,可以得到給定屬性值的條件概率。關(guān)于高斯概率密度函數(shù),可以查看參考文獻(xiàn)??傊覀円岩阎募?xì)節(jié)融入到高斯函數(shù) 性值,均值,標(biāo)準(zhǔn)差),并得到屬性值歸屬于某個(gè)類的似然(譯者注:即可能性)。在calculateProbability()函數(shù)中,我們首先計(jì)算指數(shù)部分,然后計(jì)算等式的主干。這樣可以將其很好地組織成2行。Pytho nI3(屬1234import mathdef calculateProbability(x, mean, stdev):exponent =math.exp(-(math.pow(x-mea n,2)/(2*math.pow(stdev,2)retur

19、 n (1 / (math.sqrt(2*math.pi) * stdev) * exp onent使用一些簡(jiǎn)單的數(shù)據(jù)測(cè)試如下:3d 1Pythonx = 71.51mea n = 732stdev = 6.23probability = calculateProbability(x, mea n, stdev)4print('Probability of belonging to this class:50').format(probability)運(yùn)行測(cè)試,你會(huì)看到如下結(jié)果:Python1 Probability of belonging to this class: 0.

20、0624896575937計(jì)算所屬類的概率既然我們可以計(jì)算一個(gè)屬性屬于某個(gè)類的概率,那么合并一個(gè)數(shù)據(jù)樣本中所有屬性的概率, 最后便得到整個(gè)數(shù)據(jù)樣本屬于某個(gè)類的概率。使用乘法合并概率,在下面的calculClassProbilities()函數(shù)中,給定一個(gè)數(shù)據(jù)樣本,屬每個(gè)類別的概率,可以通過(guò)將其屬性概率相乘得到。結(jié)果是一個(gè)類值到概率的映射。Pytho n它所123456789Pythondef calculateClassProbabilities(summaries, in putVector): probabilities = for classValue, classSummaries i

21、n summaries.iteritems(): probabilitiesclassValue = 1 for i in ran ge(le n( classSummaries): mean, stdev = classSummaries" x = in putVectori probabilitiesclassValue *= calculateProbability(x, mean, stdev)retur n probabilities函數(shù)。測(cè)試 calculateClassProbabilities()summaries = 0:(1,0.5), 1:(20, 5.0)1

22、in putVector = 1.1, '?'2 probabilities = calculateClassProbabilities(summaries,3 in putVector)4 prin t('Probabilities for each class:0').format(probabilities)運(yùn)行測(cè)試,你會(huì)看到如下結(jié)果:PythonProbabilities for each class: 0: 0.7820853879509118, 1:16.298736258150442e-05單一預(yù)測(cè)并返回關(guān)既然可以計(jì)算一個(gè)數(shù)據(jù)樣本屬于每個(gè)類的概率,

23、那么我們可以找到最大的概率值,聯(lián)的類。下面的predict()函數(shù)可以完成以上任務(wù)。Pytho n3d 1J12345678def predict(summaries, in putVector):probabilities = calculateClassProbabilities(summaries, in putVector)bestLabel, bestProb = No ne, -1for classValue, probability in probabilities.iteritems(): if bestLabel is None or probability > bes

24、tProb: bestProb = probability bestLabel = classValueretur n bestLabel測(cè)試predict() 函數(shù)如下:d 1/Python1 summaries = 'A':(1,0.5), 'B':(20, 5.0)2 in putVector = 1.1, '?'3 result = predict(summaries, in putVector)4 print('Prediction: 0').format(result)運(yùn)行測(cè)試,你會(huì)得到如下結(jié)果:Pytho n1 Pr

25、edictio n: A多重預(yù)測(cè)最后,通過(guò)對(duì)測(cè)試數(shù)據(jù)集中每個(gè)數(shù)據(jù)樣本的預(yù)測(cè),我們可以評(píng)估模型精度。函數(shù)可以實(shí)現(xiàn)這個(gè)功能,并返回每個(gè)測(cè)試樣本的預(yù)測(cè)列表。Pytho ngetPredictio ns()丄J1 def getPredicti on s(summaries, testSet):2 predicti ons =3 for i in ran ge(le n(testSet):4result = predict(summaries, testSeti)5 predict ion s.appe nd(result)6 retur n predict ions測(cè)試getPredictions(

26、)函數(shù)如下。Pytho n3丄/1 summaries = 'A':(1,0.5), 'B':(20, 5.0)2 testSet = 1.1, '?', 19.1, '?'3 predicti ons = getPredict ion s(summaries, testSet)4 prin t('Predict ions: 0').format(predict ions)運(yùn)行測(cè)試,你會(huì)看到如下結(jié)果:Pytho n丄/1 Predictio ns: 'A', 'B'計(jì)算精度0%100

27、%精確率作為分類預(yù)測(cè)值和測(cè)試數(shù)據(jù)集中的類別值進(jìn)行比較,可以計(jì)算得到一個(gè)介于的精確度。getAccuracy()函數(shù)可以計(jì)算出這個(gè)精確率。Python1 def getAccuracy(testSet, predict ion s):2 correct = 03 for x in ran ge(le n(testSet):4 if testSetx-1 = predictio nsx:5 correct += 16 return (correct/float(le n( testSet) * 100.0我們可以使用如下簡(jiǎn)單的代碼來(lái)測(cè)試getAccuracy()函數(shù)。Pytho n丄J1 test

28、Set = 1,1,1,'a', 2,2,2,'a', 3,3,3,'b'2 predictio ns = 'a', 'a', 'a'3 accuracy = getAccuracy(testSet, predict ions)4 prin t('Accuracy: 0').format(accuracy)運(yùn)行測(cè)試,你會(huì)得到如下結(jié)果:Pytho n3d I/1 Accuracy: 66.6666666667合并代碼最后,我們需要將代碼連貫起來(lái)。F面是樸素貝葉斯 Python版的逐步實(shí)

29、現(xiàn)的全部代碼。Python1 # Example of Naive Bayes impleme nted from Scratch in Pytho n2 import csv3 import ran dom4 import math55 def loadCsv(file name):6 lines = csv.reader(ope n( file name, "rb")7 dataset = list(l in es)8 for i in ran ge(le n( dataset):9 dataseti = float(x) for x in datase ti10 re

30、tur n dataset1211 def splitDataset(dataset, splitRatio):12 trai nSize = in t(le n(dataset) * splitRatio)13 trai nSet =14 copy = list(dataset)15 while len (tra in Set) < trai nSize:16 in dex = ran dom .randran ge(le n( copy)17 train Set.appe nd(copy.pop(i ndex)18 retur n tra in Set, copy2119 def s

31、eparateByClass(dataset):20 separated = 21 for i in ran ge(le n( dataset):2526272829303132333435363738394041424344454647484950515253545556575859606162636465666768vector = datasetiif (vector-1 not in separated):separatedvector-1= separatedvector-1.appe nd(vector) retur n separateddef mean(nu mbers):re

32、tur n sum(nu mbers)/float(le n(nu mbers)def stdev( nu mbers):avg = mean(nu mbers)varia nee = sum(pow(x-avg,2) for x in nu mbers)/float(le n(nu mbers)-1) retur n math.sqrt(varia nee)def summarize(dataset):summaries = (mea n( attribute), stdev(attribute) for attribute in zip(*dataset)del summaries-1re

33、tur n summariesdef summarizeByClass(dataset):separated = separateByClass(dataset)summaries = for classValue, in sta nces in separated.iteritems(): summariesclassValue = summarize(i nsta nces) retur n summariesdef calculateProbability(x, mean, stdev):exp onent = math.exp(-(math.pow(x-mea n,2)/(2*math

34、.pow(stdev,2) retur n (1 / (math.sqrt(2*math.pi) * stdev) * exp onentdef calculateClassProbabilities(summaries, in putVector): probabilities = for classValue, classSummaries in summaries.iteritems(): probabilitiesclassValue = 1 for i in ran ge(le n( classSummaries):mean, stdev = classSummariesimea n, stdev)x = in putVectoriprobabilitiesclassValue*= calculateProbability(x,retur n probabilitiesdef predict(summaries, in putVector):probabilities = calculateClassProbabilities(summaries, in putVector) bestLabel, bes

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論