模式識別第一個作業,我雖然有師兄師姐們的答案,但是我不想繼承了,想自己寫,調動自己的學習熱情!
對自己的學習負責!
作業如下:
十字交叉驗證的原理是將數據集分為10組,輪流選擇其中一組作為測試組,其余作為訓練組,然后利用貝葉斯分類器計算決策正確的概率:
貝葉斯公式:
貝葉斯優化分類器
1
其中A為條件/狀態,di為決策也可表示為:
如1-14條數據,選擇第一組{1,11}作為測試組,其余作為訓練組,
注:其中的di為決策Yes/No,A為狀態如Sunny,Hot等,看如下例子,計算出決策dmp=“No”
現在我們明白了原理,那么就進行解決問題了:
一,準備數據traindata.txt 如圖:
二,編寫程序:
def getdata():'''獲取所有事件信息'''data = []f = open('traindata.txt', 'r')lines = f.readlines()for line in lines:li = line.split(' ')data.append(li)f.close()return datadef get_tests_info_save_traindata(testlabel):'''testlabel為測試標簽,[1]/[1,11]獲取測試標簽信息和除測試外的剩余訓練集:testlabel_s,data'''testlabel_s=[]data = getdata()if testlabel!=None:for tst in testlabel:for d in data:# 條件if str(tst) == d[0]: #判斷是否為測試標簽labb= (d[1], d[2], d[3], d[4],d[5]) #記錄測試標簽的狀態testlabel_s.append(labb)data.remove(d) #將測試項信息從總數據集中刪除else:passreturn data,testlabel_selse:passdef get_number(testlabel=None):'''testlabel為測試標簽,[1]/[1,11]獲取測試項的結果(No,Yes):resulist; 統計除測試項外剩余事件的No,Yes數量:noyes以及統計在No,Yes條件下的各狀態的數量:nolist,yeslist'''if testlabel==None:print('')else:data, telabels = get_tests_info_save_traindata(testlabel)nolist, yeslist,resulist,nolabel, yeslabel=[],[],[],[],[]for tel in telabels:a1, a2, a3, a4,a5= tel[0], tel[1], tel[2], tel[3], tel[4] # 測試標簽的天氣情況標簽no,yes,a1nonum,a2nonum,a3nonum,a4nonum,a1yesnum,a2yesnum,a3yesnum,a4yesnum =0,0, 0, 0, 0, 0,0, 0, 0, 0for d in data:# 獲取No,Yes的數量dd = d[-1].replace('\n', '')if dd == 'No':no += 1if d[1]==a1:a1nonum+=1if d[2]==a2:a2nonum += 1if d[3]==a3:a3nonum+=1if d[4]==a4:a4nonum += 1#No條件下的各狀態的數量nolabel=(a1nonum, a2nonum, a3nonum, a4nonum)if dd == 'Yes':yes += 1if d[1]==a1:a1yesnum+=1if d[2]==a2:a2yesnum += 1if d[3]==a3:a3yesnum+=1if d[4]==a4:a4yesnum += 1#Yes條件下的各狀態的數量yeslabel=(a1yesnum, a2yesnum, a3yesnum, a4yesnum)resulist.append(a5) #記錄測試標簽的決策noyes=(no,yes) #No/Yes的數量noo=(nolabel) #No條件下的各狀態的數量yess=(yeslabel) #Yes條件下的各狀態的數量nolist.append(noo)yeslist.append(yess)return resulist,noyes,nolist,yeslistdef getresult(teslabe):'''根據參數計算決策正確的概率'''result='' #初設決策i=0 #初設決策正確的概率res4, noyes4, no4, yes4 = get_number(teslabe)#res4, noyes4, no4, yes4=['No\n', 'Yes\n'] (4, 8) [(2, 1, 3, 1), (2, 2, 1, 3)] [(1, 2, 3, 6), (1, 3, 5, 2)]no_num = noyes4[0]yes_num = noyes4[1]p_no = no_num / (no_num + yes_num) #若為兩個測試項,P(No)與P(Yes)概率也不變p_yes = yes_num/(no_num + yes_num)for t in range(len(no4)): #根據測試項數目循環計算概率print('結果:',res4[t].replace('\n',''))#計算Bel(No),Bel(Yes)的概率belno = p_no * (no4[t][0]/no_num)*(no4[t][1]/no_num)*(no4[t][2]/no_num)*(no4[t][3]/no_num)belyes = p_yes * (yes4[t][0]/yes_num)*(yes4[t][1]/yes_num)*(yes4[t][2]/yes_num)*(yes4[t][3]/yes_num)print('No概率:',belno)print('Yes概率:', belyes)#根據Bel(No),Bel(Yes)做出決策if belno > belyes:result='No'else:result='Yes'print('決策:',result)#判斷決策是否正確if res4[t].replace('\n','')==result: #若本身決策和計算所得決策一樣,計算概率if len(no4)==2: #若該組內有兩個測試項,則各占50%比率,每次決策正確則概率增加50%i += 0.5else: #若該組內有一個測試項,則占100%比率,決策正確則概率增加100%i += 1.0else: #若決策錯誤,則概率增加為0i+=0print('正確率:',i)print('\n')return i #返回決策的正確率def get_possiblities(gro):'''獲取概率集'''possibilities = []for i in gro: #每一組輪流作為測試標簽#將分組轉化為列表[5]/[2,12]tests = []tests.append(i[0])tests.append(i[-1])tests = list(set(tests))r = getresult(tests) #獲取概率集possibilities.append(r)return possibilities
gro = [(5,), (1, 11), (2, 12), (3, 13), (4, 14), (6,), (7,), (8,), (9,), (10,)]
posbs=get_possiblities(gro)
print('各組作為測試項,決策正確的概率分別為:',posbs)
k=0
for h in posbs:k=k+h
#計算平均概率
avepos=k/len(posbs)
print('平均概率為:',avepos)
下面是運行結果:
花費一天時間,終于把程序編寫完成了!結果很理想!有不足之處,還請社友、大神們多多指導!感謝!
總結
以上是生活随笔為你收集整理的潇洒郎:Ten-fold-cross validation- Naïve Bayes Classifier 十字交叉验证-贝叶斯分类器 Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。