c++調用Libsvm

libSVM中的readme中文版:http://blog.csdn.net/carson2005/article/details/6539192

?

LibSVM的package中的Readme文件中介紹了怎樣具體的使用LibSvm,可以在Dos下以命令形式進行調用,也可以用程序包中提供的GUI程序Svm-toy進行圖形化的操作。svm-toy提供了store和load操作,可以很方便的手動生成數據,然后store到磁盤中。load可用來從文件中直接調用數據,包括自己手動生成的,更重要的是可用導入數據庫中的數據。

以上兩個方法在具體的研究開發中不夠靈活,若希望自己修改部分代碼,或者把軟件包中的程序集成到自己的工程中,可以采用下面的方法。

LIBSVM軟件包是臺灣大學林智仁(Chih-Jen Lin)博士等用C++實現的LIBSVM庫,可以說是使用最方便的SVM訓練工具[71]。可以解決分類問題(包括C-SVC、n-SVC)、回歸問題(包括e-SVR、n-SVR)以及分布估計(one-class-SVM )等問題,提供了線性、多項式、徑向基和S形函數四種常用的核函數供選擇,可以有效地解決多類問題、交叉驗證選擇參數、對不平衡樣本加權、多類問題的概率估計等。

但是,在Windows環境下,此軟件包只提供DOS工具集(主要包括:訓練工具svmtrain.exe,預測工具svmpredict.exe,縮放數據工具svmscale.exe和二維演示工具svmtoy.exe),LIBSVM2.83版本中的訓練工具和預測工具的界面如下圖3.2-3.3示:

圖3.2 LIBSVM2.83訓練工具界面?

圖3.3 LIBSVM2.83預測工具界面

使用這兩個工具,就可以用來分類了,具體步驟如下:

(1)?把樣本數據按固定格式Ⅰ保存成文本文件A;

(2)?利用訓練工具,輸入訓練參數進行訓練,并把訓練出的支持向量機模型保存成文本文件B;

(3)?在預測工具中,導入訓練好的支持向量機模型B,輸入以固定格式Ⅱ保存的預測數據文本文件C,最終得到預測結果文件D。

具體使用細則和相關參數,可查閱林智仁博士的個人主頁。

很明顯,該軟件包只是一個工具集,很難與既有的程序融合,但該工具包是開源的。因此,筆者通過研究該工具包中的源程序,了解了訓練和預測兩模塊的內部運行機制,成功把LIBSVM2.83嵌入到筆者的VC++6.0程序,希望該移植方法給后人的研究帶來方便。

通過上面的介紹可知LIBSVM分類的具體步驟,在源程序里面,主要由以下2個函數來實現:

(1)?struct svm_model *svm_train(const struct svm_problem *prob, ?const struct svm_parameter *param);

該函數用來做訓練,參數prob,是svm_problem類型數據,具體結構定義如下:

struct svm_problem ? ?//存儲本次參加運算的所有樣本(數據集),及其所屬類別。

{

int n;??????????????????????????? //記錄樣本總數

double *y;?????????????????? //指向樣本所屬類別的數組

struct svm_node **x;?? //指向一個存儲內容為指針的數組

};

其中 ?svm_node ?的結構體定義如下:

struct svm_node???????????????? //用來存儲輸入空間中的單個特征

{

?????? int index;?????????????? //輸入空間序號,假設輸入空間數為m

?????? double value;??????? //該輸入空間的值

};

如訓練數據:

第1行:1 0.247782888 0.628596856 -0.386512633
第2行:1 1.044859413 0.262394802 0.415541039
第3行:1 0.046156436 -0.065052675 -0.075235815
第4行:1 0.098691635 0.006311825 -0.18457295
第5行:1 0.122520315 0.064763687 -0.024003425

............
第N行:1 -0.04467688 -0.057998721 -0.201066975
第N行:2 4.826528746 5.162318271 5.509461776
第N行:2 4.487279504 4.641476549 5.22672087
第N行:2 4.469918164 5.500489693 4.690020813
第N行:2 5.0203612 5.318683113 5.20988211

