0. 下載libsvm壓縮包解壓到本地目錄(from:http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html)
1. 新建JAVA工程,導入libsvm包及其源碼
2. 編寫測試代碼,使用libsvm函數進行分類預測
3. 參考貼
1. 新建JAVA工程及主函數main后,右鍵工程=>build path=>configure build path,Java Build Path>Libraries>Add External JARs,導入libsvm.jar。
2. 關聯libsvm源碼(方便以后查看源碼):點開libsvm.jar=>Source attachment:(None)=>Edit,External location=>External Folder
選擇libsvm-3.12下java目錄,一路OK。
測試代碼如下:
1 import libsvm.svm; 2 import libsvm.svm_model; 3 import libsvm.svm_node; 4 import libsvm.svm_parameter; 5 import libsvm.svm_problem; 6 7 public class jmain { 8 9 /** 10 * @param args 11 */ 12 public static void main(String[] args) { 13 //定義訓練集點a{10.0, 10.0} 和 點b{-10.0, -10.0},對應lable為{1.0, -1.0} 14 svm_node pa0 = new svm_node(); 15 pa0.index = 0; 16 pa0.value = 10.0; 17 svm_node pa1 = new svm_node(); 18 pa1.index = -1; 19 pa1.value = 10.0; 20 svm_node pb0 = new svm_node(); 21 pb0.index = 0; 22 pb0.value = -10.0; 23 svm_node pb1 = new svm_node(); 24 pb1.index = 0; 25 pb1.value = -10.0; 26 svm_node[] pa = {pa0, pa1}; //點a 27 svm_node[] pb = {pb0, pb1}; //點b 28 svm_node[][] datas = {pa, pb}; //訓練集的向量表 29 double[] lables = {1.0, -1.0}; //a,b 對應的lable 30 31 //定義svm_problem對象 32 svm_problem problem = new svm_problem(); 33 problem.l = 2; //向量個數 34 problem.x = datas; //訓練集向量表 35 problem.y = lables; //對應的lable數組 36 37 //定義svm_parameter對象 38 svm_parameter param = new svm_parameter(); 39 param.svm_type = svm_parameter.C_SVC; 40 param.kernel_type = svm_parameter.LINEAR; 41 param.cache_size = 100; 42 param.eps = 0.00001; 43 param.C = 1; 44 45 //訓練SVM分類模型 46 System.out.println(svm.svm_check_parameter(problem, param)); //如果參數沒有問題,則svm.svm_check_parameter()函數返回null,否則返回error描述。 47 svm_model model = svm.svm_train(problem, param); //svm.svm_train()訓練出SVM分類模型 48 49 //定義測試數據點c 50 svm_node pc0 = new svm_node(); 51 pc0.index = 0; 52 pc0.value = -0.1; 53 svm_node pc1 = new svm_node(); 54 pc1.index = -1; 55 pc1.value = 0.0; 56 svm_node[] pc = {pc0, pc1}; 57 58 //預測測試數據的lable 59 System.out.println(svm.svm_predict(model, pc)); 60 } 61 }
運行結果為:
null * optimization finished, #iter = 1 nu = 0.0033333333333333335 obj = -0.0033333333333333335, rho = 0.0 nSV = 2, nBSV = 0 Total nSV = 2 -1.0
第一行null是svm.svm_check_parameter(problem, param)的輸出,表示參數設置無誤;最后一行的-1.0表示對c點的預測lable是-1.0。
要注意的幾點是:
1. 主要用了svm.svm_train()做訓練,用svm.svm_predict()做預測,其中用到了svm_problem、svm_parameter、svm_model、svm_node幾種“結構體”對象。
2. svm_node表示的是{向量的分量序號,向量的分量值},很多稀疏矩陣均用此方法存儲數據,可以節約空間;svm_node[]則表示一個向量,一個向量的最后一個分量的svm_node.index用-1表示;svm_node[][]則表示一組向量,也就是訓練集。
1. 視頻: 一個實例搞定libsvm分類《Learn SVM Step by Step》by faruto
2. 如何使用libsvm進行分類
3. Felomeng翻譯:libsvm2.88之函數庫的使用