1. libSVM簡(jiǎn)介
訓(xùn)練模型的結(jié)構(gòu)體
struct svm_problem //儲(chǔ)存參加計(jì)算的所有樣本
{
int l; //記錄樣本總數(shù)
double *y; //指向樣本類別的組數(shù)
struct svm_node **x;//數(shù)據(jù)樣本
};
當(dāng)樣本類別事先已經(jīng)被告知時(shí),,可以通過(guò)數(shù)字來(lái)給樣本數(shù)據(jù)進(jìn)行標(biāo)識(shí)(如果是兩類通常以1與-1來(lái)表示),。如果不清楚樣本類別可以用樣本個(gè)數(shù)編號(hào)來(lái)設(shè)置,這時(shí)候分類的準(zhǔn)確率也就無(wú)法判定了,。
數(shù)據(jù)樣本是一個(gè)二維數(shù)組,,其中每個(gè)單元格儲(chǔ)存的是一個(gè)svm_node,y與樣本數(shù)據(jù)的對(duì)應(yīng)關(guān)系為:
數(shù)據(jù)節(jié)點(diǎn)的結(jié)構(gòu)體
struct svm_node //儲(chǔ)存單一向量的單個(gè)特征
{
int index; //索引
double value; //值
};
如果需要儲(chǔ)存向量x=(1,121,12321,121,1),就可以使用6個(gè)svm_node來(lái)保存,,內(nèi)存映像為:
index
|
1
|
2
|
3
|
4
|
5
|
-1
|
value
|
1
|
121
|
12321
|
121
|
1
|
NULL
|
注意:向量是以索引值為-1的元素為結(jié)束標(biāo)志位的,。如果沒(méi)有標(biāo)志位將導(dǎo)致程序崩潰。
SVM模型類型枚舉
enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR };
C_SVC:C表示懲罰因子,,C越大表示對(duì)錯(cuò)誤分類的懲罰越大
NU_SVC:和C_SVC相同,。
ONE_CLASS:不需要類標(biāo)號(hào),用于支持向量的密度估計(jì)和聚類.
EPSILON_SVR:-不敏感損失函數(shù),對(duì)樣本點(diǎn)來(lái)說(shuō),,存在著一個(gè)不為目標(biāo)函數(shù)提供任何損失值的區(qū)域,,即-帶。
NU_SVR:由于EPSILON_SVR需要事先確定參數(shù),,然而在某些情況下選擇合適的參數(shù)卻不是一件容易的事情,。而NU_SVR能夠自動(dòng)計(jì)算參數(shù)。
注意:C_SVC與NU_SVC其實(shí)采用的模型相同,,但是它們的參數(shù)C的范圍不同,C_SVC采用的是0到正無(wú)窮,,NU_SVC是[0,1]。
核函數(shù)類型枚舉
enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED };
LINEAR:線性核函數(shù)(linear kernel)
POLY:多項(xiàng)式核函數(shù)(ploynomial kernel)
RBF:徑向機(jī)核函數(shù)(radical basis function)
SIGMOID: 神經(jīng)元的非線性作用函數(shù)核函數(shù)(Sigmoid tanh)
PRECOMPUTED:用戶自定義核函數(shù)
只有四個(gè)常用核函數(shù),,但我們必須決定哪一個(gè)是首選,。然后是懲罰因子C和核參數(shù)的選擇。
在支持向量機(jī)中使用的核函數(shù)主要有四類:
線性核函數(shù):
多項(xiàng)式核函數(shù):
RBF核函數(shù):
Sigmoid核函數(shù):
其中,, 和 均為核參數(shù),。
究竟用哪一種核函數(shù)取決對(duì)數(shù)據(jù)處理的要求,不過(guò)建議一般都是使用RBF核函數(shù),。因?yàn)镽BF核函數(shù)具有良好的性態(tài),,在實(shí)際問(wèn)題中表現(xiàn)出了良好的性能。
1 RBF核
通常而言,,RBF核是合理的首選,。這個(gè)核函數(shù)將樣本非線性地映射到一個(gè)更高維的空間,與線性核不同,,它能夠處理分類標(biāo)注和屬性的非線性關(guān)系,。并且,線性核是RBF的一個(gè)特例(Keerthi and Lin 2003),,因此,,使用一個(gè)懲罰因子C的線性核與某些參數(shù)(C,γ)的RBF核具有相同的性能。同時(shí),,Sigmoid核的表現(xiàn)很像一定參數(shù)的RBF核(Lin and Link 2003),。
第二個(gè)原因,超參數(shù)(hyperparameter)的數(shù)量會(huì)影響到模型選擇的復(fù)雜度(因?yàn)閰?shù)只能靠試驗(yàn)呀?。?。多項(xiàng)式核比RBF核有更多的超參數(shù)。
最后,,RBF核有更少的數(shù)值復(fù)雜度(numerical difficulties),。一個(gè)關(guān)鍵點(diǎn)0<Kij<=1對(duì)比多項(xiàng)式核,后者關(guān)鍵值需要 infinity(rxiTxj+r>1)或者zero(rxiTxj+r<1),,這是高階運(yùn)算,。此外,我們必須指出sigmoid核在某些參數(shù)下不是合法的 (例如,,不是兩個(gè)向量的內(nèi)積),。(Vapnik 1995)
當(dāng)然,也存在一些情形RBF核是不適用的,。特別地,,當(dāng)特征維數(shù)非常大的時(shí)候,很可能只能適用線性核,。
- svm_type –
指定SVM的類型,,下面是可能的取值:
- CvSVM::C_SVC C類支持向量分類機(jī)。
n類分組 (n 2),,允許用異常值懲罰因子C進(jìn)行不完全分類,。
- CvSVM::NU_SVC 類支持向量分類機(jī)。n類似然不完全分類的分類器,。參數(shù)為 取代C(其值在區(qū)間【0,,1】中,nu越大,,決策邊界越平滑),。
- CvSVM::ONE_CLASS 單分類器,所有的訓(xùn)練數(shù)據(jù)提取自同一個(gè)類里,,然后SVM建立了一個(gè)分界線以分割該類在特征空間中所占區(qū)域和其它類在特征空間中所占區(qū)域,。
- CvSVM::EPS_SVR 類支持向量回歸機(jī)。訓(xùn)練集中的特征向量和擬合出來(lái)的超平面的距離需要小于p,。異常值懲罰因子C被采用,。
- CvSVM::NU_SVR 類支持向量回歸機(jī)。 代替了 p,。
- kernel_type –
SVM的內(nèi)核類型,,下面是可能的取值:
- CvSVM::LINEAR 線性內(nèi)核,。沒(méi)有任何向映射至高維空間,線性區(qū)分(或回歸)在原始特征空間中被完成,,這是最快的選擇,。.
- CvSVM::POLY 多項(xiàng)式內(nèi)核: .
- CvSVM::RBF 基于徑向的函數(shù),對(duì)于大多數(shù)情況都是一個(gè)較好的選擇: .
- CvSVM::SIGMOID Sigmoid函數(shù)內(nèi)核:.
- degree – 內(nèi)核函數(shù)(POLY)的參數(shù)degree,。
- gamma – 內(nèi)核函數(shù)(POLY/ RBF/ SIGMOID)的參數(shù),。
- coef0 – 內(nèi)核函數(shù)(POLY/ SIGMOID)的參數(shù)coef0。
- Cvalue – SVM類型(C_SVC/ EPS_SVR/ NU_SVR)的參數(shù)C,。
- nu – SVM類型(NU_SVC/ ONE_CLASS/ NU_SVR)的參數(shù) ,。
- p – SVM類型(EPS_SVR)的參數(shù) 。
- class_weights – C_SVC中的可選權(quán)重,,賦給指定的類,,乘以C以后變成 。所以這些權(quán)重影響不同類別的錯(cuò)誤分類懲罰項(xiàng),。權(quán)重越大,,某一類別的誤分類數(shù)據(jù)的懲罰項(xiàng)就越大。
- term_crit – SVM的迭代訓(xùn)練過(guò)程的中止條件,,解決部分受約束二次最優(yōu)問(wèn)題,。您可以指定的公差和/或最大迭代次數(shù)。
|
|