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 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 2:20ecfe6edd71 11 float* svm_tmp_sample = new float[MCSVM_NUM_SAMPLES * DIM_SIGNAL];
yukari_hinata 2:20ecfe6edd71 12 int* svm_tmp_sample_label = new int[MCSVM_NUM_SAMPLES];
yukari_hinata 2:20ecfe6edd71 13 float* svm_tmp_mc_alpha = new float[MCSVM_NUM_SAMPLES * NUM_WEATHERS * (NUM_WEATHERS - 1) / 2];
yukari_hinata 0:f6cdb984f638 14
yukari_hinata 6:29d393d430d0 15 // You can use /dat/SVM_SAMP.txt
yukari_hinata 2:20ecfe6edd71 16 svm_setup_fp = fopen( "/local/SVM_SAMP.CSV" , "r" );
yukari_hinata 0:f6cdb984f638 17 if( svm_setup_fp == NULL ) {
yukari_hinata 0:f6cdb984f638 18 fprintf( stderr, "Error in svm setup : sample file cannot open. \r \n" );
yukari_hinata 0:f6cdb984f638 19 exit(1);
yukari_hinata 0:f6cdb984f638 20 }
yukari_hinata 0:f6cdb984f638 21
yukari_hinata 0:f6cdb984f638 22 line = 0;
yukari_hinata 0:f6cdb984f638 23 while( ( ret = fscanf( svm_setup_fp, " %[^\n,],%f,%f,%f", buf_str, &(buf_data[0]), &(buf_data[1]), &(buf_data[2])) ) != EOF ) {
yukari_hinata 1:8538381cae81 24
yukari_hinata 0:f6cdb984f638 25 if ( !strcmp(buf_str,"shiny") ) {
yukari_hinata 2:20ecfe6edd71 26 svm_tmp_sample_label[line] = SHINY;
yukari_hinata 0:f6cdb984f638 27 } else if ( !strcmp(buf_str,"cloudy") ) {
yukari_hinata 2:20ecfe6edd71 28 svm_tmp_sample_label[line] = CLOUDY;
yukari_hinata 0:f6cdb984f638 29 } else if ( !strcmp(buf_str,"rainy") ) {
yukari_hinata 2:20ecfe6edd71 30 svm_tmp_sample_label[line] = RAINY;
yukari_hinata 0:f6cdb984f638 31 } else if ( !strcmp(buf_str,"snowy") ) {
yukari_hinata 2:20ecfe6edd71 32 svm_tmp_sample_label[line] = SNOWY;
yukari_hinata 0:f6cdb984f638 33 } else {
yukari_hinata 0:f6cdb984f638 34 continue;
yukari_hinata 0:f6cdb984f638 35 }
yukari_hinata 0:f6cdb984f638 36
yukari_hinata 2:20ecfe6edd71 37 memcpy(&(svm_tmp_sample[line * DIM_SIGNAL]), buf_data, sizeof(float) * DIM_SIGNAL);
yukari_hinata 2:20ecfe6edd71 38 // printf("svm sample loading.... ret : %d line : %d %s %f %f %f \r\n", ret, line, buf_str, svm_tmp_sample[line*3], svm_tmp_sample[line*3+1], svm_tmp_sample[line*3+2]);
yukari_hinata 0:f6cdb984f638 39 line++;
yukari_hinata 0:f6cdb984f638 40 }
yukari_hinata 0:f6cdb984f638 41
yukari_hinata 2:20ecfe6edd71 42 mcsvm = new MCSVM(NUM_WEATHERS, DIM_SIGNAL, MCSVM_NUM_SAMPLES, svm_tmp_sample, svm_tmp_sample_label);
yukari_hinata 0:f6cdb984f638 43
yukari_hinata 2:20ecfe6edd71 44 // Thank you freopen.
yukari_hinata 2:20ecfe6edd71 45 // Here, we should not use fclose -> fopen
yukari_hinata 6:29d393d430d0 46
yukari_hinata 6:29d393d430d0 47 // You can use /dat/SVM_ALPH.txt
yukari_hinata 2:20ecfe6edd71 48 svm_setup_fp = freopen("/local/SVM_ALPH.CSV", "r", svm_setup_fp );
yukari_hinata 2:20ecfe6edd71 49 fflush( svm_setup_fp ); // required.
yukari_hinata 2:20ecfe6edd71 50
yukari_hinata 0:f6cdb984f638 51 if ( svm_setup_fp == NULL ) {
yukari_hinata 0:f6cdb984f638 52 fprintf( stderr, "Error in open learned alpha data. \r\n");
yukari_hinata 0:f6cdb984f638 53 exit(1);
yukari_hinata 0:f6cdb984f638 54 }
yukari_hinata 0:f6cdb984f638 55
yukari_hinata 0:f6cdb984f638 56 // 一列のデータではfscanfフォーマットがだるいので, fgetsを使用
yukari_hinata 0:f6cdb984f638 57 line = 0;
yukari_hinata 2:20ecfe6edd71 58 while( fgets( buf_str, 20, svm_setup_fp ) != NULL ) {
yukari_hinata 2:20ecfe6edd71 59 svm_tmp_mc_alpha[line] = atof(buf_str);
yukari_hinata 0:f6cdb984f638 60 // printf("%d %f \r\n", line, tmp_mc_alpha[line]);
yukari_hinata 0:f6cdb984f638 61 line++;
yukari_hinata 0:f6cdb984f638 62 }
yukari_hinata 1:8538381cae81 63
yukari_hinata 2:20ecfe6edd71 64 fclose( svm_setup_fp );
yukari_hinata 2:20ecfe6edd71 65
yukari_hinata 2:20ecfe6edd71 66 mcsvm->set_alpha(svm_tmp_mc_alpha, MCSVM_NUM_SAMPLES, NUM_WEATHERS);
yukari_hinata 1:8538381cae81 67
yukari_hinata 2:20ecfe6edd71 68 delete [] svm_tmp_sample;
yukari_hinata 2:20ecfe6edd71 69 delete [] svm_tmp_sample_label;
yukari_hinata 2:20ecfe6edd71 70 delete [] svm_tmp_mc_alpha;
yukari_hinata 0:f6cdb984f638 71
yukari_hinata 0:f6cdb984f638 72 }
yukari_hinata 0:f6cdb984f638 73
yukari_hinata 0:f6cdb984f638 74 // SRNNのセットアップ. 初期データのセット.
yukari_hinata 0:f6cdb984f638 75 static void srnn_setup(void)
yukari_hinata 0:f6cdb984f638 76 {
yukari_hinata 1:8538381cae81 77 FILE* srnn_setup_fp;
yukari_hinata 1:8538381cae81 78 int ret;
yukari_hinata 1:8538381cae81 79 float buf_data[DIM_SIGNAL];
yukari_hinata 3:5add3759e08a 80 float sample_maxmin[DIM_SIGNAL * 2];
yukari_hinata 2:20ecfe6edd71 81 char buf_str[20];
yukari_hinata 5:b61f3f5b0fc8 82
yukari_hinata 5:b61f3f5b0fc8 83 // グローバルなサンプルキューを**ここで**アロケート
yukari_hinata 5:b61f3f5b0fc8 84 srnn_sample_queue = new float[DIM_SIGNAL * LEN_DATA_SEQUENCE];
yukari_hinata 0:f6cdb984f638 85
yukari_hinata 1:8538381cae81 86 // 信号の正規化のために, 信号の最大値と最小値を決めてやる必要がある.
yukari_hinata 1:8538381cae81 87 sample_maxmin[0] = 50;
yukari_hinata 1:8538381cae81 88 sample_maxmin[1] = -20; // 気温の最大/最小値(想定値)
yukari_hinata 1:8538381cae81 89 sample_maxmin[2] = 1030;
yukari_hinata 1:8538381cae81 90 sample_maxmin[3] = 960; // 気圧
yukari_hinata 1:8538381cae81 91 sample_maxmin[4] = 100;
yukari_hinata 1:8538381cae81 92 sample_maxmin[5] = 0; // 湿度
yukari_hinata 0:f6cdb984f638 93
yukari_hinata 2:20ecfe6edd71 94 srnn_setup_fp = fopen( SEQUENCE_DATA_NAME, "r");
yukari_hinata 1:8538381cae81 95 if( srnn_setup_fp == NULL ) {
yukari_hinata 2:20ecfe6edd71 96 fprintf( stderr, "Error in SRNN setup. sample file cannot open. \r\n");
yukari_hinata 1:8538381cae81 97 exit(1);
yukari_hinata 1:8538381cae81 98 }
yukari_hinata 0:f6cdb984f638 99
yukari_hinata 1:8538381cae81 100 int line = 0;
yukari_hinata 2:20ecfe6edd71 101 while( ( ret = fscanf( srnn_setup_fp, " %[^\n,],%f,%f,%f", buf_str, &(buf_data[0]), &(buf_data[1]), &(buf_data[2])) ) != EOF ) {
yukari_hinata 4:00da8e8c7e2a 102 if ( line == LEN_DATA_SEQUENCE ) break;
yukari_hinata 5:b61f3f5b0fc8 103 memcpy(&(srnn_sample_queue[line * DIM_SIGNAL]), buf_data, sizeof(float) * DIM_SIGNAL);
yukari_hinata 5:b61f3f5b0fc8 104 // printf("sample %d : %f %f %f \r\n", line, MATRIX_AT(srnn_sample_queue,DIM_SIGNAL,line,0),MATRIX_AT(srnn_sample_queue,DIM_SIGNAL,line,1), MATRIX_AT(srnn_sample_queue,DIM_SIGNAL,line,2));
yukari_hinata 1:8538381cae81 105 line++;
yukari_hinata 1:8538381cae81 106 }
yukari_hinata 0:f6cdb984f638 107
yukari_hinata 2:20ecfe6edd71 108 fclose( srnn_setup_fp );
yukari_hinata 2:20ecfe6edd71 109
yukari_hinata 1:8538381cae81 110 /* アドバイス:RNNにおいては,ダイナミクス(中間層のニューロン数)は多いほど良い */
yukari_hinata 5:b61f3f5b0fc8 111 srnn = new SRNN(DIM_SIGNAL, 20, LEN_DATA_SEQUENCE, PREDICT_LENGTH, srnn_sample_queue, sample_maxmin);
yukari_hinata 2:20ecfe6edd71 112
yukari_hinata 0:f6cdb984f638 113 }
yukari_hinata 0:f6cdb984f638 114
yukari_hinata 0:f6cdb984f638 115 // センサーのセットアップ.
yukari_hinata 0:f6cdb984f638 116 static void sensor_setup(void)
yukari_hinata 0:f6cdb984f638 117 {
yukari_hinata 1:8538381cae81 118 sensor_module = new SensorModule(5);
yukari_hinata 0:f6cdb984f638 119 }
yukari_hinata 0:f6cdb984f638 120
yukari_hinata 5:b61f3f5b0fc8 121 // ネットワークのセットアップ
yukari_hinata 0:f6cdb984f638 122 static void network_setup(void)
yukari_hinata 0:f6cdb984f638 123 {
yukari_hinata 0:f6cdb984f638 124 // セットアップ, 最初の時間取得
yukari_hinata 3:5add3759e08a 125 const char prefix_net_str[] = "[Network Status]";
yukari_hinata 1:8538381cae81 126
yukari_hinata 1:8538381cae81 127 //setup ethernet interface
yukari_hinata 1:8538381cae81 128 printf("%s Ethernet initializing....", prefix_net_str);
yukari_hinata 1:8538381cae81 129 if ( eth_if.init() < 0 ) {// Use DHCP
yukari_hinata 1:8538381cae81 130 fprintf( stderr, "%s Ethernet init failed. \r\n", prefix_net_str);
yukari_hinata 1:8538381cae81 131 exit(1);
yukari_hinata 1:8538381cae81 132 }
yukari_hinata 1:8538381cae81 133
yukari_hinata 1:8538381cae81 134 if ( eth_if.connect() < 0 ) {
yukari_hinata 2:20ecfe6edd71 135 // (offlineが確定する -> offline modeへ).
yukari_hinata 5:b61f3f5b0fc8 136 fprintf( stderr, "%s Ethernet connect failed. Go To offline \r\n", prefix_net_str);
yukari_hinata 5:b61f3f5b0fc8 137 return;
yukari_hinata 1:8538381cae81 138 }
yukari_hinata 1:8538381cae81 139
yukari_hinata 1:8538381cae81 140 // init time
yukari_hinata 1:8538381cae81 141 printf("%s Trying to update time...\r\n", prefix_net_str);
yukari_hinata 1:8538381cae81 142
yukari_hinata 1:8538381cae81 143 // Please specify near ntp server. ex) Japan -> ntp.nict.jp:123
yukari_hinata 1:8538381cae81 144 if (ntp_client.setTime("ntp.nict.jp") == 0) {
yukari_hinata 2:20ecfe6edd71 145 printf("%s Set time successfully! \r\n", prefix_net_str);
yukari_hinata 1:8538381cae81 146 } else {
yukari_hinata 1:8538381cae81 147 fprintf( stderr, "%s Error in setup time \r\n", prefix_net_str);
yukari_hinata 1:8538381cae81 148 }
yukari_hinata 1:8538381cae81 149
yukari_hinata 2:20ecfe6edd71 150 // setup http server
yukari_hinata 3:5add3759e08a 151 // http_server = new HTTPServer(80, "/local/");
yukari_hinata 1:8538381cae81 152
yukari_hinata 1:8538381cae81 153 printf("%s IP Address : %s \r\n", prefix_net_str, eth_if.getIPAddress());
yukari_hinata 1:8538381cae81 154 printf("%s Network setup finished! \r\n", prefix_net_str);
yukari_hinata 0:f6cdb984f638 155 }
yukari_hinata 0:f6cdb984f638 156
yukari_hinata 2:20ecfe6edd71 157 // グラフィックハンドラの初期化
yukari_hinata 2:20ecfe6edd71 158 static void graphic_handler_setup(void)
yukari_hinata 2:20ecfe6edd71 159 {
yukari_hinata 4:00da8e8c7e2a 160 graphic_handler = new GraphicHandler(DIM_SIGNAL, PREDICT_INTERVAL_TIME, PREDICT_LENGTH, time(NULL));
yukari_hinata 2:20ecfe6edd71 161 }
yukari_hinata 2:20ecfe6edd71 162
yukari_hinata 2:20ecfe6edd71 163 // データの初期化(アロケート)
yukari_hinata 2:20ecfe6edd71 164 static void data_setup(void)
yukari_hinata 2:20ecfe6edd71 165 {
yukari_hinata 2:20ecfe6edd71 166 new_seqence_data = new float[DIM_SIGNAL]; // 現在の(一番新しい)系列データ
yukari_hinata 2:20ecfe6edd71 167 new_predict_data = new float[DIM_SIGNAL * PREDICT_LENGTH]; // 現在の予測結果
yukari_hinata 2:20ecfe6edd71 168 new_predict_weather = new int[PREDICT_LENGTH]; // 現在の予測天気
yukari_hinata 2:20ecfe6edd71 169 new_predict_probability = new float[PREDICT_LENGTH]; // 現在の予測天気の確率
yukari_hinata 2:20ecfe6edd71 170 }
yukari_hinata 2:20ecfe6edd71 171
yukari_hinata 4:00da8e8c7e2a 172 // 時刻の設定
yukari_hinata 4:00da8e8c7e2a 173 static void jst_setup(int year, int month, int day, int hour, int min)
yukari_hinata 4:00da8e8c7e2a 174 {
yukari_hinata 4:00da8e8c7e2a 175 // setup time structure
yukari_hinata 4:00da8e8c7e2a 176 struct tm t;
yukari_hinata 4:00da8e8c7e2a 177 t.tm_sec = 0; // 0-59
yukari_hinata 4:00da8e8c7e2a 178 t.tm_min = min; // 0-59
yukari_hinata 4:00da8e8c7e2a 179 t.tm_hour = hour; // 0-23
yukari_hinata 4:00da8e8c7e2a 180 t.tm_mday = day; // 1-31
yukari_hinata 4:00da8e8c7e2a 181 t.tm_mon = (month-1); // 0-11
yukari_hinata 4:00da8e8c7e2a 182 t.tm_year = (year-1900); // year since 1900
yukari_hinata 4:00da8e8c7e2a 183
yukari_hinata 4:00da8e8c7e2a 184 // convert to timestamp and set
yukari_hinata 4:00da8e8c7e2a 185 time_t seconds = mktime(&t);
yukari_hinata 4:00da8e8c7e2a 186 set_time(seconds);
yukari_hinata 4:00da8e8c7e2a 187 }
yukari_hinata 4:00da8e8c7e2a 188
yukari_hinata 0:f6cdb984f638 189 // セットアップ.
yukari_hinata 0:f6cdb984f638 190 void setup(void)
yukari_hinata 0:f6cdb984f638 191 {
yukari_hinata 2:20ecfe6edd71 192 printf("SETUP START ");
yukari_hinata 2:20ecfe6edd71 193 printf("-------------------------- \r\n");
yukari_hinata 2:20ecfe6edd71 194 mcsvm_setup();
yukari_hinata 2:20ecfe6edd71 195 printf("SVM ...OK \r\n");
yukari_hinata 1:8538381cae81 196 srnn_setup();
yukari_hinata 2:20ecfe6edd71 197 printf("SRNN ...OK \r\n");
yukari_hinata 6:29d393d430d0 198 //sensor_setup();
yukari_hinata 2:20ecfe6edd71 199 printf("SENSOR ...OK \r\n");
yukari_hinata 4:00da8e8c7e2a 200 // network_setup();
yukari_hinata 5:b61f3f5b0fc8 201 jst_setup(2015, 2, 20, 4, 0);
yukari_hinata 5:b61f3f5b0fc8 202 printf("NETWORK ...NO(offline) \r\n");
yukari_hinata 2:20ecfe6edd71 203 graphic_handler_setup();
yukari_hinata 2:20ecfe6edd71 204 printf("GRAPHIC ...OK \r\n");
yukari_hinata 2:20ecfe6edd71 205 data_setup();
yukari_hinata 2:20ecfe6edd71 206 printf("SHARED DATA ...OK \r\n");
yukari_hinata 3:5add3759e08a 207 printf("SETUP SUCCESS ");
yukari_hinata 2:20ecfe6edd71 208 printf("-------------------------- \r\n");
yukari_hinata 0:f6cdb984f638 209 }