libsvm サポート ベクター マシン アルゴリズム パッケージの基本的な使用法は、サポート ベクター回帰マシンとして説明されています。
次のようにコードをコピーします。
java.io.BufferedReaderをインポートします。
java.io.ファイルをインポートします。
java.io.FileReaderをインポートします。
java.util.ArrayListをインポートします。
java.util.Listをインポートします。
libsvm.svmをインポートします。
libsvm.svm_modelをインポートします。
libsvm.svm_node をインポートします。
libsvm.svm_parameter をインポートします。
libsvm.svm_problem をインポートします。
パブリック クラス SVM {
public static void main(String[] args) {
// トレーニング セット ポイント a{10.0, 10.0} とポイント b{-10.0, -10.0} を定義します。対応するラベルは {1.0, -1.0} です。
List<Double> ラベル = new ArrayList<Double>();
List<svm_node[]> ノードセット = 新しい ArrayList<svm_node[]>();
getData(nodeSet, ラベル, "ファイル/train.txt");
int dataRange=nodeSet.get(0).length;
svm_node[][] datas = new svm_node[nodeSet.size()][dataRange] // トレーニングセットのベクトルテーブル
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < dataRange; j++) {
データ[i][j] = ノードセット.get(i)[j];
}
}
double[] label = new double[label.size()] // a,b に対応するラベル
for (int i = 0; i < ラベル.length; i++) {
ラベル[i] = ラベル.get(i);
}
// svm_problem オブジェクトを定義する
svm_problem 問題 = 新しい svm_problem();
work.l = nodeSet.size(); // ベクトルの数
job.x = data; //トレーニング セット ベクトル テーブル
job.y = lables // 対応するラベル配列;
// svm_parameter オブジェクトを定義する
svm_parameter パラメータ = 新しい svm_parameter();
param.svm_type = svm_parameter.EPSILON_SVR;
param.kernel_type = svm_parameter.LINEAR;
param.cache_size = 100;
param.eps = 0.00001;
パラメータC = 1.9;
//SVM 分類モデルをトレーニングする
System.out.println(svm.svm_check_parameter(問題, パラメータ));
// パラメータに問題がない場合、svm.svm_check_parameter() 関数は null を返し、そうでない場合はエラーの説明を返します。
svm_model モデル = svm.svm_train(問題, パラメータ);
// svm.svm_train() は SVM 分類モデルをトレーニングします
// テストデータを取得する
List<Double> テストラベル = new ArrayList<Double>();
List<svm_node[]> testnodeSet = new ArrayList<svm_node[]>();
getData(testnodeSet, testlabel, "ファイル/test.txt");
svm_node[][] testdatas = new svm_node[testnodeSet.size()][dataRange] // トレーニング セットのベクトル テーブル
for (int i = 0; i < testdatas.length; i++) {
for (int j = 0; j < dataRange; j++) {
テストデータ[i][j] = testnodeSet.get(i)[j];
}
}
double[] testlables = new double[testlabel.size()] // a,b に対応するラベル
for (int i = 0; i < testlables.length; i++) {
テストラベル[i] = テストラベル.get(i);
}
// テストデータを予測するためのラベル
二重誤差 = 0.0;
for (int i = 0; i < testdatas.length; i++) {
double truevalue = テスト可能[i];
System.out.print(truevalue + " ");
double detectValue = svm.svm_predict(model, testdatas[i]);
System.out.println(predictValue);
err += Math.abs(predictValue - truevalue);
}
System.out.println("err=" + err / datas.length);
}
public static void getData(List<svm_node[]> ノードセット, List<Double> ラベル,
文字列ファイル名) {
試す {
FileReader fr = new FileReader(new File(ファイル名));
BufferedReader br = new BufferedReader(fr);
文字列行 = null;
while ((line = br.readLine()) != null) {
String[] データ = line.split(",");
svm_node[] ベクトル = 新しい svm_node[datas.length - 1];
for (int i = 0; i < datas.length - 1; i++) {
svm_node ノード = 新しい svm_node();
ノード.インデックス = i + 1;
ノード.値 = Double.parseDouble(datas[i]);
ベクトル[i] = ノード;
}
ノードセット.add(ベクトル);
double lablevalue = Double.parseDouble(datas[datas.length - 1]);
label.add(ラベル値);
}
} catch (例外 e) {
e.printStackTrace();
}
}
}
トレーニング データ、最後の列はターゲット値です
次のようにコードをコピーします。
17.6、17.7、17.7、17.7、17.8
17.7,17.7,17.7,17.8,17.8
17.7、17.7、17.8、17.8、17.9
17.7、17.8、17.8、17.9、18
17.8、17.8、17.9、18、18.1
17.8、17.9、18、18.1、18.2
17.9、18、18.1、18.2、18.4
18,18.1,18.2,18.4,18.6
18.1、18.2、18.4、18.6、18.7
18.2、18.4、18.6、18.7、18.9
18.4、18.6、18.7、18.9、19.1
18.6、18.7、18.9、19.1、19.3
テストデータ
次のようにコードをコピーします。
18.7、18.9、19.1、19.3、19.6
18.9、19.1、19.3、19.6、19.9
19.1、19.3、19.6、19.9、20.2
19.3,19.6,19.9,20.2,20.6
19.6,19.9,20.2,20.6,21
19.9、20.2、20.6、21、21.5
20.2、20.6、21、21.5、22