베 일 스 알고리즘 및 그 응용 사례

베 이 루스 분류 알고리즘: 베 이 루스 분 류 는 통계학 의 분류 알고리즘 으로 확률 통계 지식 을 이용 하여 분류 하 는 알고리즘 이다.많은 장소 에서 소박 한 베 이 루스 (Na ï ve Bayes, NB) 분류 알고리즘 은 결정 트 리 와 신경 망 분류 알고리즘 에 비견 할 수 있다.결함: 그 자체 의 설정 과 관련 이 있 습 니 다. 베 이 루스 는 하나의 속성 값 이 주어진 클래스 에 미 치 는 영향 이 다른 속성 에 독립 된 값 이 라 고 가정 하지만 이 가설 은 실제 상황 에서 자주 성립 되 지 않 기 때문에 분류 정확도 가 떨 어 질 수 있 습 니 다.업그레이드 판: 독립 적 인 가설 을 낮 추 는 베 이 루스 분류 알고리즘, 예 를 들 어 TAN (tree augmented Bayes network) 알고리즘.소박 한 베 이 루스 분류의 정식 정 의 는 다음 과 같다. 1. x = {a1, a2,..., am} 은 분류 대상 항목 이 고 각 a 는 x 의 특징 속성 이다.2. 분류 집합 C = {y1, y2,..., yn} 이 있 습 니 다.3. P (y1 | x), P (y2 | x),..., P (yn | x) 를 계산한다.4. P (yk | x) = max {P (y1 | x), P (y2 | x),..., P (yn | x)} 이 라면 x * 8712 ° yk.베 일 스 알고리즘 은 다음 과 같다.
#       
#     
import numpy as np
class Bayes:
    def _init_(self):
        self.length=-1
        self.labelcount=dict()
        self.vectorcount=dict()
    def fit(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
            labelcount[thislabel]=labels.count(thislabel)/labelsnum  
            #           
        for vector,label in zip(dataSet,labels):   
        #         
            if(label not in vectorcount):
                self.vectorcount[label]=[]
            self.vectorcount[label].append(vector)
        print("    ")
    def btest(self,TestData,labelsSet):
        if(self.length==-1):
            raise ValueError("        ,    ")
        #    testdata          
        IbDict=dict()
        for thisIb in labelsSet:
            p=1
            alllabel=self.labelcount[thisIb]  
            #           
            allvector=self.vectorcount[thisIb]
            vnum=len(allvector)
            allvector=np.array(allvector).T
            for index in range(0,len(TestData)):
                vector=list(allvector[index])
                p*=vector.count(TestData[index])/vnum
            IbDict[thisIb]=p*alllabel
        thislabel=sorted(IbDict,key=lambda x: IbDict[x],reverse=True)[0]
        return thislabel

베 이 루스 알고리즘 으로 필기체 숫자 인식: \ # 데 이 터 를 불 러 옵 니 다.
#    
def datatoarray(fname):
    arr=[]
    fh=open(fname)
    for i in range(0,32):
        thisline=fh.readline()
        for j in range(0,32):
            arr.append(int(thisline[j]))
    return arr
#            
def seplabel(fname):
    filestr=fname.split(".")[0]
    label=int(filestr.split("_")[0])
    return label

 #훈련 데이터 만 들 기
#      
def traindata():
    labels=[]
    trainfile=listdir("D:/shujufenxi/traindata")
    num=len(trainfile)
    #  1024( ),         
    #             , :    , :1024
    trainarr=zeros((num,1024))
    for i in range(0,num):
        thisfname=trainfile[i]
        thislabel=seplabel(thisfname)
        labels.append(thislabel)
        trainarr[i,:]=datatoarray("D:/shujufenxi/traindata/"+thisfname)
    return trainarr,labels
bys=Bayes()
#    
train_data,labels=traindata()
bys.fit(train_data,labels)

\ # 테스트 데이터
#         (    )
testfileall=listdir("D:/shujufenxi/testdata")
num=len(testfileall)
x=0
for i in range(0,num):
    thisfilename=testfileall[i]
    
    '''print(thisfilename)'''
    
    thislabel=seplabel(thisfilename)
    #print(thislabel)
    thisdataarray=datatoarray("D:/shujufenxi/testdata/"+thisfilename)
    label=bys.btest(thisdataarray,labelsall)
    
    print("    :"+str(thislabel)+",        :"+str(label))  #      
    
    if(label!=thislabel):
        x+=1
        print("    ")
print(x)
print("    :"+str(float(x)/float(num)))

    :    :0.1226215644820296

전체 코드 는 다음 과 같 습 니 다: 
#        (        )
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()
    def fit(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].append(vector)
        print("    ")
        return self
    def btest(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

#    
def datatoarray(fname):
    arr=[]
    fh=open(fname)
    for i in range(0,32):
        thisline=fh.readline()
        for j in range(0,32):
            arr.append(int(thisline[j]))
    return arr
#            
def seplabel(fname):
    filestr=fname.split(".")[0]
    label=int(filestr.split("_")[0])
    return label
#      
def traindata():
    labels=[]
    trainfile=listdir("D:/shujufenxi/traindata")
    num=len(trainfile)
    #  1024( ),         
    #             , :    , :1024
    trainarr=zeros((num,1024))
    for i in range(0,num):
        thisfname=trainfile[i]
        thislabel=seplabel(thisfname)
        labels.append(thislabel)
        trainarr[i,:]=datatoarray("D:/shujufenxi/traindata/"+thisfname)
    return trainarr,labels
bys=Bayes()
#    
train_data,labels=traindata()
bys.fit(train_data,labels)
#  
thisdata=datatoarray("D:/shujufenxi/testdata/8_90.txt")
labelsall=[0,1,2,3,4,5,6,7,8,9]
#         
'''
rst=bys.btest(thisdata,labelsall)
print(rst)    #       8
'''    
#         (    )
testfileall=listdir("D:/shujufenxi/testdata")
num=len(testfileall)
x=0
for i in range(0,num):
    thisfilename=testfileall[i]
    
    '''print(thisfilename)'''
    
    thislabel=seplabel(thisfilename)
    #print(thislabel)
    thisdataarray=datatoarray("D:/shujufenxi/testdata/"+thisfilename)
    label=bys.btest(thisdataarray,labelsall)
    
    print("    :"+str(thislabel)+",        :"+str(label))  #      
    
    if(label!=thislabel):
        x+=1
        print("    ")
print(x)
print("    :"+str(float(x)/float(num)))

좋은 웹페이지 즐겨찾기