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.
CMSIS-DSP/Testing/PatternGeneration/SVM.py

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()