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 **x;//數據樣本 ? ?//prob.x = new svm_node[prob.l][] ==>svm_node[index][value] ; ?

};

當樣本類別事先已經被告知時,可以通過數字來給樣本數據進行標識(如果是兩類通常以1與-1來表示)。如果不清楚樣本類別可以用樣本個數編號來設置,這時候分類的準確率也就無法判定了。

數據樣本是一個二維數組,其中每個單元格儲存的是一個svm_node,y與樣本數據的對應關系為:

libSVM分類小例C++

數據節點的結構體

struct svm_node//儲存單一向量的單個特征

{

? ? ? int index; //索引

? ? ? double value; //值

};

如果需要儲存向量,就可以使用6個svm_node來保存,內存映像為:

libSVM分類小例C++

SVM模型類型枚舉

enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR };

◆C_SVC: C表示懲罰因子,C越大表示對錯誤分類的懲罰越大

◆NU_SVC: 和C_SVC相同。

◆ONE_CLASS: 不需要類標號,用于支持向量的密度估計和聚類.

◆EPSILON_SVR:-不敏感損失函數,對樣本點來說,存在著一個不為目標函數提供任何損失值的區域,即-帶。

◆NU_SVR:由于EPSILON_SVR需要事先確定參數,然而在某些情況下選擇合

適的參數卻不是一件容易的事情。而NU_SVR能夠自動計算參數。

注意:C_SVC與NU_SVC其實采用的模型相同,但是它們的參數C的范圍不同C_SVC采用的是0到正無窮,NU_SVC是[0,1]。

核函數類型枚舉

enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED };

◆LINEAR:線性核函數(linear kernel)

◆POLY:多項式核函數(ploynomial kernel)

◆RBF:徑向機核函數(radical basis function)

◆SIGMOID:神經元的非線性作用函數核函數(Sigmoid tanh)

◆PRECOMPUTED:用戶自定義核函數

計算模型參數結構體

struct svm_parameter

{

? ? ? int svm_type; //支持向量機模型類型

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

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

? ? ? int degree; /* 使用于POLY模型*/

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

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

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

? ? ? double cache_size; /* 緩存塊大小(MB) */

? ? ? double eps; /* 終止條件(默認0.001) */

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

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

? ? ? int *weight_label; /* for C_SVC */

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

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

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

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

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

};

結構體svm_mod el

用于保存訓練后的訓練模型,當然原來的訓練參數也必須保留。

struct svm_model

{

? ? ? struct svm_parameter param; /*訓練參數*/

? ? ? int nr_class; /*類別數, = 2 in regression/one class svm */

? ? ? int l; /*支持向量數*/

? ? ? struct svm_node **SV; /*支持向量的指針*/

? ? ? double **sv_coef; /*相當于判別函數中的alpha */

? ? ? double *rho; /*相當于判別函數中的b */

? ? ? double *probA; /* pariwise probability information */

? ? ? double *probB; /* for classification only */

? ? ? int *label; /* label of each class (label[k]) */

? ? ? int *nSV; /* numbe

? ? ? r of SVs for each class (nSV[k]) */

? ? ? int *nSV; /* number of SVs for each class (nSV[k]) */

? ? ? /* nSV[0] + nSV[1] + ... + nSV[k-1] = l */ int free_sv;

? ? ? /* 1 if svm_model is created by svm_load_model*/

? ? ? /* 0 if svm_model is created by svm_train */

};

2.程序代碼實現

這里定義SVMExample類,類主要成員變量為:

struct svm_parameter param; //模型參數

struct svm_problem prob;//

struct svm_model *model; //

struct svm_node *x_space; //

構造函數

構造函數里主要進行參數的初始化,和基本函數的調用

param.svm_type = C_SVC;

param.kernel_type = LINEAR;

param.degree = 3;

param.gamma = 0; // 1/num_features

param.coef0 = 0;

param.nu = 0.5;

param.cache_size = 1;//緩存塊大小

param.C = 1;

param.eps = 1e-3;

param.p = 0.1;

param.shrinking = 1;

param.probability = 0;

param.nr_weight = 0;

param.weight_label = NULL;

param.weight = NULL;

cross_validation = 0;

核函數的選取直接影響到分類的結果,如何正確選取核函數就需要使用者對數據的特性有所了解,根據實際情況,這里的核函數選用的是線性的。

?實例分析

成員函數一:初始化樣本數據

樣本選取是學生的身

高和體重:

樣本選取是學生的身高和體重:

男1:身高:190cm,體重:70kg;

男2:身高:180cm,體重:80kg;

女1:身高:161cm,體重:80kg;

女2:身高:161cm,體重:47kg;

這里由于事先已經知道樣本有男女類別之分,所以設置男生標簽為-1,女生標簽為1,相對于程序中的y值(樣本類別)。

