Weather casting with Machine Learning (SVM and SRNN).
Dependencies: EthernetInterface GraphicHandler NTPClient SRNN SVM SensorModule mbed-rtos mbed
ml_util/ml_util.hpp@6:29d393d430d0, 2015-02-22 (annotated)
- 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?
User | Revision | Line number | New 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 */ |