第一行數據:

樣本所屬類別輸入空間的值輸入空間的值輸入空間的值
prob.y[0]prob.x[0][0]prob.x[0][1]prob.x[0][2]
10.2477828880.628596856-0.386512633

?

所以,prob也可以說是問題的指針,它指向樣本數據的類別和輸入向量,在內存中的具體結構圖如下:

?

圖3.4 LIBSVM訓練時,樣本數據在內存中的存放結構

只需在內存中申請n*(m+1)*sizeof(struct svm_node)大小的空間,并在里面填入每個樣本的每個輸入空間的值,即可在程序中完成prob參數的設置。

參數param,是svm_parameter數據結構,具體結構定義如下:

struct svm_parameter????????? //?訓練參數

{

?????? int svm_type;??????? //SVM類型,

?????? int kernel_type;??????????? //核函數類型

?????? int degree;??????????? ?????? /* for poly */

?????? double gamma;???? ?????? /* for poly/rbf/sigmoid */

?????? double coef0;?????? ?????? /* for poly/sigmoid */

?????? ?????????????????????????????????? /* these are for training only */

?????? double cache_size; ???? /* in MB?制定訓練所需要的內存*/

?????? double eps;??? ????????????? /* stopping criteria */

?????? double C;????? ????????????? /* for C_SVC, EPSILON_SVR and NU_SVR?,懲罰因子*/

?????? int nr_weight; ? ? ? ? ? ? /* for C_SVC?權重的數目*/

?????? int *weight_label; ? ? ? /* for C_SVC?權重,元素個數由nr_weight?決定*/

?????? double* weight;?????????? /* for C_SVC */

?????? double nu;???? ????????????? /* for NU_SVC, ONE_CLASS, and NU_SVR */

?????? double p;?????? ????????????? /* for EPSILON_SVR */

?????? int shrinking;??????? /* use the shrinking heuristics?指明訓練過程是否使用壓縮*/

?????? int probability; ???? ???/* do probability estimates?指明是否要做概率估計*/

}

其中,SVM類型和核函數類型如下:

enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR };??? /* svm_type */

enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED };??????????? ?? /* kernel_type */

只需申請一個svm_parameter結構體,并按實際需要設定SVM類型、核函數和各種參數的值即可完成參數param的設置。

設定完這兩個參數,就可以直接在程序中調用訓練函數進行訓練了,該其函數返回一個struct svm_model *SVM模型的指針,可以使用svm_save_model(const char *model_file_name, const struct svm_model *model)函數,把這個模型保存在磁盤中。至此,訓練函數的移植已經完成。

?

(2)?double svm_predict(const struct svm_model *model, const struct svm_node *x);

參數model,是一個SVM模型的指針,可以使用函數struct svm_model *svm_load_model(const char *model_file_name),導入訓練時保存好的SVM模型,此函數返回一個SVM模型的指針,可以直接賦值給變量model。

參數x,是const struct svm_node結構體的指針,本意是一個輸入空間的指針,但實際上,該函數執行的時候,是從參數x處計算輸入空間,直到遇到單個樣本數據結束標記-1才結束,也就是說,該函數運算了單個樣本中的所有輸入空間數據。因此,在調用此函數時,必須先把預測樣本的數據按圖3.4中的固定格式寫入內存中。另外,該函數只能預測一個樣本的值,本文需要對圖像中的所有像數點預測,就要使用for循環反復調用。

該函數返回一個double類型,指明被預測數據屬于哪個類。

面對兩分類問題的時候,通常使用+1代表正樣本,即類1;-1代表負樣本,即類2。最后根據返回的double值就可以知道預測數據的類別了。

上面函數的解釋表明LIBSVM做分類的具體內部實現過程。那么,就可以不用DOS工具,直接通過調用LIBSVM函數來實現分類,也就可以直接讓LIBSVM嵌入到原有程序中。

