Weather casting with Machine Learning (SVM and SRNN).

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

Committer:
yukari_hinata
Date:
Sun Feb 15 09:28:23 2015 +0000
Revision:
0:f6cdb984f638
Child:
1:8538381cae81
modified (add setup modules)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yukari_hinata 0:f6cdb984f638 1 #include "setup.hpp"
yukari_hinata 0:f6cdb984f638 2
yukari_hinata 0:f6cdb984f638 3 // mcsvmのセットアップ : サンプル/係数のセット
yukari_hinata 0:f6cdb984f638 4 static void mcsvm_setup(void)
yukari_hinata 0:f6cdb984f638 5 {
yukari_hinata 0:f6cdb984f638 6 FILE* svm_setup_fp;
yukari_hinata 0:f6cdb984f638 7 char buf_str[20];
yukari_hinata 0:f6cdb984f638 8 int ret, line;
yukari_hinata 0:f6cdb984f638 9 float buf_data[DIM_SIGNAL];
yukari_hinata 0:f6cdb984f638 10
yukari_hinata 0:f6cdb984f638 11 float* tmp_sample = new float[MCSVM_NUM_SAMPLES * DIM_SIGNAL];
yukari_hinata 0:f6cdb984f638 12 int* tmp_sample_label = new int[MCSVM_NUM_SAMPLES];
yukari_hinata 0:f6cdb984f638 13 float* tmp_mc_alpha = new float[MCSVM_NUM_SAMPLES * NUM_WEATHERS * (NUM_WEATHERS - 1) / 2];
yukari_hinata 0:f6cdb984f638 14
yukari_hinata 0:f6cdb984f638 15 svm_setup_fp = fopen( "/local/svm_samp.csv" , "r" );
yukari_hinata 0:f6cdb984f638 16 if( svm_setup_fp == NULL ) {
yukari_hinata 0:f6cdb984f638 17 fprintf( stderr, "Error in svm setup : sample file cannot open. \r \n" );
yukari_hinata 0:f6cdb984f638 18 exit(1);
yukari_hinata 0:f6cdb984f638 19 }
yukari_hinata 0:f6cdb984f638 20
yukari_hinata 0:f6cdb984f638 21 line = 0;
yukari_hinata 0:f6cdb984f638 22 while( ( ret = fscanf( svm_setup_fp, " %[^\n,],%f,%f,%f", buf_str, &(buf_data[0]), &(buf_data[1]), &(buf_data[2])) ) != EOF ) {
yukari_hinata 0:f6cdb984f638 23
yukari_hinata 0:f6cdb984f638 24 if ( !strcmp(buf_str,"shiny") ) {
yukari_hinata 0:f6cdb984f638 25 tmp_sample_label[line] = SHINY;
yukari_hinata 0:f6cdb984f638 26 } else if ( !strcmp(buf_str,"cloudy") ) {
yukari_hinata 0:f6cdb984f638 27 tmp_sample_label[line] = CLOUDY;
yukari_hinata 0:f6cdb984f638 28 } else if ( !strcmp(buf_str,"rainy") ) {
yukari_hinata 0:f6cdb984f638 29 tmp_sample_label[line] = RAINY;
yukari_hinata 0:f6cdb984f638 30 } else if ( !strcmp(buf_str,"snowy") ) {
yukari_hinata 0:f6cdb984f638 31 tmp_sample_label[line] = SNOWY;
yukari_hinata 0:f6cdb984f638 32 } else {
yukari_hinata 0:f6cdb984f638 33 continue;
yukari_hinata 0:f6cdb984f638 34 }
yukari_hinata 0:f6cdb984f638 35
yukari_hinata 0:f6cdb984f638 36 tmp_sample[line * 3] = buf_data[0];
yukari_hinata 0:f6cdb984f638 37 tmp_sample[line * 3 + 1] = buf_data[1];
yukari_hinata 0:f6cdb984f638 38 tmp_sample[line * 3 + 2] = buf_data[2];
yukari_hinata 0:f6cdb984f638 39
yukari_hinata 0:f6cdb984f638 40 line++;
yukari_hinata 0:f6cdb984f638 41 }
yukari_hinata 0:f6cdb984f638 42
yukari_hinata 0:f6cdb984f638 43 mcsvm = new MCSVM(NUM_WEATHERS, DIM_SIGNAL, MCSVM_NUM_SAMPLES, tmp_sample, tmp_sample_label);
yukari_hinata 0:f6cdb984f638 44
yukari_hinata 0:f6cdb984f638 45 fclose( svm_setup_fp );
yukari_hinata 0:f6cdb984f638 46
yukari_hinata 0:f6cdb984f638 47 svm_setup_fp = fopen("/local/alpha.csv", "r");
yukari_hinata 0:f6cdb984f638 48 if ( svm_setup_fp == NULL ) {
yukari_hinata 0:f6cdb984f638 49 fprintf( stderr, "Error in open learned alpha data. \r\n");
yukari_hinata 0:f6cdb984f638 50 exit(1);
yukari_hinata 0:f6cdb984f638 51 }
yukari_hinata 0:f6cdb984f638 52
yukari_hinata 0:f6cdb984f638 53 // 一列のデータではfscanfフォーマットがだるいので, fgetsを使用
yukari_hinata 0:f6cdb984f638 54 line = 0;
yukari_hinata 0:f6cdb984f638 55 while( fgets( buf_str, 20, svm_setup_fp) != NULL ){
yukari_hinata 0:f6cdb984f638 56 tmp_mc_alpha[line] = atof(buf_str);
yukari_hinata 0:f6cdb984f638 57 // printf("%d %f \r\n", line, tmp_mc_alpha[line]);
yukari_hinata 0:f6cdb984f638 58 line++;
yukari_hinata 0:f6cdb984f638 59 }
yukari_hinata 0:f6cdb984f638 60
yukari_hinata 0:f6cdb984f638 61 mcsvm->set_alpha(tmp_mc_alpha, MCSVM_NUM_SAMPLES, NUM_WEATHERS);
yukari_hinata 0:f6cdb984f638 62
yukari_hinata 0:f6cdb984f638 63 delete [] tmp_sample; delete [] tmp_sample_label; delete [] buf_data;
yukari_hinata 0:f6cdb984f638 64 delete [] tmp_mc_alpha; delete [] buf_str;
yukari_hinata 0:f6cdb984f638 65 fclose( svm_setup_fp );
yukari_hinata 0:f6cdb984f638 66 free( svm_setup_fp ); // mbed BUG - we must free file pointer.
yukari_hinata 0:f6cdb984f638 67
yukari_hinata 0:f6cdb984f638 68 }
yukari_hinata 0:f6cdb984f638 69
yukari_hinata 0:f6cdb984f638 70 // SRNNのセットアップ. 初期データのセット.
yukari_hinata 0:f6cdb984f638 71 static void srnn_setup(void)
yukari_hinata 0:f6cdb984f638 72 {
yukari_hinata 0:f6cdb984f638 73 FILE* srnn_setup_fp;
yukari_hinata 0:f6cdb984f638 74 int ret;
yukari_hinata 0:f6cdb984f638 75 float buf_data[DIM_SIGNAL];
yukari_hinata 0:f6cdb984f638 76 float* sample = new float[LEN_DATA_SEQUENCE * DIM_SIGNAL];
yukari_hinata 0:f6cdb984f638 77 float* sample_maxmin = new float[DIM_SIGNAL * 2];
yukari_hinata 0:f6cdb984f638 78
yukari_hinata 0:f6cdb984f638 79 // 信号の正規化のために, 信号の最大値と最小値を決めてやる必要がある.
yukari_hinata 0:f6cdb984f638 80 sample_maxmin[0] = 50; sample_maxmin[1] = -20; // 気温の最大/最小値(想定値)
yukari_hinata 0:f6cdb984f638 81 sample_maxmin[2] = 1030; sample_maxmin[3] = 960; // 気圧
yukari_hinata 0:f6cdb984f638 82 sample_maxmin[4] = 100; sample_maxmin[5] = 0; // 湿度
yukari_hinata 0:f6cdb984f638 83
yukari_hinata 0:f6cdb984f638 84 srnn_setup_fp = fopen( "/local/srnninit.csv" , "r" );
yukari_hinata 0:f6cdb984f638 85 if( srnn_setup_fp == NULL ){
yukari_hinata 0:f6cdb984f638 86 fprintf( stderr, "Error in SRNN setup. init sample file cannot open. \r\n");
yukari_hinata 0:f6cdb984f638 87 exit(1);
yukari_hinata 0:f6cdb984f638 88 }
yukari_hinata 0:f6cdb984f638 89
yukari_hinata 0:f6cdb984f638 90 int line = 0;
yukari_hinata 0:f6cdb984f638 91 while( ( ret = fscanf( srnn_setup_fp, "%f,%f,%f", &(buf_data[0]), &(buf_data[1]), &(buf_data[2])) ) != EOF ){
yukari_hinata 0:f6cdb984f638 92 memcpy(&(sample[line * DIM_SIGNAL]), buf_data, sizeof(float) * DIM_SIGNAL);
yukari_hinata 0:f6cdb984f638 93 // printf("sample %d : %f %f %f \r\n", line, MATRIX_AT(sample,DIM_SIGNAL,line,0), MATRIX_AT(sample,DIM_SIGNAL,line,1), MATRIX_AT(sample,DIM_SIGNAL,line,2));
yukari_hinata 0:f6cdb984f638 94 line++;
yukari_hinata 0:f6cdb984f638 95 }
yukari_hinata 0:f6cdb984f638 96
yukari_hinata 0:f6cdb984f638 97 /* アドバイス:RNNにおいては,ダイナミクス(中間層のニューロン数)は多いほど良い */
yukari_hinata 0:f6cdb984f638 98 srnn = new SRNN(DIM_SIGNAL, 20, LEN_DATA_SEQUENCE, PREDICT_LENGTH, sample, sample_maxmin);
yukari_hinata 0:f6cdb984f638 99
yukari_hinata 0:f6cdb984f638 100 delete [] sample; delete [] sample_maxmin;
yukari_hinata 0:f6cdb984f638 101 fclose( srnn_setup_fp );
yukari_hinata 0:f6cdb984f638 102 free( srnn_setup_fp );
yukari_hinata 0:f6cdb984f638 103 }
yukari_hinata 0:f6cdb984f638 104
yukari_hinata 0:f6cdb984f638 105 // センサーのセットアップ.
yukari_hinata 0:f6cdb984f638 106 static void sensor_setup(void)
yukari_hinata 0:f6cdb984f638 107 {
yukari_hinata 0:f6cdb984f638 108 sm = new SensorModule(5);
yukari_hinata 0:f6cdb984f638 109 sm->read_all_sensor();
yukari_hinata 0:f6cdb984f638 110 }
yukari_hinata 0:f6cdb984f638 111
yukari_hinata 0:f6cdb984f638 112 // ネットワークのセットアップ
yukari_hinata 0:f6cdb984f638 113 static void network_setup(void)
yukari_hinata 0:f6cdb984f638 114 {
yukari_hinata 0:f6cdb984f638 115 // セットアップ, 最初の時間取得
yukari_hinata 0:f6cdb984f638 116 }
yukari_hinata 0:f6cdb984f638 117
yukari_hinata 0:f6cdb984f638 118 // セットアップ.
yukari_hinata 0:f6cdb984f638 119 void setup(void)
yukari_hinata 0:f6cdb984f638 120 {
yukari_hinata 0:f6cdb984f638 121 mcsvm_setup();
yukari_hinata 0:f6cdb984f638 122 srnn_setup();
yukari_hinata 0:f6cdb984f638 123 sensor_setup();
yukari_hinata 0:f6cdb984f638 124 network_setup();
yukari_hinata 0:f6cdb984f638 125 }