使用java調用libsvm

1.首先,從林智仁教授那裏下載使用包libsvm。這裏有很多版本的libsvm,這裏我們找到java版本的。如下圖:

2.進入這個文件我們可以看到如下文件結構:
紅色圈住的文件是一會要引入到java項目裏的文件,先複製好,一會ctrl+v。
3.在Myeclipse裏面創建一個普通的java項目,並在src文件下ctrl+v,爲了文件結構好看些,再創建一個service文件夾,專門放svm_predict.java,svm_scale.java等4個散落在根目錄下的java文件。comMain是一個調用的主方法,trainfile主要存放測試與訓練的數據,lib文件夾不用管。
 
4.準備訓練數據。libsvm需要按照自己的格式準備數據,纔可以執行。格式要求如下:
 label1 index1:value1 index2:value2 ...
 label2 index1:value1 index2:value2 ...
 ...
label 就是標籤 index是標號,value就是這個標號下的值。舉個例子,班裏有4個同學,兩男兩女。兩個男生身高體重分別爲171cm,65kg,173cm,66kg,兩個女生的升高體重分別爲156cm,45kg,157,46kg。男生用標籤1代替,女生用-1來代替。這樣我們可以建立如下格式的數據:
1 1:171 2:65
1 1:173 2:66
2 1:156 2:45
2 1:157 2:46
保存到trainfile文件下命名爲train1.txt
有人肯定會質疑第一列是身高,第二列是體重,還幹嘛要標誌1和2呢?其實,在實際的預測分類中,每一行數據不是所有的屬性都有值的,可能只有一部分,這樣就需要一個標號來告訴程序,這個屬性值是哪一列。
5.預測數據同樣按照訓練數據那樣準備,由於我們是預測,所以標號可以全部用1或者別的來代替。保存到trainfile文件下命名爲train2.txt
6.在main函數中編寫代碼
 
package com.LibSVMTest.main;

import java.io.IOException;
import service.svm_predict;
import service.svm_train;

public class comMain {

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		String[] arg = { "trainfile\\train1.txt", // 存放SVM訓練模型用的數據的路徑
				"trainfile\\model_r.txt" }; // 存放SVM通過訓練數據訓/ //練出來的模型的路徑

		String[] parg = { "trainfile\\train2.txt", // 這個是存放測試數據
				"trainfile\\model_r.txt", // 調用的是訓練以後的模型
				"trainfile\\out_r.txt" }; // 生成的結果的文件的路徑
		System.out.println("........SVM運行開始..........");
		// 創建一個訓練對象
		svm_train t = new svm_train();
		// 創建一個預測或者分類的對象
		svm_predict p = new svm_predict();
		t.main(arg); // 調用
		p.main(parg); // 調用
	}

}
7.運行,得到預測的結果,結果存放在out_r.txt,裏面存放的是1行N列的矩陣,N對應的是預測的個數,每一個列值就是對於每一個帶預測的分類。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章