Easy Support Vector Machine

Dependents:   WeatherPredictor

Committer:
yukari_hinata
Date:
Thu Jan 15 08:22:02 2015 +0000
Revision:
0:3f38e74a4a77
Child:
2:c4a5251cee32
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yukari_hinata 0:3f38e74a4a77 1 #ifndef MCSVM_H_INCLUDED
yukari_hinata 0:3f38e74a4a77 2 #define MCSVM_H_INCLUDED
yukari_hinata 0:3f38e74a4a77 3
yukari_hinata 0:3f38e74a4a77 4 #include "SVM.hpp"
yukari_hinata 0:3f38e74a4a77 5
yukari_hinata 0:3f38e74a4a77 6 // MCSVMの学習状態
yukari_hinata 0:3f38e74a4a77 7 typedef enum {
yukari_hinata 0:3f38e74a4a77 8 MCSVM_NOT_LEARN, // 学習していない
yukari_hinata 0:3f38e74a4a77 9 MCSVM_LEARN_SUCCESS, // 正常に全SVMを学習した.
yukari_hinata 0:3f38e74a4a77 10 } MCSVM_STATUS;
yukari_hinata 0:3f38e74a4a77 11
yukari_hinata 0:3f38e74a4a77 12 // クラスi,jを識別するSVMのインデックスを返す
yukari_hinata 0:3f38e74a4a77 13 #define INX_KSVM_IJ(n_class,i,j) ((((i) * ((2 * (n_class)) - (3) - (i)))/2) + ((j) - (1)))
yukari_hinata 0:3f38e74a4a77 14
yukari_hinata 0:3f38e74a4a77 15 // Class Multi-Class SVM
yukari_hinata 0:3f38e74a4a77 16 // One-vs-One法(うーんこの)によるSVM.
yukari_hinata 0:3f38e74a4a77 17
yukari_hinata 0:3f38e74a4a77 18 class MCSVM : public SVM
yukari_hinata 0:3f38e74a4a77 19 {
yukari_hinata 0:3f38e74a4a77 20 private:
yukari_hinata 0:3f38e74a4a77 21 int n_class; // 識別クラス数
yukari_hinata 0:3f38e74a4a77 22 // 異なる2クラスi,j(i < j)を識別するSVMをインデックスi*(2k-3-i)/2 + j-1で参照する
yukari_hinata 0:3f38e74a4a77 23 int maxFailcount; // 学習失敗を許容する最大回数
yukari_hinata 0:3f38e74a4a77 24
yukari_hinata 0:3f38e74a4a77 25 // マルチクラス用の拡張:サンプルは共有し, 各SVMのパラメタを個別に保持
yukari_hinata 0:3f38e74a4a77 26 float* mc_alpha; // 各識別用の双対係数
yukari_hinata 0:3f38e74a4a77 27 int* mc_label; // 各識別用の2値(-1,1)ラベル, 識別に関係しないデータにはラベル0が付与される.
yukari_hinata 0:3f38e74a4a77 28 // マルチクラス識別の場合,SVM::labelには0,...,n_class-1までのラベルが付いている
yukari_hinata 0:3f38e74a4a77 29
yukari_hinata 0:3f38e74a4a77 30 public:
yukari_hinata 0:3f38e74a4a77 31 MCSVM(int, // クラス個数
yukari_hinata 0:3f38e74a4a77 32 int, // データ次元
yukari_hinata 0:3f38e74a4a77 33 int, // サンプル個数
yukari_hinata 0:3f38e74a4a77 34 float*, // サンプルデータ
yukari_hinata 0:3f38e74a4a77 35 int*); // マルチクラスラベル
yukari_hinata 0:3f38e74a4a77 36
yukari_hinata 0:3f38e74a4a77 37 ~MCSVM(void);
yukari_hinata 0:3f38e74a4a77 38
yukari_hinata 0:3f38e74a4a77 39 // 未知データのラベルを推定する.返り値はマルチクラスラベル0,...,n_class-1
yukari_hinata 0:3f38e74a4a77 40 int predict_label(float*);
yukari_hinata 0:3f38e74a4a77 41
yukari_hinata 0:3f38e74a4a77 42 // 未知データの識別確率を推定する.
yukari_hinata 0:3f38e74a4a77 43 // ラベル識別predict_label結果の整合性を考えない.
yukari_hinata 0:3f38e74a4a77 44 float predict_probability(float*);
yukari_hinata 0:3f38e74a4a77 45
yukari_hinata 0:3f38e74a4a77 46 // 全てのSVMの学習する.
yukari_hinata 0:3f38e74a4a77 47 int learning(void);
yukari_hinata 0:3f38e74a4a77 48
yukari_hinata 0:3f38e74a4a77 49 // 双対係数のゲッター
yukari_hinata 0:3f38e74a4a77 50 float* get_alpha(void);
yukari_hinata 0:3f38e74a4a77 51
yukari_hinata 0:3f38e74a4a77 52 // 双対係数のセッター
yukari_hinata 0:3f38e74a4a77 53 void set_alpha(float*, int, int);
yukari_hinata 0:3f38e74a4a77 54
yukari_hinata 0:3f38e74a4a77 55 };
yukari_hinata 0:3f38e74a4a77 56
yukari_hinata 0:3f38e74a4a77 57 #endif /* MCSVM_H_INCLUDED */