|
|
|
|
@ -43,11 +43,10 @@
|
|
|
|
|
*
|
|
|
|
|
* @param[in] *S points to a naive bayes instance structure
|
|
|
|
|
* @param[in] *in points to the elements of the input vector.
|
|
|
|
|
* @param[in] *pBuffer points to a buffer of length numberOfClasses
|
|
|
|
|
* @param[out] *pOutputProbabilities points to a buffer of length numberOfClasses containing estimated probabilities
|
|
|
|
|
* @param[out] *pBufferB points to a temporary buffer of length numberOfClasses
|
|
|
|
|
* @return The predicted class
|
|
|
|
|
*
|
|
|
|
|
* @par If the number of classes is big, MVE version will consume lot of
|
|
|
|
|
* stack since the log prior are computed on the stack.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
@ -58,19 +57,21 @@
|
|
|
|
|
|
|
|
|
|
uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_instance_f32 *S,
|
|
|
|
|
const float32_t * in,
|
|
|
|
|
float32_t *pBuffer)
|
|
|
|
|
float32_t *pOutputProbabilities,
|
|
|
|
|
float32_t *pBufferB
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
uint32_t nbClass;
|
|
|
|
|
const float32_t *pTheta = S->theta;
|
|
|
|
|
const float32_t *pSigma = S->sigma;
|
|
|
|
|
float32_t *buffer = pBuffer;
|
|
|
|
|
float32_t *buffer = pOutputProbabilities;
|
|
|
|
|
const float32_t *pIn = in;
|
|
|
|
|
float32_t result;
|
|
|
|
|
f32x4_t vsigma;
|
|
|
|
|
float32_t tmp;
|
|
|
|
|
f32x4_t vacc1, vacc2;
|
|
|
|
|
uint32_t index;
|
|
|
|
|
float32_t logclassPriors[S->numberOfClasses];
|
|
|
|
|
float32_t *logclassPriors=pBufferB;
|
|
|
|
|
float32_t *pLogPrior = logclassPriors;
|
|
|
|
|
|
|
|
|
|
arm_vlog_f32((float32_t *) S->classPriors, logclassPriors, S->numberOfClasses);
|
|
|
|
|
@ -133,7 +134,7 @@ uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_ins
|
|
|
|
|
buffer++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
arm_max_f32(pBuffer, S->numberOfClasses, &result, &index);
|
|
|
|
|
arm_max_f32(pOutputProbabilities, S->numberOfClasses, &result, &index);
|
|
|
|
|
|
|
|
|
|
return (index);
|
|
|
|
|
}
|
|
|
|
|
@ -148,7 +149,8 @@ uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_ins
|
|
|
|
|
|
|
|
|
|
uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_instance_f32 *S,
|
|
|
|
|
const float32_t * in,
|
|
|
|
|
float32_t *pBuffer)
|
|
|
|
|
float32_t *pOutputProbabilities,
|
|
|
|
|
float32_t *pBufferB)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
const float32_t *pPrior = S->classPriors;
|
|
|
|
|
@ -159,7 +161,7 @@ uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_ins
|
|
|
|
|
const float32_t *pTheta1 = S->theta + S->vectorDimension;
|
|
|
|
|
const float32_t *pSigma1 = S->sigma + S->vectorDimension;
|
|
|
|
|
|
|
|
|
|
float32_t *buffer = pBuffer;
|
|
|
|
|
float32_t *buffer = pOutputProbabilities;
|
|
|
|
|
const float32_t *pIn=in;
|
|
|
|
|
|
|
|
|
|
float32_t result;
|
|
|
|
|
@ -174,6 +176,7 @@ uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_ins
|
|
|
|
|
float32x2_t tmpV2;
|
|
|
|
|
float32x4_t thetaV,thetaV1;
|
|
|
|
|
float32x4_t inV;
|
|
|
|
|
(void)pBufferB;
|
|
|
|
|
|
|
|
|
|
epsilonV = vdupq_n_f32(S->epsilon);
|
|
|
|
|
|
|
|
|
|
@ -322,32 +325,24 @@ uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_ins
|
|
|
|
|
classBlkCnt--;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
arm_max_f32(pBuffer,S->numberOfClasses,&result,&index);
|
|
|
|
|
arm_max_f32(pOutputProbabilities,S->numberOfClasses,&result,&index);
|
|
|
|
|
|
|
|
|
|
return(index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Naive Gaussian Bayesian Estimator
|
|
|
|
|
*
|
|
|
|
|
* @param[in] *S points to a naive bayes instance structure
|
|
|
|
|
* @param[in] *in points to the elements of the input vector.
|
|
|
|
|
* @param[in] *pBuffer points to a buffer of length numberOfClasses
|
|
|
|
|
* @return The predicted class
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_instance_f32 *S,
|
|
|
|
|
const float32_t * in,
|
|
|
|
|
float32_t *pBuffer)
|
|
|
|
|
float32_t *pOutputProbabilities,
|
|
|
|
|
float32_t *pBufferB)
|
|
|
|
|
{
|
|
|
|
|
uint32_t nbClass;
|
|
|
|
|
uint32_t nbDim;
|
|
|
|
|
const float32_t *pPrior = S->classPriors;
|
|
|
|
|
const float32_t *pTheta = S->theta;
|
|
|
|
|
const float32_t *pSigma = S->sigma;
|
|
|
|
|
float32_t *buffer = pBuffer;
|
|
|
|
|
float32_t *buffer = pOutputProbabilities;
|
|
|
|
|
const float32_t *pIn=in;
|
|
|
|
|
float32_t result;
|
|
|
|
|
float32_t sigma;
|
|
|
|
|
@ -355,6 +350,8 @@ uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_ins
|
|
|
|
|
float32_t acc1,acc2;
|
|
|
|
|
uint32_t index;
|
|
|
|
|
|
|
|
|
|
(void)pBufferB;
|
|
|
|
|
|
|
|
|
|
pTheta=S->theta;
|
|
|
|
|
pSigma=S->sigma;
|
|
|
|
|
|
|
|
|
|
@ -386,7 +383,7 @@ uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_ins
|
|
|
|
|
buffer++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
arm_max_f32(pBuffer,S->numberOfClasses,&result,&index);
|
|
|
|
|
arm_max_f32(pOutputProbabilities,S->numberOfClasses,&result,&index);
|
|
|
|
|
|
|
|
|
|
return(index);
|
|
|
|
|
}
|
|
|
|
|
|