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:651 1:173 2:662 1:156 2:452 1:157 2:46儲存到trainfile檔案下命名為train1.txt有人肯定會質疑第一列是身高,第二列是體重,還幹嘛要標誌1和2呢?其實,在實際的預測分類中,每一行資料不是所有的屬性都有值的,可能只有一部分,這樣就需要一個標號來告訴程式,這個屬性值是哪一列。5.預測資料同樣按照訓練資料那樣準備,由於我們是預測,所以標號可以全部用1或者別的來代替。儲存到trainfile檔案下命名為train2.txt6.在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 stubString[] 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對應的是預測的個數,每一個列值就是對於每一個帶預測的分類。