下面是LIBSVM2.83移植到本文程序中做兩分類的步驟:

(1)?拷貝svm.h和svm.cpp文件到源工程目錄下,并添加到工程中;

(2)?用既定格式保存樣本點信息到內存中,并設置好訓練參數;

(3)?調用訓練函數,訓練得到支持向量器并以文件形式保存到磁盤;

(4)?導入訓練好的支持向量器文件,調用預測函數對血細胞圖像中的每一個點進行預測,并根據其返回結果進行分類。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458201.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458201.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458201.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STL -set

轉載自:http://blog.csdn.net/LYHVOYAGE/article/details/22989659 set集合容器實現了紅黑樹(Red-Black Tree)的平衡二叉檢索樹的的數據結構, 在插入元素時,它會自動調整二叉樹的排列,把該元素放到適當的位…

【機器學習實戰之一】:C++實現K-近鄰算法KNN

本文不對KNN算法做過多的理論上的解釋,主要是針對問題,進行算法的設計和代碼的注解。 KNN算法: 優點:精度高、對異常值不敏感、無數據輸入假定。 缺點:計算復雜度高、空間復雜度高。 適用數據范圍:數值…

libsvm C++ 代碼參數說明匯總

幾個重要的數據結構 2.1 struct svm_problem {int l; // 記錄樣本的總數double *y; // 樣本所屬的標簽(1, -1)struct svm_node **x; // 指向樣本數據的二維數組(即一個矩陣,行數是樣本數,列數是特征向量維度) }; 2.2 struct svm_node {int …

javascript設計模式-繼承

javascript繼承分為兩種:類式繼承(原型鏈、extend函數)、原型式繼承(對繼承而來的成員的讀和寫的不對等性、clone函數)。 類式繼承-->prototype繼承: 1 function Person(name){2 this.name …

GIS基礎軟件及操作(二)

原文 GIS基礎軟件及操作(二) 練習二、管理地理空間數據庫 1.利用ArcCatalog 管理地理空間數據庫 2.在ArcMap中編輯屬性數據 第1步 啟動 ArcCatalog 打開一個地理數據庫 當 ArcCatalog打開后,點擊, 按鈕(連接到文件夾). 建立到包含練習數據的…

libSVM分類小例C++

from:http://www.doczj.com/list_31/ 使用libSVM求解分類問題的C小例 1.libSVM簡介 訓練模型的結構體 struct svm_problem//儲存參加計算的所有樣本 { int l; //記錄樣本總數 double *y; //指向樣本類別的組數 //prob.y new double[prob.l]; struct svm_node …

qunit 前端腳本測試用例

首先引用qunit 測試框架文件 <link rel"stylesheet" href"qunit-1.22.0.css"> <script src"qunit-1.22.0.js"></script> <div id"qunit"></div> <div id"qunit-fixture"></div>…

非常規文件名刪除

生活中我們偶爾會遇到這樣一件事&#xff1a;走在路上&#xff0c;突然感覺鞋底有東西&#xff0c;抬腳一看&#xff0c;是個泡泡糖。拿不掉&#xff0c;走路還一粘一粘的。要多難受有多難受&#xff01;同樣在linux中也有這么一種文件名。看著不舒服&#xff0c;卻刪不掉。今天…

Machine Learning(Stanford)| 斯坦福大學機(吳恩達)器學習筆記【匯總】

from&#xff1a;https://blog.csdn.net/m399498400/article/details/52556168 定義本課程常用符號 訓練數據&#xff1a;機器用來學習的數據 測試數據&#xff1a;用來考察機器學習效果的數據&#xff0c;相當于考試。 m 訓練樣本的數量&#xff08;訓練集的個數) x 輸入的…

PHP OOP

類跟對象的關系類是對象的抽象(對象的描述(屬性)&#xff0c;對象的行為(方法))對象是類的實體面相對象的三大特征&#xff1a;封裝、集成、多態自定義類Class Person{}屬性定義屬性是類里面的成員&#xff0c;所以要定義屬性的前提條件是需要聲明一個類Class Person{public $n…

kv存儲對抗關系型數據庫

http://www.searchdatabase.com.cn/showcontent_52657.htm轉載于:https://www.cnblogs.com/hexie/p/5276034.html

模板匹配算法

from&#xff1a;https://blog.csdn.net/zhi_neng_zhi_fu/article/details/51029864 模板匹配(Template Matching)算法 模板匹配&#xff08;Template Matching&#xff09;是圖像識別中最具代表性的方法之一。它從待識別圖像中提取若干特征向量與模板對應的特征向量進行比較…

關于linux用戶權限的理解

創建用戶useradd 用戶名創建用戶組groupadd 組名查看用戶Idid 用戶修改文件權限chmod 777 文件名或目錄-R 遞歸修改用戶數組chown 屬主&#xff1a;屬組 文件名或目錄名-R 遞歸轉載于:https://blog.51cto.com/1979431/1833512

IMEI串號

IMEI串號就是國際移動設備身份碼&#xff0c;是電子設備的唯一身份證&#xff0c;由于它的唯一性&#xff0c;它可以用來查詢電子設備的保修期還有產地&#xff0c;可以說用處直逼人民的身份證啊&#xff01; 在撥號鍵盤頁面 輸入【*#06#】五個字符轉載于:https://www.cnblogs…

立體匹配十大概念綜述---立體匹配算法介紹

from&#xff1a;https://blog.csdn.net/wintergeng/article/details/51049596 一、概念 立體匹配算法主要是通過建立一個能量代價函數&#xff0c;通過此能量代價函數最小化來估計像素點視差值。立體匹配算法的實質就是一個最優化求解問題&#xff0c;通過建立合理的能量函數…

zjnu1730 PIRAMIDA(字符串,模擬)

Description Sample Input 6 JANJETINA 5 1 J 1 A 6 N 6 I 5 E Sample Output 1 0 2 1 1題意&#xff1a;給你一個長度小于等于10^6的字符串&#xff0c;然后每次讓它循環鋪蓋&#xff0c;構成層數為n的塔&#xff0c;讓你求得第i層塔中某個字符的個數。 思路&#xff1a;首先要…

ICP算法理解

from&#xff1a;https://blog.csdn.net/linear_luo/article/details/52576082 1 經典ICP ICP的目的很簡單&#xff0c;就是求解兩堆點云之間的變換關系。怎么做呢&#xff1f;思路很自然&#xff0c;既然不知道R和t(針對剛體運動)&#xff0c;那我們就假設為未知量唄&#xf…

2016-8-2更新日志

1.修正版本管理器資源文件名 不能正確拉取 91Resource 文件下的資源的問題2.修正商城購買物品不計算負重的問題3.修正拾取疊加物品 只計算一個物品的重量的問題4.游戲參數-> 游戲選項2->增加物品使用間隔5.修正冷酷不加技能點的BUG6.自定義UI開放測試[目前只能針對熱血傳…

字符流緩沖區的使用之BufferedWriter和BufferedReader

從字符輸入流中讀取文本&#xff0c;緩沖各個字符&#xff0c;從而實現字符、數組和行的高效讀取&#xff0c;代碼中使用了輸入緩沖區的特有的方法&#xff1a;readLine(),獲取一行文本數據 import java.io.BufferedReader; import java.io.FileNotFoundException; import java…

圖像處理的灰度化和二值化

from&#xff1a;http://blog.sina.com.cn/s/blog_13c6397540102wqtt.html 在圖像處理中&#xff0c;用RGB三個分量&#xff08;R&#xff1a;Red&#xff0c;G&#xff1a;Green&#xff0c;B&#xff1a;Blue&#xff09;&#xff0c;即紅、綠、藍三原色來表示真彩色&#x…