Bayes.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. # Generate a randon points distributed around ome cluster.
  35. # Cluster are on each axis like (1,0,0,0), (0,1,0,0), (0,0,1,0) etc ...
  36. def newRandomVector(nbClasses,vecDim):
  37. v = np.random.randn(vecDim)
  38. v = v * CENTER_DISTANCE/2.0/6.0
  39. c = np.random.choice(range(0,nbClasses))
  40. c0 = np.zeros(vecDim)
  41. c1 = np.copy(c0)
  42. c1[c] = c0[0] + CENTER_DISTANCE
  43. return((v + c1).tolist(),c)
  44. def trainGaussian(nbClasses,vecDim):
  45. inputs=[]
  46. outputs=[]
  47. # Generate test patterns for this classifier
  48. for i in range(0,NBTRAININGSAMPLES):
  49. v,c=newRandomVector(nbClasses,vecDim)
  50. inputs.append(v)
  51. outputs.append(c)
  52. gnb = GaussianNB()
  53. gnb.fit(inputs, outputs)
  54. return(gnb)
  55. def generateNewTest(config,nb):
  56. dims=[]
  57. inputs=[]
  58. referenceproba=[]
  59. referencepredict=[]
  60. params=[]
  61. dims.append(NBTESTSAMPLES)
  62. classNb = BAYESCLASSES[nb % len(BAYESCLASSES)]
  63. vecDim = VECDIM[nb % len(VECDIM)]
  64. dims.append(classNb)
  65. dims.append(vecDim)
  66. # Train a classifier for a given vector dimension and
  67. # given number of classes
  68. gb = trainGaussian(classNb,vecDim)
  69. params += list(np.reshape(gb.theta_,np.size(gb.theta_)))
  70. params += list(np.reshape(gb.sigma_,np.size(gb.sigma_)))
  71. params += list(np.reshape(gb.class_prior_,np.size(gb.class_prior_)))
  72. params.append(gb.epsilon_)
  73. #print("theta=",end="")
  74. #printM(gb.theta_)
  75. #print(";",end="")
  76. #
  77. #print("sigma=",end="")
  78. #printM(gb.sigma_)
  79. #print(";",end="")
  80. #
  81. #print("prior=",end="")
  82. #printV(gb.class_prior_)
  83. #print(";",end="")
  84. #
  85. #print("epsilon=",end="")
  86. #printS(gb.epsilon_)
  87. #print(";",end="")
  88. #print(classNb,vecDim)
  89. for _ in range(0,NBTESTSAMPLES):
  90. # Generate a test pattern for this classifier
  91. v,c=newRandomVector(classNb,vecDim)
  92. inputs += v
  93. #print("inputs=",end="")
  94. #printV(v)
  95. #print(";",end="")
  96. y_pred = gb.predict([v])
  97. referencepredict.append(y_pred[0])
  98. probas = gb._joint_log_likelihood([v])
  99. probas = probas[0]
  100. referenceproba += list(probas)
  101. inputs = np.array(inputs)
  102. params = np.array(params)
  103. referenceproba = np.array(referenceproba)
  104. referencepredict = np.array(referencepredict)
  105. dims = np.array(dims)
  106. config.writeInput(nb, inputs,"Inputs")
  107. config.writeInputS16(nb, dims,"Dims")
  108. config.writeReference(nb, referenceproba,"Probas")
  109. config.writeReferenceS16(nb, referencepredict,"Predicts")
  110. config.writeReference(nb, params,"Params")
  111. #print(inputs)
  112. #print(dims)
  113. #print(referencepredict)
  114. #print(referenceproba)
  115. #print(params)
  116. def writeTests(config):
  117. generateNewTest(config,1)
  118. PATTERNDIR = os.path.join("Patterns","DSP","Bayes","Bayes")
  119. PARAMDIR = os.path.join("Parameters","DSP","Bayes","Bayes")
  120. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  121. writeTests(configf32)