You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.0 KiB
Python
153 lines
4.0 KiB
Python
import os.path
|
|
import itertools
|
|
import Tools
|
|
from sklearn import svm
|
|
import random
|
|
import numpy as np
|
|
|
|
# Number of vectors to test for each test
|
|
NBTESTSAMPLE = 100
|
|
# Dimension of the vectors
|
|
VECDIM = 10
|
|
|
|
# Number of vectors for training
|
|
NBVECTORS=10
|
|
# Distance between the two centers (training vectors are gaussianly
|
|
# distributed around the centers)
|
|
CENTER_DISTANCE = 1
|
|
|
|
# SVM KIND
|
|
LINEAR=1
|
|
POLY=2
|
|
RBF=3
|
|
SIGMOID=4
|
|
|
|
C0 = np.zeros((1,VECDIM))
|
|
C1 = np.copy(C0)
|
|
C1[0,0] = C1[0,0] + CENTER_DISTANCE
|
|
|
|
# Data for training
|
|
|
|
X = []
|
|
Xone = []
|
|
y = []
|
|
|
|
class1 = 0
|
|
class2 = 1
|
|
|
|
for i in range(NBVECTORS):
|
|
v = np.random.randn(1,VECDIM)
|
|
v = v * CENTER_DISTANCE/2.0/10
|
|
# 2 classes are needed
|
|
if i == 0:
|
|
c = 0
|
|
elif i == 1:
|
|
c = 1
|
|
else:
|
|
c = np.random.choice([0,1])
|
|
if (c == 0):
|
|
v = v + C0
|
|
y.append(class1)
|
|
else:
|
|
v = v + C1
|
|
y.append(class2)
|
|
if c == 0:
|
|
Xone.append(v[0].tolist())
|
|
X.append(v[0].tolist())
|
|
|
|
def newSVMTest(config,kind,theclass,clf,nb):
|
|
inputs = []
|
|
references = []
|
|
for i in range(NBTESTSAMPLE):
|
|
v = np.random.randn(1,VECDIM)
|
|
v = v * CENTER_DISTANCE/2.0/6.0
|
|
c = np.random.choice([0,1])
|
|
if (c == 0):
|
|
v = v + C0
|
|
else:
|
|
v = v + C1
|
|
inputs.append(v[0].tolist())
|
|
toPredict=[v[0].tolist()]
|
|
references.append(clf.predict(toPredict))
|
|
inputs=np.array(inputs)
|
|
inputs=inputs.reshape(NBTESTSAMPLE*VECDIM)
|
|
|
|
config.writeInput(nb, inputs,"Samples")
|
|
|
|
references=np.array(references)
|
|
references=references.reshape(NBTESTSAMPLE)
|
|
|
|
# Classifier description
|
|
supportShape = clf.support_vectors_.shape
|
|
|
|
nbSupportVectors=supportShape[0]
|
|
vectorDimensions=supportShape[1]
|
|
intercept = np.array(clf.intercept_)
|
|
dualCoefs=clf.dual_coef_
|
|
dualCoefs=dualCoefs.reshape(nbSupportVectors)
|
|
supportVectors=clf.support_vectors_
|
|
supportVectors = supportVectors.reshape(nbSupportVectors*VECDIM)
|
|
|
|
if kind == LINEAR:
|
|
dims=np.array([kind,theclass[0],theclass[1],NBTESTSAMPLE,VECDIM,nbSupportVectors])
|
|
elif kind==POLY:
|
|
dims=np.array([kind,theclass[0],theclass[1],NBTESTSAMPLE,VECDIM,nbSupportVectors,clf.degree])
|
|
elif kind==RBF:
|
|
dims=np.array([kind,theclass[0],theclass[1],NBTESTSAMPLE,VECDIM,nbSupportVectors])
|
|
elif kind==SIGMOID:
|
|
dims=np.array([kind,theclass[0],theclass[1],NBTESTSAMPLE,VECDIM,nbSupportVectors])
|
|
|
|
config.writeInputS16(nb, dims,"Dims")
|
|
|
|
if kind == LINEAR:
|
|
params=np.concatenate((supportVectors,dualCoefs,intercept))
|
|
elif kind == POLY:
|
|
coef0 = np.array([clf.coef0])
|
|
gamma = np.array([clf._gamma])
|
|
params=np.concatenate((supportVectors,dualCoefs,intercept,coef0,gamma))
|
|
elif kind == RBF:
|
|
gamma = np.array([clf._gamma])
|
|
params=np.concatenate((supportVectors,dualCoefs,intercept,gamma))
|
|
elif kind == SIGMOID:
|
|
coef0 = np.array([clf.coef0])
|
|
gamma = np.array([clf._gamma])
|
|
params=np.concatenate((supportVectors,dualCoefs,intercept,coef0,gamma))
|
|
|
|
config.writeInput(nb, params,"Params")
|
|
|
|
config.writeReferenceS32(nb, references,"Reference")
|
|
|
|
|
|
def writeTests(config):
|
|
clf = svm.SVC(kernel='linear')
|
|
clf.fit(X, y)
|
|
newSVMTest(config,LINEAR,[class1,class2],clf,1)
|
|
|
|
clf = svm.SVC(kernel='poly',gamma='auto', coef0=1.1)
|
|
clf.fit(X, y)
|
|
newSVMTest(config,POLY,[class1,class2],clf,2)
|
|
|
|
clf = svm.SVC(kernel='rbf',gamma='auto')
|
|
clf.fit(X, y)
|
|
newSVMTest(config,RBF,[class1,class2],clf,3)
|
|
|
|
clf = svm.SVC(kernel='sigmoid',gamma='auto')
|
|
clf.fit(X, y)
|
|
newSVMTest(config,SIGMOID,[class1,class2],clf,4)
|
|
|
|
clf = svm.OneClassSVM(nu=0.1, kernel="rbf", gamma=0.1)
|
|
clf.fit(X)
|
|
newSVMTest(config,RBF,[-1,1],clf,5)
|
|
|
|
|
|
|
|
def generatePatterns():
|
|
PATTERNDIR = os.path.join("Patterns","DSP","SVM","SVM")
|
|
PARAMDIR = os.path.join("Parameters","DSP","SVM","SVM")
|
|
|
|
configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
|
|
|
|
writeTests(configf32)
|
|
|
|
if __name__ == '__main__':
|
|
generatePatterns() |