SVM.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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. def newSVMTest(config,kind,theclass,clf,nb):
  50. inputs = []
  51. references = []
  52. for i in range(NBTESTSAMPLE):
  53. v = np.random.randn(1,VECDIM)
  54. v = v * CENTER_DISTANCE/2.0/6.0
  55. c = np.random.choice([0,1])
  56. if (c == 0):
  57. v = v + C0
  58. else:
  59. v = v + C1
  60. inputs.append(v[0].tolist())
  61. toPredict=[v[0].tolist()]
  62. references.append(clf.predict(toPredict))
  63. inputs=np.array(inputs)
  64. inputs=inputs.reshape(NBTESTSAMPLE*VECDIM)
  65. config.writeInput(nb, inputs,"Samples")
  66. references=np.array(references)
  67. references=references.reshape(NBTESTSAMPLE)
  68. # Classifier description
  69. supportShape = clf.support_vectors_.shape
  70. nbSupportVectors=supportShape[0]
  71. vectorDimensions=supportShape[1]
  72. intercept = np.array(clf.intercept_)
  73. dualCoefs=clf.dual_coef_
  74. dualCoefs=dualCoefs.reshape(nbSupportVectors)
  75. supportVectors=clf.support_vectors_
  76. supportVectors = supportVectors.reshape(nbSupportVectors*VECDIM)
  77. if kind == LINEAR:
  78. dims=np.array([kind,theclass[0],theclass[1],NBTESTSAMPLE,VECDIM,nbSupportVectors])
  79. elif kind==POLY:
  80. dims=np.array([kind,theclass[0],theclass[1],NBTESTSAMPLE,VECDIM,nbSupportVectors,clf.degree])
  81. elif kind==RBF:
  82. dims=np.array([kind,theclass[0],theclass[1],NBTESTSAMPLE,VECDIM,nbSupportVectors])
  83. elif kind==SIGMOID:
  84. dims=np.array([kind,theclass[0],theclass[1],NBTESTSAMPLE,VECDIM,nbSupportVectors])
  85. config.writeInputS16(nb, dims,"Dims")
  86. if kind == LINEAR:
  87. params=np.concatenate((supportVectors,dualCoefs,intercept))
  88. elif kind == POLY:
  89. coef0 = np.array([clf.coef0])
  90. gamma = np.array([clf._gamma])
  91. params=np.concatenate((supportVectors,dualCoefs,intercept,coef0,gamma))
  92. elif kind == RBF:
  93. gamma = np.array([clf._gamma])
  94. params=np.concatenate((supportVectors,dualCoefs,intercept,gamma))
  95. elif kind == SIGMOID:
  96. coef0 = np.array([clf.coef0])
  97. gamma = np.array([clf._gamma])
  98. params=np.concatenate((supportVectors,dualCoefs,intercept,coef0,gamma))
  99. config.writeInput(nb, params,"Params")
  100. config.writeReferenceS32(nb, references,"Reference")
  101. def writeTests(config):
  102. clf = svm.SVC(kernel='linear')
  103. clf.fit(X, y)
  104. newSVMTest(config,LINEAR,[class1,class2],clf,1)
  105. clf = svm.SVC(kernel='poly',gamma='auto', coef0=1.1)
  106. clf.fit(X, y)
  107. newSVMTest(config,POLY,[class1,class2],clf,2)
  108. clf = svm.SVC(kernel='rbf',gamma='auto')
  109. clf.fit(X, y)
  110. newSVMTest(config,RBF,[class1,class2],clf,3)
  111. clf = svm.SVC(kernel='sigmoid',gamma='auto')
  112. clf.fit(X, y)
  113. newSVMTest(config,SIGMOID,[class1,class2],clf,4)
  114. clf = svm.OneClassSVM(nu=0.1, kernel="rbf", gamma=0.1)
  115. clf.fit(X)
  116. newSVMTest(config,RBF,[-1,1],clf,5)
  117. def generatePatterns():
  118. PATTERNDIR = os.path.join("Patterns","DSP","SVM","SVM")
  119. PARAMDIR = os.path.join("Parameters","DSP","SVM","SVM")
  120. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  121. writeTests(configf32)
  122. if __name__ == '__main__':
  123. generatePatterns()