Weather casting with Machine Learning (SVM and SRNN).

Dependencies:   EthernetInterface GraphicHandler NTPClient SRNN SVM SensorModule mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ml_util.hpp Source File

ml_util.hpp

00001 #ifndef ML_UTIL_H_INCLUDED
00002 #define ML_UTIL_H_INCLUDED
00003 
00004 #include "mbed.h"
00005 
00006 /* float.h がないので, FLT_MAXをここで...と思ったらあるみたいなことを誰かが言ってた */
00007 #ifndef FLT_MAX
00008 #define FLT_MAX  (0x1.fffffeP127F)      // float max
00009 #endif
00010 
00011 // 特に行列演算用のマクロ集
00012 
00013 // 行列アクセス用マクロ. n_lenは行列の幅(length, col,列の数)
00014 #define MATRIX_AT(ary,n_len,i,j) (ary[(((i) * (n_len)) + (j))])
00015 
00016 // 2乗(ユーグリッド)ノルムを返す
00017 inline float two_norm(float *vec, int dim) {
00018   register float ret = 0;
00019   for (int i=0; i < dim; i++) {
00020     ret += powf(vec[i],2);
00021   }
00022   return sqrtf(ret);
00023 }
00024 
00025 // 2ベクトル間の距離をユーグリッドノルムで測る.
00026 inline float vec_dist(float *x, float *y, int dim) {
00027   register float ret = 0;
00028   for (int i=0; i < dim; i++) {
00029     ret += powf(x[i] - y[i],2);
00030   }
00031   return sqrtf(ret);
00032 }
00033 
00034 // 一様乱数の生成 : [-w,w]で生成.
00035 inline float uniform_rand(float w) {
00036   return (float(rand() - RAND_MAX/2) / float(RAND_MAX)) * 2 * w;
00037 }
00038 
00039 // float配列の最大値を返す
00040 inline float maxf(float* ary, int dim) {
00041   register float max = 0;
00042   for (int i=0; i < dim; i++) {
00043     if (ary[i] >= max) {
00044       max = ary[i];
00045     }
00046   }
00047   return max;
00048 }
00049 
00050 // float配列の最小値を返す
00051 inline float minf(float* ary, int dim) {
00052   register float min = FLT_MAX;
00053   for (int i=0; i < dim; i++) {
00054     if (ary[i] <= min) {
00055       min = ary[i];
00056     }
00057   }
00058   return min;
00059 }
00060 
00061 // サイズm*nの行列とサイズn*1のベクトルの掛け算を計算し,結果をresultにセットする.
00062 
00063 extern void multiply_mat_vec(float*  mat, // m * n 行列
00064                              float*  vec, // n * 1 ベクトル
00065                              float*  result, // m * 1 計算結果ベクトル
00066                              int     m,   // m
00067                              int     n);  // n
00068 
00069 // シグモイド(ロジスティック)関数.
00070 inline float sigmoid_func(float x){
00071   return (1 / (1 + expf(-x)));
00072 }
00073 
00074 // 信号の正規化([0,1]の範囲に収めること:超重要)
00075 inline float normalize_signal(float in, float max, float min){
00076   return float((in - min) / (max - min));
00077 } 
00078 
00079 // 信号の元の領域への拡大([0,1]から元の信号値にスケール)
00080 inline float expand_signal(float in, float max, float min){
00081   return float(min + (max - min) * in);
00082 } 
00083 
00084 #endif /* ML_UTIL_H_INCLUDED */