Weather casting with Machine Learning (SVM and SRNN).

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

Committer:
yukari_hinata
Date:
Sun Feb 22 01:06:19 2015 +0000
Revision:
6:29d393d430d0
Parent:
5:b61f3f5b0fc8
add svm sample data

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yukari_hinata 2:20ecfe6edd71 1 #ifndef ML_UTIL_H_INCLUDED
yukari_hinata 2:20ecfe6edd71 2 #define ML_UTIL_H_INCLUDED
yukari_hinata 2:20ecfe6edd71 3
yukari_hinata 2:20ecfe6edd71 4 #include "mbed.h"
yukari_hinata 2:20ecfe6edd71 5
yukari_hinata 5:b61f3f5b0fc8 6 /* float.h がないので, FLT_MAXをここで...と思ったらあるみたいなことを誰かが言ってた */
yukari_hinata 2:20ecfe6edd71 7 #ifndef FLT_MAX
yukari_hinata 2:20ecfe6edd71 8 #define FLT_MAX (0x1.fffffeP127F) // float max
yukari_hinata 2:20ecfe6edd71 9 #endif
yukari_hinata 2:20ecfe6edd71 10
yukari_hinata 2:20ecfe6edd71 11 // 特に行列演算用のマクロ集
yukari_hinata 2:20ecfe6edd71 12
yukari_hinata 2:20ecfe6edd71 13 // 行列アクセス用マクロ. n_lenは行列の幅(length, col,列の数)
yukari_hinata 2:20ecfe6edd71 14 #define MATRIX_AT(ary,n_len,i,j) (ary[(((i) * (n_len)) + (j))])
yukari_hinata 2:20ecfe6edd71 15
yukari_hinata 2:20ecfe6edd71 16 // 2乗(ユーグリッド)ノルムを返す
yukari_hinata 2:20ecfe6edd71 17 inline float two_norm(float *vec, int dim) {
yukari_hinata 2:20ecfe6edd71 18 register float ret = 0;
yukari_hinata 2:20ecfe6edd71 19 for (int i=0; i < dim; i++) {
yukari_hinata 2:20ecfe6edd71 20 ret += powf(vec[i],2);
yukari_hinata 2:20ecfe6edd71 21 }
yukari_hinata 2:20ecfe6edd71 22 return sqrtf(ret);
yukari_hinata 2:20ecfe6edd71 23 }
yukari_hinata 2:20ecfe6edd71 24
yukari_hinata 2:20ecfe6edd71 25 // 2ベクトル間の距離をユーグリッドノルムで測る.
yukari_hinata 2:20ecfe6edd71 26 inline float vec_dist(float *x, float *y, int dim) {
yukari_hinata 2:20ecfe6edd71 27 register float ret = 0;
yukari_hinata 2:20ecfe6edd71 28 for (int i=0; i < dim; i++) {
yukari_hinata 2:20ecfe6edd71 29 ret += powf(x[i] - y[i],2);
yukari_hinata 2:20ecfe6edd71 30 }
yukari_hinata 2:20ecfe6edd71 31 return sqrtf(ret);
yukari_hinata 2:20ecfe6edd71 32 }
yukari_hinata 2:20ecfe6edd71 33
yukari_hinata 2:20ecfe6edd71 34 // 一様乱数の生成 : [-w,w]で生成.
yukari_hinata 2:20ecfe6edd71 35 inline float uniform_rand(float w) {
yukari_hinata 2:20ecfe6edd71 36 return (float(rand() - RAND_MAX/2) / float(RAND_MAX)) * 2 * w;
yukari_hinata 2:20ecfe6edd71 37 }
yukari_hinata 2:20ecfe6edd71 38
yukari_hinata 2:20ecfe6edd71 39 // float配列の最大値を返す
yukari_hinata 2:20ecfe6edd71 40 inline float maxf(float* ary, int dim) {
yukari_hinata 2:20ecfe6edd71 41 register float max = 0;
yukari_hinata 2:20ecfe6edd71 42 for (int i=0; i < dim; i++) {
yukari_hinata 2:20ecfe6edd71 43 if (ary[i] >= max) {
yukari_hinata 2:20ecfe6edd71 44 max = ary[i];
yukari_hinata 2:20ecfe6edd71 45 }
yukari_hinata 2:20ecfe6edd71 46 }
yukari_hinata 2:20ecfe6edd71 47 return max;
yukari_hinata 2:20ecfe6edd71 48 }
yukari_hinata 2:20ecfe6edd71 49
yukari_hinata 2:20ecfe6edd71 50 // float配列の最小値を返す
yukari_hinata 2:20ecfe6edd71 51 inline float minf(float* ary, int dim) {
yukari_hinata 2:20ecfe6edd71 52 register float min = FLT_MAX;
yukari_hinata 2:20ecfe6edd71 53 for (int i=0; i < dim; i++) {
yukari_hinata 2:20ecfe6edd71 54 if (ary[i] <= min) {
yukari_hinata 2:20ecfe6edd71 55 min = ary[i];
yukari_hinata 2:20ecfe6edd71 56 }
yukari_hinata 2:20ecfe6edd71 57 }
yukari_hinata 2:20ecfe6edd71 58 return min;
yukari_hinata 2:20ecfe6edd71 59 }
yukari_hinata 2:20ecfe6edd71 60
yukari_hinata 2:20ecfe6edd71 61 // サイズm*nの行列とサイズn*1のベクトルの掛け算を計算し,結果をresultにセットする.
yukari_hinata 2:20ecfe6edd71 62
yukari_hinata 2:20ecfe6edd71 63 extern void multiply_mat_vec(float* mat, // m * n 行列
yukari_hinata 2:20ecfe6edd71 64 float* vec, // n * 1 ベクトル
yukari_hinata 2:20ecfe6edd71 65 float* result, // m * 1 計算結果ベクトル
yukari_hinata 2:20ecfe6edd71 66 int m, // m
yukari_hinata 2:20ecfe6edd71 67 int n); // n
yukari_hinata 2:20ecfe6edd71 68
yukari_hinata 2:20ecfe6edd71 69 // シグモイド(ロジスティック)関数.
yukari_hinata 2:20ecfe6edd71 70 inline float sigmoid_func(float x){
yukari_hinata 2:20ecfe6edd71 71 return (1 / (1 + expf(-x)));
yukari_hinata 2:20ecfe6edd71 72 }
yukari_hinata 2:20ecfe6edd71 73
yukari_hinata 2:20ecfe6edd71 74 // 信号の正規化([0,1]の範囲に収めること:超重要)
yukari_hinata 2:20ecfe6edd71 75 inline float normalize_signal(float in, float max, float min){
yukari_hinata 2:20ecfe6edd71 76 return float((in - min) / (max - min));
yukari_hinata 2:20ecfe6edd71 77 }
yukari_hinata 2:20ecfe6edd71 78
yukari_hinata 2:20ecfe6edd71 79 // 信号の元の領域への拡大([0,1]から元の信号値にスケール)
yukari_hinata 2:20ecfe6edd71 80 inline float expand_signal(float in, float max, float min){
yukari_hinata 2:20ecfe6edd71 81 return float(min + (max - min) * in);
yukari_hinata 2:20ecfe6edd71 82 }
yukari_hinata 2:20ecfe6edd71 83
yukari_hinata 2:20ecfe6edd71 84 #endif /* ML_UTIL_H_INCLUDED */