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.一對一法 ...