Bayes.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import os.path
  2. import itertools
  3. import Tools
  4. import random
  5. import numpy as np
  6. from sklearn.naive_bayes import GaussianNB
  7. def printS(a):
  8. print("Interpreter[\"Number\"][\"%.9g\"]" % a,end="")
  9. def printV(v):
  10. start = False
  11. print("{",end="")
  12. for r in v:
  13. if start:
  14. print(",",end="")
  15. start = True
  16. printS(r)
  17. print("}",end="")
  18. def printM(v):
  19. start = False
  20. print("{",end="")
  21. for r in v:
  22. if start:
  23. print(",",end="")
  24. start = True
  25. printV(r)
  26. print("}",end="")
  27. NBTESTSAMPLES = 10
  28. VECDIM = [12,14,20]
  29. BAYESCLASSES= [3,5,4]
  30. NBTRAININGSAMPLES = 30
  31. # Distance between the two centers (training vectors are gaussianly
  32. # distributed around the centers)
  33. CENTER_DISTANCE = 1
  34. TRAININGRATIO = 6.0
  35. PREDICTRATIO = 12.0
  36. # Generate random points distributed around one cluster.
  37. # Cluster are on each axis like (1,0,0,0), (0,1,0,0), (0,0,1,0) etc ...
  38. def newRandomVector(nbClasses,vecDim,ratio):
  39. v = np.random.randn(vecDim)
  40. v = v * CENTER_DISTANCE/2.0/ratio
  41. c = np.random.choice(range(0,nbClasses))
  42. c0 = np.zeros(vecDim)
  43. c1 = np.copy(c0)
  44. c1[c] = c0[0] + CENTER_DISTANCE
  45. return((v + c1).tolist(),c)
  46. def trainGaussian(nbClasses,vecDim):
  47. inputs=[]
  48. outputs=[]
  49. # Generate test patterns for this classifier
  50. for i in range(0,NBTRAININGSAMPLES):
  51. v,c=newRandomVector(nbClasses,vecDim,TRAININGRATIO)
  52. inputs.append(v)
  53. outputs.append(c)
  54. gnb = GaussianNB()
  55. gnb.fit(inputs, outputs)
  56. return(gnb)
  57. def generateNewTest(config,nb):
  58. dims=[]
  59. inputs=[]
  60. referenceproba=[]
  61. referencepredict=[]
  62. params=[]
  63. dims.append(NBTESTSAMPLES)
  64. classNb = BAYESCLASSES[nb % len(BAYESCLASSES)]
  65. vecDim = VECDIM[nb % len(VECDIM)]
  66. dims.append(classNb)
  67. dims.append(vecDim)
  68. # Train a classifier for a given vector dimension and
  69. # given number of classes
  70. gb = trainGaussian(classNb,vecDim)
  71. params += list(np.reshape(gb.theta_,np.size(gb.theta_)))
  72. params += list(np.reshape(gb.sigma_,np.size(gb.sigma_)))
  73. params += list(np.reshape(gb.class_prior_,np.size(gb.class_prior_)))
  74. params.append(gb.epsilon_)
  75. #print("theta=",end="")
  76. #printM(gb.theta_)
  77. #print(";",end="")
  78. #
  79. #print("sigma=",end="")
  80. #printM(gb.sigma_)
  81. #print(";",end="")
  82. #
  83. #print("prior=",end="")
  84. #printV(gb.class_prior_)
  85. #print(";",end="")
  86. #
  87. #print("epsilon=",end="")
  88. #printS(gb.epsilon_)
  89. #print(";",end="")
  90. #print(classNb,vecDim)
  91. for _ in range(0,NBTESTSAMPLES):
  92. # Generate a test pattern for this classifier
  93. v,c=newRandomVector(classNb,vecDim,PREDICTRATIO)
  94. inputs += v
  95. #print("inputs=",end="")
  96. #printV(v)
  97. #print(";",end="")
  98. y_pred = gb.predict([v])
  99. referencepredict.append(y_pred[0])
  100. probas = gb._joint_log_likelihood([v])
  101. probas = probas[0]
  102. referenceproba += list(probas)
  103. inputs = np.array(inputs)
  104. params = np.array(params)
  105. referenceproba = np.array(referenceproba)
  106. referencepredict = np.array(referencepredict)
  107. dims = np.array(dims)
  108. config.writeInput(nb, inputs,"Inputs")
  109. config.writeInputS16(nb, dims,"Dims")
  110. config.writeReference(nb, referenceproba,"Probas")
  111. config.writeReferenceS16(nb, referencepredict,"Predicts")
  112. config.writeReference(nb, params,"Params")
  113. #print(inputs)
  114. #print(dims)
  115. #print(referencepredict)
  116. #print(referenceproba)
  117. #print(params)
  118. def writeTests(config):
  119. generateNewTest(config,1)
  120. def writeBenchmark(config):
  121. someLists=[VECDIM,BAYESCLASSES]
  122. r=np.array([element for element in itertools.product(*someLists)])
  123. nbtests=len(VECDIM)*len(BAYESCLASSES)*2
  124. config.writeParam(2, r.reshape(nbtests))
  125. params=[]
  126. inputs=[]
  127. referencepredict=[]
  128. dims=[]
  129. nbin=0
  130. nbparam=0;
  131. for vecDim, classNb in r:
  132. gb = trainGaussian(classNb,vecDim)
  133. p = []
  134. p += list(np.reshape(gb.theta_,np.size(gb.theta_)))
  135. p += list(np.reshape(gb.sigma_,np.size(gb.sigma_)))
  136. p += list(np.reshape(gb.class_prior_,np.size(gb.class_prior_)))
  137. p.append(gb.epsilon_)
  138. params += p
  139. dims += [nbin,nbparam]
  140. nbparam = nbparam + len(p)
  141. v,c=newRandomVector(classNb,vecDim,PREDICTRATIO)
  142. inputs += v
  143. nbin = nbin + len(v)
  144. y_pred = gb.predict([v])
  145. referencepredict.append(y_pred[0])
  146. inputs = np.array(inputs)
  147. params = np.array(params)
  148. referencepredict = np.array(referencepredict)
  149. dims = np.array(dims)
  150. config.writeInput(2, inputs,"Inputs")
  151. config.writeReferenceS16(2, referencepredict,"Predicts")
  152. config.writeReference(2, params,"Params")
  153. config.writeInputS16(2, dims,"DimsBench")
  154. def generatePatterns():
  155. PATTERNDIR = os.path.join("Patterns","DSP","Bayes","Bayes")
  156. PARAMDIR = os.path.join("Parameters","DSP","Bayes","Bayes")
  157. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  158. configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16")
  159. writeTests(configf32)
  160. writeTests(configf16)
  161. writeBenchmark(configf32)
  162. writeBenchmark(configf16)
  163. if __name__ == '__main__':
  164. generatePatterns()