聚類分析實戰
手寫體數字的識別
# -*- 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個白球,伸手取摸球,摸到黑球和白球的概率有多大 逆向概率 袋子裡前提不知道有黑白球的比例,而是閉著眼睛摸球統計後推測黑球和白球的比例 現實世界本身不確定,人類觀察是有侷限的 我們日常所觀察只是表面,很多東西都是推測。男生總是穿長褲,女...