SVM.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. import os.path
  2. import itertools
  3. import Tools
  4. from sklearn import svm
  5. import random
  6. import numpy as np
  7. # Number of vectors to test for each test
  8. NBTESTSAMPLE = 100
  9. # Dimension of the vectors
  10. VECDIM = 10
  11. # Number of vectors for training
  12. NBVECTORS=10
  13. # Distance between the two centers (training vectors are gaussianly
  14. # distributed around the centers)
  15. CENTER_DISTANCE = 1
  16. # SVM KIND
  17. LINEAR=1
  18. POLY=2
  19. RBF=3
  20. SIGMOID=4
  21. C0 = np.zeros((1,VECDIM))
  22. C1 = np.copy(C0)
  23. C1[0,0] = C1[0,0] + CENTER_DISTANCE
  24. # Data for training
  25. X = []
  26. Xone = []
  27. y = []
  28. class1 = 0
  29. class2 = 1
  30. for i in range(NBVECTORS):
  31. v = np.random.randn(1,VECDIM)
  32. v = v * CENTER_DISTANCE/2.0/10
  33. # 2 classes are needed
  34. if i == 0:
  35. c = 0
  36. elif i == 1:
  37. c = 1
  38. else:
  39. c = np.random.choice([0,1])
  40. if (c == 0):
  41. v = v + C0
  42. y.append(class1)
  43. else:
  44. v = v + C1
  45. y.append(class2)
  46. if c == 0:
  47. Xone.append(v[0].tolist())
  48. X.append(v[0].tolist())
  49. # Used for benchmark data
  50. def genRandomVector(vecdim):
  51. c0 = np.zeros((1,vecdim))
  52. c1 = np.copy(c0)
  53. c1[0,0] = c1[0,0] + CENTER_DISTANCE
  54. v = np.random.randn(1,vecdim)
  55. v = v * CENTER_DISTANCE/2.0/10
  56. c = np.random.choice([0,1])
  57. if (c == 0):
  58. v = v + c0
  59. else:
  60. v = v + c1
  61. v=v[0].tolist()
  62. return(v,c)
  63. def newSVMTest(config,kind,theclass,clf,nb):
  64. inputs = []
  65. references = []
  66. for i in range(NBTESTSAMPLE):
  67. v = np.random.randn(1,VECDIM)
  68. v = v * CENTER_DISTANCE/2.0/6.0
  69. c = np.random.choice([0,1])
  70. if (c == 0):
  71. v = v + C0
  72. else:
  73. v = v + C1
  74. inputs.append(v[0].tolist())
  75. toPredict=[v[0].tolist()]
  76. references.append(clf.predict(toPredict))
  77. inputs=np.array(inputs)
  78. inputs=inputs.reshape(NBTESTSAMPLE*VECDIM)
  79. config.writeInput(nb, inputs,"Samples")
  80. references=np.array(references)
  81. references=references.reshape(NBTESTSAMPLE)
  82. # Classifier description
  83. supportShape = clf.support_vectors_.shape
  84. nbSupportVectors=supportShape[0]
  85. vectorDimensions=supportShape[1]
  86. intercept = np.array(clf.intercept_)
  87. dualCoefs=clf.dual_coef_
  88. dualCoefs=dualCoefs.reshape(nbSupportVectors)
  89. supportVectors=clf.support_vectors_
  90. supportVectors = supportVectors.reshape(nbSupportVectors*VECDIM)
  91. if kind == LINEAR:
  92. dims=np.array([kind,theclass[0],theclass[1],NBTESTSAMPLE,VECDIM,nbSupportVectors])
  93. elif kind==POLY:
  94. dims=np.array([kind,theclass[0],theclass[1],NBTESTSAMPLE,VECDIM,nbSupportVectors,clf.degree])
  95. elif kind==RBF:
  96. dims=np.array([kind,theclass[0],theclass[1],NBTESTSAMPLE,VECDIM,nbSupportVectors])
  97. elif kind==SIGMOID:
  98. dims=np.array([kind,theclass[0],theclass[1],NBTESTSAMPLE,VECDIM,nbSupportVectors])
  99. config.writeInputS16(nb, dims,"Dims")
  100. if kind == LINEAR:
  101. params=np.concatenate((supportVectors,dualCoefs,intercept))
  102. elif kind == POLY:
  103. coef0 = np.array([clf.coef0])
  104. gamma = np.array([clf._gamma])
  105. params=np.concatenate((supportVectors,dualCoefs,intercept,coef0,gamma))
  106. elif kind == RBF:
  107. gamma = np.array([clf._gamma])
  108. params=np.concatenate((supportVectors,dualCoefs,intercept,gamma))
  109. elif kind == SIGMOID:
  110. coef0 = np.array([clf.coef0])
  111. gamma = np.array([clf._gamma])
  112. params=np.concatenate((supportVectors,dualCoefs,intercept,coef0,gamma))
  113. config.writeInput(nb, params,"Params")
  114. config.writeReferenceS32(nb, references,"Reference")
  115. def writeTests(config):
  116. clf = svm.SVC(kernel='linear')
  117. clf.fit(X, y)
  118. newSVMTest(config,LINEAR,[class1,class2],clf,1)
  119. clf = svm.SVC(kernel='poly',gamma='auto', coef0=1.1)
  120. clf.fit(X, y)
  121. newSVMTest(config,POLY,[class1,class2],clf,2)
  122. clf = svm.SVC(kernel='rbf',gamma='auto')
  123. clf.fit(X, y)
  124. newSVMTest(config,RBF,[class1,class2],clf,3)
  125. clf = svm.SVC(kernel='sigmoid',gamma='auto')
  126. clf.fit(X, y)
  127. newSVMTest(config,SIGMOID,[class1,class2],clf,4)
  128. clf = svm.OneClassSVM(kernel="linear")
  129. clf.fit(X)
  130. newSVMTest(config,RBF,[-1,1],clf,5)
  131. def genSVMBenchmark(vecDim,nbVecs,k):
  132. # We need to enforce a specific number of support vectors
  133. # But it is a result of the training and not an input
  134. # So the data generated will not make sensse since we will
  135. # force the number of support vector (repeating the first one)
  136. # For a benchmark it is ok.
  137. X=[]
  138. y=[]
  139. for i in range(NBVECTORS):
  140. v,c=genRandomVector(vecDim)
  141. X.append(v)
  142. y.append(c)
  143. clf = svm.SVC(kernel=k)
  144. clf.fit(X, y)
  145. supportShape = clf.support_vectors_.shape
  146. nbSupportVectors=supportShape[0]
  147. vectorDimensions=supportShape[1]
  148. intercept = list(clf.intercept_)
  149. dualCoefs=clf.dual_coef_
  150. dualCoefs=dualCoefs.reshape(nbSupportVectors)
  151. supportVectors=clf.support_vectors_
  152. supportVectors = supportVectors.reshape(nbSupportVectors*vecDim)
  153. # Now we force the number of support vectors
  154. nbSupportVectors = nbVecs
  155. dualCoefs = [dualCoefs[0]] * nbVecs
  156. supportVectors = [supportVectors[0]] * nbVecs
  157. if k == "linear":
  158. return(list(supportVectors + dualCoefs +intercept))
  159. if k == "poly":
  160. coef0 = list(np.array([clf.coef0]))
  161. gamma = list(np.array([clf._gamma]))
  162. degree=list(np.array([1.0*clf.degree]))
  163. return(list(supportVectors + dualCoefs + intercept + coef0 + gamma + degree))
  164. if k == "rbf":
  165. gamma = list(np.array([clf._gamma]))
  166. return(list(supportVectors + dualCoefs + intercept + gamma))
  167. if k == "sigmoid":
  168. coef0 = list(np.array([clf.coef0]))
  169. gamma = list(np.array([clf._gamma]))
  170. return(list(supportVectors + dualCoefs + intercept + coef0 + gamma))
  171. return([])
  172. def writeBenchmarks(config,format):
  173. vecDims=[16,32,64]
  174. nbVecs=[8,16,32]
  175. someLists=[vecDims,nbVecs]
  176. r=np.array([element for element in itertools.product(*someLists)])
  177. nbtests=len(vecDims)*len(nbVecs)*2
  178. config.writeParam(6, r.reshape(nbtests))
  179. paramsLinear=[]
  180. paramsPoly=[]
  181. paramsRBF=[]
  182. paramsSigmoid=[]
  183. inputs=[]
  184. dimsLinear=[]
  185. dimsPoly=[]
  186. dimsRBF=[]
  187. dimsSigmoid=[]
  188. nbin=0
  189. nbparamLinear=0
  190. nbparamPoly=0
  191. nbparamRBF=0
  192. nbparamSigmoid=0
  193. for vecDim, nbVecs in r:
  194. v,c=genRandomVector(vecDim)
  195. dimsLinear += [nbin,nbparamLinear]
  196. dimsPoly += [nbin,nbparamPoly]
  197. dimsRBF += [nbin,nbparamRBF]
  198. dimsSigmoid += [nbin,nbparamSigmoid]
  199. p=genSVMBenchmark(vecDim,nbVecs,"linear")
  200. paramsLinear += p
  201. nbparamLinear = nbparamLinear + len(p)
  202. p=genSVMBenchmark(vecDim,nbVecs,"poly")
  203. paramsPoly += p
  204. nbparamPoly = nbparamPoly + len(p)
  205. p=genSVMBenchmark(vecDim,nbVecs,"rbf")
  206. paramsRBF += p
  207. nbparamRBF = nbparamRBF + len(p)
  208. p=genSVMBenchmark(vecDim,nbVecs,"sigmoid")
  209. paramsSigmoid += p
  210. nbparamSigmoid = nbparamSigmoid + len(p)
  211. inputs += v
  212. nbin = nbin + len(v)
  213. config.writeInput(6, inputs,"InputsBench")
  214. config.writeInputS16(6, dimsLinear,"DimsLinear")
  215. config.writeReference(6, paramsLinear,"ParamsLinear")
  216. config.writeInputS16(6, dimsPoly,"DimsPoly")
  217. config.writeReference(6, paramsPoly,"ParamsPoly")
  218. config.writeInputS16(6, dimsRBF,"DimsRBF")
  219. config.writeReference(6, paramsRBF,"ParamsRBF")
  220. config.writeInputS16(6, dimsSigmoid,"DimsSigmoid")
  221. config.writeReference(6, paramsSigmoid,"ParamsSigmoid")
  222. def generatePatterns():
  223. PATTERNDIR = os.path.join("Patterns","DSP","SVM","SVM")
  224. PARAMDIR = os.path.join("Parameters","DSP","SVM","SVM")
  225. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  226. configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16")
  227. writeTests(configf32)
  228. writeTests(configf16)
  229. writeBenchmarks(configf32,Tools.F32)
  230. writeBenchmarks(configf16,Tools.F16)
  231. if __name__ == '__main__':
  232. generatePatterns()