void SVMExample::initliazeData()
{struct svm_node **_node = Malloc(struct svm_node*, 4);//分配4個空間存放4個人信息x_space = Malloc(svm_node, 3);//男1:身高:190cm,體重:70kg;x_space[0].index = 1;x_space[0].value = 190;x_space[1].index = 2;x_space[1].value = 70;x_space[2].index = -1; //x_space[2].value = NULL_node[0] = x_space;x_space = Malloc(svm_node, 3); //男2:身高:180cm,體重:80kg;x_space[0].index = 1;x_space[0].value = 180;x_space[1].index = 2;x_space[1].value = 80;x_space[2].index = -1;//x_space[2].value = NULL_node[1] = x_space;x_space = Malloc(svm_node, 3); //女1:身高:161cm,體重:80kg;x_space[0].index = 1;x_space[0].value = 161;x_space[1].index = 2;x_space[1].value = 45;x_space[2].index = -1;//x_space[2].value = NULL_node[2] = x_space;x_space = Malloc(svm_node, 3); //女2:身高:161cm,體重:47kg;x_space[0].index = 1;x_space[0].value = 163;x_space[1].index = 2;x_space[1].value = 47;x_space[2].index = -1;//x_space[2].value = NULL_node[3] = x_space;double *y1 = Malloc(double, 4); y1[0] = -1;y1[1] = -1;y1[2] = 1;y1[3] = 1;prob.l = 4;prob.x = _node;prob.y = y1;
}

成員函數二:訓練樣本數據,得出模型

void SVMExample::analysisData()
{const char *error_msg;error_msg = svm_check_parameter(&prob,&param);if(error_msg){fprintf(stderr, "\nerror:%s\n", error_msg);exit(1);}//如果有必要可以進行交叉性檢驗/*if(cross_validation){do_cross_validation();}*/model = svm_train(&prob, &param);
}

成員函數三:預測數據

預測數據1:身高180cm,體重85kg;

預測數據2:身高161cm,體重50kg;

void SVMExample::displayResult()
{//進行預報struct svm_node *node1 = Malloc(svm_node, 3);node1[0].index = 1;node1[0].value = 180;node1[1].index = 2;node1[1].value = 85;node1[2].index = -1;double r1 = svm_predict(model, node1);printf("預測值r1:%f\n", r1);free(node1);struct svm_node *node2 = Malloc(svm_node, 3);node2[0].index = 1;node2[0].value = 161;node2[1].index = 2;node2[1].value = 50;node2[2].index = -1;double r2 = svm_predict(model, node2);printf("預測值r2:%f\n", r2);free(node2);
}

預測結果

得出分類結果:預測樣本1的輸出為-1(男),預測樣本2的輸出為1(女)。如果有需要的話請聯系:ikuler@http://www.doczj.com/doc/517f7fa1f524ccbff121846b.html

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

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

相關文章

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…

結合 category 工作原理分析 OC2.0 中的 runtime

絕大多數 iOS 開發者在學習 runtime 時都閱讀過 runtime.h 文件中的這段代碼: struct objc_class {Class isa OBJC_ISA_AVAILABILITY;#if !__OBJC2__Class super_class OBJC2_UNAVAILABLE;const char *name …

獲取子元素

1、純css 獲取子元素 #test1>div {background-color:red;}#test1 div {font-size:14px;}#test1>div:first-child {color:#ccc;} <div id"test1"><div>性別</div><div>男</div></div> 因1示例中為#test1下的子元素 #test1…

JPG PNG GIF BMP圖片格式的區別

類型優點缺點應用場景相同圖片大小比較BMP無損壓縮&#xff0c;圖質最好文件太大&#xff0c;不利于網絡傳輸 152KGIF動畫存儲格式最多256色&#xff0c;畫質差 53KPNG可保存透明背景的圖片畫質中等 202KJPG文件小&#xff0c;利于網絡傳輸畫質損失車牌識別84K BMP BMP&…

EasyUI左右布居

<!DOCTYPE html><html xmlns"http://www.w3.org/1999/xhtml"><head runat"server"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>首頁</title> <li…

44.Android之Shape設置虛線、圓角和漸變學習

Shape在Android中設定各種形狀&#xff0c;今天記錄下&#xff0c;由于比較簡單直接貼代碼。 Shape子屬性簡單說明一下:   gradient -- 對應顏色漸變。 startcolor、endcolor就不多說了。 android:angle是指從哪個角度開始變.solid -- 填充。stroke -- 描邊。corners -- 圓角…

幾種邊緣檢測算子的比較Roberts,Sobel,Prewitt,LOG,Canny

from&#xff1a;https://blog.csdn.net/gdut2015go/article/details/46779251 邊緣檢測是圖像處理和計算機視覺中的基本問題&#xff0c;邊緣檢測的目的是標識數字圖像中亮度變化明顯的點。圖像屬性中的顯著變化通常反映了屬性的重要事件和變化。這些包括&#xff1a;深度上的…