Weather casting with Machine Learning (SVM and SRNN).
Dependencies: EthernetInterface GraphicHandler NTPClient SRNN SVM SensorModule mbed-rtos mbed
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 */
Generated on Wed Jul 13 2022 17:43:05 by 1.7.2