貝葉斯演算法的應用

2021-09-28 21:53:59 字數 4444 閱讀 6795

聚類分析實戰

手寫體數字的識別

# -*- coding: utf-8 -*-

# --------------------------------------

# @time : 2019/10/23 13:25

# @author : hxf

# @email : [email protected]

# @file : bayes_use.py

# description : 貝葉斯演算法的應用

# ----------------------------------

#貝葉斯演算法的應用

from numpy import

*import operator

from os import listdir

import numpy as npy

import numpy

class

bayes

:# 初始化方法

def__init__

(self)

: self.length=-1

self.labelcount=

dict()

self.vectorcount=

dict()

# 訓練方法

deffit

(self,dataset:

list

,labels:

list):

if(len(dataset)

!=len

(labels)):

raise valueerror(

"您輸入的測試陣列跟類別陣列長度不一致"

) self.length=

len(dataset[0]

)# 測試資料特徵值的長度

labelsnum=

len(labels)

# 類別所有的數量

norlabels=

set(labels)

# 不重複類別的數量

for item in norlabels:

thislabel=item

self.labelcount[thislabel]

=labels.count(thislabel)

/labelsnum # 求的當前類別佔類別總數的比例

for vector,label in

zip(dataset,labels):if

(label not

in self.vectorcount)

: self.vectorcount[label]=[

] self.vectorcount[label]

print

("訓練結束"

)return self

# 測試方法

defbtest

(self,testdata,labelsset):if

(self.length==-1

):raise valueerror(

"您還沒有進行訓練,請先訓練"

)#計算testdata分別為各個類別的概率

lbdict=

dict()

for thislb in labelsset:

p=1 alllabel=self.labelcount[thislb]

allvector=self.vectorcount[thislb]

vnum=

len(allvector)

allvector=numpy.array(allvector)

.t for index in

range(0

,len

(testdata)):

vector=

list

(allvector[index]

) p*=vector.count(testdata[index]

)/vnum

lbdict[thislb]

=p*alllabel

thislabel=

sorted

(lbdict,key=

lambda x:lbdict[x]

,reverse=

true)[

0]return thislabel

#載入資料

defdatatoarray

(fname)

: arr=

fh=open

(fname)

for i in

range(0

,32):

thisline=fh.readline(

)for j in

range(0

,32):

int(thisline[j]))

return arr

#建立乙個函式取檔名字首

defseplabel

(fname)

: filestr=fname.split(

".")[0

] label=

int(filestr.split(

"_")[0

])return label

#建立訓練資料

deftraindata()

: labels=

trainfile=listdir(

"data/testandtraindata/traindata/"

) num=

len(trainfile)

#長度1024(列),每一行儲存乙個檔案

#用乙個陣列儲存所有訓練資料,行:檔案總數,列:1024

trainarr=zeros(

(num,

1024))

for i in

range(0

,num)

: thisfname=trainfile[i]

thislabel=seplabel(thisfname)

trainarr[i,:]

=datatoarray(

"data/testandtraindata/traindata/"

+thisfname)

return trainarr,labels

bys=bayes(

)train_data,labels=traindata(

)# print(train_data,labels)

bys.fit(train_data,labels)

# 測試資料

thisdata=datatoarray(

"data/testandtraindata/testdata/8_90.txt"

)labelsall=[0

,1,2

,3,4

,5,6

,7,8

,9]# 識別單個手寫體數字

'''result=bys.btest(thisdata,labelsall)

print(result)

'''# 識別多個手寫體數字(批量測試)

testfileall=listdir(

"data/testandtraindata/testdata"

)num=

len(testfileall)

count =

0for i in

range(0

,num)

: thisfilename=testfileall[i]

# print(thisfilename)

thislabel=seplabel(thisfilename)

# print(thisfilename)

# print(thislabel)

thisdataarr=datatoarray(

"data/testandtraindata/testdata/"

+thisfilename)

label=bys.btest(thisdataarr,labelsall)

print

("該數字是:"

+str

(thislabel)

+",識別出來的數字是"

+str

(label))if

(label!=thislabel)

: count+=

1print

("**錯誤的次數:"

+str

(count)

)print

("錯誤率:"

+str

(count/num)

)'''

**錯誤的次數:116

錯誤率:0.1226215644820296

'''

**中所有的資料集:資料集

貝葉斯演算法

貝葉斯演算法需要解決的問題 1.正向概率 假設袋子中n白球,m黑球,摸到黑球概率多大 2.逆向概率 事先不知道袋子中黑白球個數,從袋子中摸出乙個或幾個球,觀察這些取出球的顏色,以此來推斷袋中白黑球的比例。為什麼需要貝葉斯 現實世界本身就是不確定的,假設黑白球數量無限大,人類觀察能力有限,我們不可能完...

貝葉斯演算法

總結應用 貝葉斯演算法的目的是解決逆向概率的問題。何為逆向概率?先看看正向概率 袋子裡有m個黑球,n個白球,隨手一模,是黑球的機率是多大。這就是個正向概率問題。逆向概率 袋子裡有兩種球,通過觀察摸出來的球的顏色,推斷袋子中兩種球的比率。逆向概率的作用 是通過有限的資料推斷無限資料的情況,思考 星系距...

貝葉斯演算法

貝葉斯為了解決 逆概 問題提出的 正向概率 袋子裡裝著n個黑球和m個白球,伸手取摸球,摸到黑球和白球的概率有多大 逆向概率 袋子裡前提不知道有黑白球的比例,而是閉著眼睛摸球統計後推測黑球和白球的比例 現實世界本身不確定,人類觀察是有侷限的 我們日常所觀察只是表面,很多東西都是推測。男生總是穿長褲,女...