| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- import os.path
- import itertools
- import Tools
- import random
- import numpy as np
- from sklearn.naive_bayes import GaussianNB
- def printS(a):
- print("Interpreter[\"Number\"][\"%.9g\"]" % a,end="")
- def printV(v):
- start = False
- print("{",end="")
- for r in v:
- if start:
- print(",",end="")
- start = True
- printS(r)
- print("}",end="")
- def printM(v):
- start = False
- print("{",end="")
- for r in v:
- if start:
- print(",",end="")
- start = True
- printV(r)
- print("}",end="")
- NBTESTSAMPLES = 10
- VECDIM = [12,14,20]
- BAYESCLASSES= [3,5,4]
- NBTRAININGSAMPLES = 30
-
- # Distance between the two centers (training vectors are gaussianly
- # distributed around the centers)
- CENTER_DISTANCE = 1
- TRAININGRATIO = 6.0
- PREDICTRATIO = 12.0
- # Generate random points distributed around one cluster.
- # Cluster are on each axis like (1,0,0,0), (0,1,0,0), (0,0,1,0) etc ...
- def newRandomVector(nbClasses,vecDim,ratio):
- v = np.random.randn(vecDim)
- v = v * CENTER_DISTANCE/2.0/ratio
- c = np.random.choice(range(0,nbClasses))
- c0 = np.zeros(vecDim)
- c1 = np.copy(c0)
- c1[c] = c0[0] + CENTER_DISTANCE
- return((v + c1).tolist(),c)
- def trainGaussian(nbClasses,vecDim):
- inputs=[]
- outputs=[]
- # Generate test patterns for this classifier
- for i in range(0,NBTRAININGSAMPLES):
- v,c=newRandomVector(nbClasses,vecDim,TRAININGRATIO)
- inputs.append(v)
- outputs.append(c)
- gnb = GaussianNB()
- gnb.fit(inputs, outputs)
- return(gnb)
- def generateNewTest(config,nb):
- dims=[]
- inputs=[]
- referenceproba=[]
- referencepredict=[]
- params=[]
- dims.append(NBTESTSAMPLES)
- classNb = BAYESCLASSES[nb % len(BAYESCLASSES)]
- vecDim = VECDIM[nb % len(VECDIM)]
- dims.append(classNb)
- dims.append(vecDim)
- # Train a classifier for a given vector dimension and
- # given number of classes
- gb = trainGaussian(classNb,vecDim)
- params += list(np.reshape(gb.theta_,np.size(gb.theta_)))
- params += list(np.reshape(gb.sigma_,np.size(gb.sigma_)))
- params += list(np.reshape(gb.class_prior_,np.size(gb.class_prior_)))
- params.append(gb.epsilon_)
- #print("theta=",end="")
- #printM(gb.theta_)
- #print(";",end="")
- #
- #print("sigma=",end="")
- #printM(gb.sigma_)
- #print(";",end="")
- #
- #print("prior=",end="")
- #printV(gb.class_prior_)
- #print(";",end="")
- #
- #print("epsilon=",end="")
- #printS(gb.epsilon_)
- #print(";",end="")
- #print(classNb,vecDim)
- for _ in range(0,NBTESTSAMPLES):
- # Generate a test pattern for this classifier
- v,c=newRandomVector(classNb,vecDim,PREDICTRATIO)
- inputs += v
- #print("inputs=",end="")
- #printV(v)
- #print(";",end="")
-
- y_pred = gb.predict([v])
- referencepredict.append(y_pred[0])
-
- probas = gb._joint_log_likelihood([v])
- probas = probas[0]
- referenceproba += list(probas)
-
- inputs = np.array(inputs)
- params = np.array(params)
- referenceproba = np.array(referenceproba)
- referencepredict = np.array(referencepredict)
- dims = np.array(dims)
- config.writeInput(nb, inputs,"Inputs")
- config.writeInputS16(nb, dims,"Dims")
- config.writeReference(nb, referenceproba,"Probas")
- config.writeReferenceS16(nb, referencepredict,"Predicts")
- config.writeReference(nb, params,"Params")
-
- #print(inputs)
- #print(dims)
- #print(referencepredict)
- #print(referenceproba)
- #print(params)
- def writeTests(config):
- generateNewTest(config,1)
- def writeBenchmark(config):
- someLists=[VECDIM,BAYESCLASSES]
-
- r=np.array([element for element in itertools.product(*someLists)])
- nbtests=len(VECDIM)*len(BAYESCLASSES)*2
- config.writeParam(2, r.reshape(nbtests))
- params=[]
- inputs=[]
- referencepredict=[]
- dims=[]
- nbin=0
- nbparam=0;
- for vecDim, classNb in r:
- gb = trainGaussian(classNb,vecDim)
- p = []
- p += list(np.reshape(gb.theta_,np.size(gb.theta_)))
- p += list(np.reshape(gb.sigma_,np.size(gb.sigma_)))
- p += list(np.reshape(gb.class_prior_,np.size(gb.class_prior_)))
- p.append(gb.epsilon_)
- params += p
- dims += [nbin,nbparam]
- nbparam = nbparam + len(p)
- v,c=newRandomVector(classNb,vecDim,PREDICTRATIO)
- inputs += v
- nbin = nbin + len(v)
- y_pred = gb.predict([v])
- referencepredict.append(y_pred[0])
-
- inputs = np.array(inputs)
- params = np.array(params)
- referencepredict = np.array(referencepredict)
- dims = np.array(dims)
- config.writeInput(2, inputs,"Inputs")
- config.writeReferenceS16(2, referencepredict,"Predicts")
- config.writeReference(2, params,"Params")
- config.writeInputS16(2, dims,"DimsBench")
- def generatePatterns():
- PATTERNDIR = os.path.join("Patterns","DSP","Bayes","Bayes")
- PARAMDIR = os.path.join("Parameters","DSP","Bayes","Bayes")
-
- configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
- configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16")
-
- writeTests(configf32)
- writeTests(configf16)
- writeBenchmark(configf32)
- writeBenchmark(configf16)
- if __name__ == '__main__':
- generatePatterns()
|