Easy Support Vector Machine
MCSVM.hpp@0:3f38e74a4a77, 2015-01-15 (annotated)
- 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?
User | Revision | Line number | New 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 */ |