libSVM分類小例C

2021-08-21 14:13:40 字數 4530 閱讀 6270

from:

使用libsvm求解分類問題的c++小例

1.libsvm簡介

訓練模型的結構體struct svm_problem//儲存參加計算的所有樣本int l; //記錄樣本總數

double *y; //指向樣本類別的組數   = new double[prob.l];

struct svm_node **x;//資料樣本= new svm_node[prob.l] ==>svm_node[index][value] ;  

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

資料樣本是乙個二維陣列,其中每個單元格儲存的是乙個svm_node,y與樣本資料的對應關係為:

資料節點的結構體

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

int index; //索引

double value; //值

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

svm模型型別列舉

enum ;

◆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:線性核函式(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()

成員函式二:訓練樣本資料,得出模型

void svmexample::analysisdata()

//如果有必要可以進行交叉性檢驗

/*if(cross_validation)

*/ model = svm_train(&prob, ¶m);

}

成員函式三:**資料**資料1:身高180cm,體重85kg;

**資料2:身高161cm,體重50kg;

void svmexample::displayresult()

**結果

文字分類 libsvm

關於 libsvm 的介紹以及相關 網上很多,感興趣可以找找。這是libsvm 這裡主要是針對之前學習過的幾種特徵篩選演算法用 libsvm 進行比較。採用搜狗實驗室的資料,選擇商業類文字 1001 篇,娛樂類文字 1208 篇,測試集 29904 篇。分別採用文件頻次,卡方分布,互資訊,資訊增益來...

libsvm 多分類情況

svm是乙個二分類器,當遇到多類別的時候,一般採取如下兩種策略。a.一對多法 one versus rest,簡稱1 v r svms 訓練時依次把某個類別的樣本歸為一類,其他剩餘的樣本歸為另一類,這樣k個類別的樣本就構造出了k個svm。分類時將未知樣本分類為具有最大分類函式值的那類。b.一對一法 ...

libsvm的多分類策略

svm是乙個二分類器,當遇到多類別的時候,一般採取如下兩種策略。a.一對多法 one versus rest,簡稱1 v r svms 訓練時依次把某個類別的樣本歸為一類,其他剩餘的樣本歸為另一類,這樣k個類別的樣本就構造出了k個svm。分類時將未知樣本分類為具有最大分類函式值的那類。b.一對一法 ...