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.
186 lines
4.6 KiB
C
186 lines
4.6 KiB
C
/* ----------------------------------------------------------------------
|
|
* Copyright (C) 2019-2020 ARM Limited. All rights reserved.
|
|
*
|
|
* $Date: 09. December 2019
|
|
* $Revision: V1.0.0
|
|
*
|
|
* Project: CMSIS DSP Library
|
|
* Title: arm_svm_example_f32.c
|
|
*
|
|
* Description: Example code demonstrating how to use SVM functions.
|
|
*
|
|
* Target Processor: Cortex-M/Cortex-A
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* - Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* - Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
* - Neither the name of ARM LIMITED nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this
|
|
* software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
* -------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* @ingroup groupExamples
|
|
*/
|
|
|
|
/**
|
|
* @defgroup SVMExample SVM Example
|
|
*
|
|
* \par Description:
|
|
* \par
|
|
* Demonstrates the use of SVM functions. It is complementing the tutorial
|
|
* about classical ML with CMSIS-DSP and python scikit-learn.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
/** \example arm_svm_example_f32.c
|
|
*/
|
|
|
|
#include <math.h>
|
|
#include <stdio.h>
|
|
#include "arm_math.h"
|
|
|
|
/*
|
|
|
|
The polynomial SVM instance containing all parameters.
|
|
Those parameters can be generated with the python library scikit-learn.
|
|
|
|
*/
|
|
arm_svm_polynomial_instance_f32 params;
|
|
|
|
/*
|
|
|
|
Parameters generated by a training of the SVM classifier
|
|
using scikit-learn and some random input data.
|
|
|
|
*/
|
|
#define NB_SUPPORT_VECTORS 11
|
|
|
|
/*
|
|
|
|
Dimension of the vector space. A vector is your feature.
|
|
It could, for instance, be the pixels of a picture or
|
|
the FFT of a signal.
|
|
|
|
*/
|
|
#define VECTOR_DIMENSION 2
|
|
|
|
const float32_t dualCoefficients[NB_SUPPORT_VECTORS]={-0.01628988f, -0.0971605f,
|
|
-0.02707579f, 0.0249406f, 0.00223095f, 0.04117345f,
|
|
0.0262687f, 0.00800358f, 0.00581823f, 0.02346904f, 0.00862162f}; /* Dual coefficients */
|
|
|
|
const float32_t supportVectors[NB_SUPPORT_VECTORS*VECTOR_DIMENSION]={ 1.2510991f, 0.47782799f,
|
|
-0.32711859f, -1.49880648f, -0.08905047f, 1.31907242f,
|
|
1.14059333f, 2.63443767f, -2.62561524f, 1.02120701f,
|
|
-1.2361353f, -2.53145187f,
|
|
2.28308122f, -1.58185875f, 2.73955981f, 0.35759327f,
|
|
0.56662986f, 2.79702016f,
|
|
-2.51380816f, 1.29295364f, -0.56658669f, -2.81944734f}; /* Support vectors */
|
|
|
|
/*
|
|
|
|
Class A is identified with value 0.
|
|
Class B is identified with value 1.
|
|
|
|
This array is used by the SVM functions to do a conversion
|
|
and ease the comparison with the Python code where
|
|
different values could be used.
|
|
|
|
*/
|
|
const int32_t classes[2]={0,1};
|
|
|
|
|
|
int32_t main(void)
|
|
{
|
|
/* Array of input data */
|
|
float32_t in[VECTOR_DIMENSION];
|
|
|
|
/* Result of the classifier */
|
|
int32_t result;
|
|
|
|
|
|
/*
|
|
|
|
Initialization of the SVM instance parameters.
|
|
|
|
Additional parameters (intercept, degree, coef0 and gamma)
|
|
are also coming from Python.
|
|
|
|
*/
|
|
arm_svm_polynomial_init_f32(¶ms,
|
|
NB_SUPPORT_VECTORS,
|
|
VECTOR_DIMENSION,
|
|
-1.661719f, /* Intercept */
|
|
dualCoefficients,
|
|
supportVectors,
|
|
classes,
|
|
3, /* degree */
|
|
1.100000f, /* Coef0 */
|
|
0.500000f /* Gamma */
|
|
);
|
|
|
|
|
|
/*
|
|
|
|
Input data. It is corresponding to a point inside
|
|
the first class.
|
|
|
|
*/
|
|
in[0] = 0.4f;
|
|
in[1] = 0.1f;
|
|
arm_svm_polynomial_predict_f32(¶ms,
|
|
in,
|
|
&result);
|
|
|
|
/*
|
|
|
|
Result should be 0 : First class
|
|
|
|
*/
|
|
printf("Result = %d\n", result);
|
|
|
|
/*
|
|
|
|
This input vector is corresponding to a point inside
|
|
the second class.
|
|
|
|
*/
|
|
in[0] = 3.0f;
|
|
in[1] = 0.0f;
|
|
arm_svm_polynomial_predict_f32(¶ms,
|
|
in,
|
|
&result);
|
|
|
|
/*
|
|
|
|
Result should be 1 : Second class
|
|
|
|
*/
|
|
printf("Result = %d\n", result);
|
|
|
|
}
|
|
|
|
|
|
|