RMUL2025/lib/cmsis_5/CMSIS/DSP/Testing/PatternGeneration/Bayes.py

205 lines
5.2 KiB
Python
Executable File

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()