Weather casting with Machine Learning (SVM and SRNN).
Dependencies: EthernetInterface GraphicHandler NTPClient SRNN SVM SensorModule mbed-rtos mbed
Diff: setup.cpp
- Revision:
- 0:f6cdb984f638
- Child:
- 1:8538381cae81
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/setup.cpp Sun Feb 15 09:28:23 2015 +0000 @@ -0,0 +1,125 @@ +#include "setup.hpp" + +// mcsvmのセットアップ : サンプル/係数のセット +static void mcsvm_setup(void) +{ + FILE* svm_setup_fp; + char buf_str[20]; + int ret, line; + float buf_data[DIM_SIGNAL]; + + float* tmp_sample = new float[MCSVM_NUM_SAMPLES * DIM_SIGNAL]; + int* tmp_sample_label = new int[MCSVM_NUM_SAMPLES]; + float* tmp_mc_alpha = new float[MCSVM_NUM_SAMPLES * NUM_WEATHERS * (NUM_WEATHERS - 1) / 2]; + + svm_setup_fp = fopen( "/local/svm_samp.csv" , "r" ); + if( svm_setup_fp == NULL ) { + fprintf( stderr, "Error in svm setup : sample file cannot open. \r \n" ); + exit(1); + } + + line = 0; + while( ( ret = fscanf( svm_setup_fp, " %[^\n,],%f,%f,%f", buf_str, &(buf_data[0]), &(buf_data[1]), &(buf_data[2])) ) != EOF ) { + + if ( !strcmp(buf_str,"shiny") ) { + tmp_sample_label[line] = SHINY; + } else if ( !strcmp(buf_str,"cloudy") ) { + tmp_sample_label[line] = CLOUDY; + } else if ( !strcmp(buf_str,"rainy") ) { + tmp_sample_label[line] = RAINY; + } else if ( !strcmp(buf_str,"snowy") ) { + tmp_sample_label[line] = SNOWY; + } else { + continue; + } + + tmp_sample[line * 3] = buf_data[0]; + tmp_sample[line * 3 + 1] = buf_data[1]; + tmp_sample[line * 3 + 2] = buf_data[2]; + + line++; + } + + mcsvm = new MCSVM(NUM_WEATHERS, DIM_SIGNAL, MCSVM_NUM_SAMPLES, tmp_sample, tmp_sample_label); + + fclose( svm_setup_fp ); + + svm_setup_fp = fopen("/local/alpha.csv", "r"); + if ( svm_setup_fp == NULL ) { + fprintf( stderr, "Error in open learned alpha data. \r\n"); + exit(1); + } + + // 一列のデータではfscanfフォーマットがだるいので, fgetsを使用 + line = 0; + while( fgets( buf_str, 20, svm_setup_fp) != NULL ){ + tmp_mc_alpha[line] = atof(buf_str); + // printf("%d %f \r\n", line, tmp_mc_alpha[line]); + line++; + } + + mcsvm->set_alpha(tmp_mc_alpha, MCSVM_NUM_SAMPLES, NUM_WEATHERS); + + delete [] tmp_sample; delete [] tmp_sample_label; delete [] buf_data; + delete [] tmp_mc_alpha; delete [] buf_str; + fclose( svm_setup_fp ); + free( svm_setup_fp ); // mbed BUG - we must free file pointer. + +} + +// SRNNのセットアップ. 初期データのセット. +static void srnn_setup(void) +{ + FILE* srnn_setup_fp; + int ret; + float buf_data[DIM_SIGNAL]; + float* sample = new float[LEN_DATA_SEQUENCE * DIM_SIGNAL]; + float* sample_maxmin = new float[DIM_SIGNAL * 2]; + + // 信号の正規化のために, 信号の最大値と最小値を決めてやる必要がある. + sample_maxmin[0] = 50; sample_maxmin[1] = -20; // 気温の最大/最小値(想定値) + sample_maxmin[2] = 1030; sample_maxmin[3] = 960; // 気圧 + sample_maxmin[4] = 100; sample_maxmin[5] = 0; // 湿度 + + srnn_setup_fp = fopen( "/local/srnninit.csv" , "r" ); + if( srnn_setup_fp == NULL ){ + fprintf( stderr, "Error in SRNN setup. init sample file cannot open. \r\n"); + exit(1); + } + + int line = 0; + while( ( ret = fscanf( srnn_setup_fp, "%f,%f,%f", &(buf_data[0]), &(buf_data[1]), &(buf_data[2])) ) != EOF ){ + memcpy(&(sample[line * DIM_SIGNAL]), buf_data, sizeof(float) * DIM_SIGNAL); + // 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)); + line++; + } + + /* アドバイス:RNNにおいては,ダイナミクス(中間層のニューロン数)は多いほど良い */ + srnn = new SRNN(DIM_SIGNAL, 20, LEN_DATA_SEQUENCE, PREDICT_LENGTH, sample, sample_maxmin); + + delete [] sample; delete [] sample_maxmin; + fclose( srnn_setup_fp ); + free( srnn_setup_fp ); +} + +// センサーのセットアップ. +static void sensor_setup(void) +{ + sm = new SensorModule(5); + sm->read_all_sensor(); +} + +// ネットワークのセットアップ +static void network_setup(void) +{ + // セットアップ, 最初の時間取得 +} + +// セットアップ. +void setup(void) +{ + mcsvm_setup(); + srnn_setup(); + sensor_setup(); + network_setup(); +}