問: 已有哪些學(xué)校的課程應(yīng)用了libsvm?
德國弗賴堡大學(xué),計算機科學(xué)學(xué)院應(yīng)用科學(xué)系
數(shù)學(xué)與計算機科學(xué)部. Faculteit der Exacte Wetenschappen 荷蘭,自由大學(xué)(VU).
威斯康辛大學(xué)-麥迪遜分校,電子工程與計算機工程系
以色列,以色列理工學(xué)院.
佛羅里達州立大學(xué) 計算機與信息科學(xué)系.
肯尼亞,奈洛比大學(xué),計算機科學(xué)學(xué)院.
冰島大學(xué),應(yīng)用數(shù)學(xué)與計算機科學(xué)學(xué)院.
2005,芝加哥大學(xué),機器學(xué)習(xí)夏季學(xué)校,SVM課件.
[Go Top]
--------------------------------------------------------------------------------
問: 我在那里能夠找到libsvm的文件 ?
軟件包中有一個 README 文件,里面詳細(xì)說明了所有參數(shù)選項、數(shù)據(jù)格式以及庫函數(shù)的調(diào)用。在python目錄下,模型選擇工具和python界面的libsvm各有一個README文件。 初學(xué)者可以通過A practical guide to support vector classification 了解如何訓(xùn)練和檢驗數(shù)據(jù).論文LIBSVM : a library for support vector machines 詳細(xì)討論了libsvm的使用.
[Go Top]
--------------------------------------------------------------------------------
問: 以前版本的libsvm都有什么變化?
詳見變化日志.
你可以到這里下載以前版本的libsvm .
[Go Top]
--------------------------------------------------------------------------------
問: 如果我想引用libsvm, 我應(yīng)該引用哪篇論文?
請引用以下論文:
Chih-Chung Chang and Chih-Jen Lin, LIBSVM : a library for support vector machines, 2001. Software available at http://www.csie.ntu.edu.tw/~cjlin/libsvm
bibtex格式如下:
@Manual{CC01a,
author =
title =
year =
note =
}
[Go Top]
--------------------------------------------------------------------------------
問: 如果我想在我的軟件中應(yīng)用svm,是否存在軟件許可問題?
Libsvm許可文件 ("修改了的BSD許可文件") 和其他許多軟件的許可文件都是兼容的,如 GPL. 因此你很容易就可以把libsvm應(yīng)用到你的軟件中,你還可以將它應(yīng)用到商業(yè)產(chǎn)品中.
[Go Top]
--------------------------------------------------------------------------------
問: 是否有一系列基于libsvm的附加工具?
是的,詳見libsvm tools
[Go Top]
--------------------------------------------------------------------------------
問: 在Unix操作系統(tǒng)中, 出現(xiàn)了"error in loading shared libraries"(“在裝載共享庫時發(fā)生錯誤”)或者"cannot open shared object file."(無法打開共享目標(biāo)文件“) 這是為什么?
如果你在一臺機器上編譯代碼,然后到另外一臺有著不兼容庫的機器上運行,這種情況酒會經(jīng)常發(fā)生。你在那臺機器上可以重新編譯一下,或者用靜態(tài)連接。
[Go Top]
--------------------------------------------------------------------------------
問:修改源代碼后,如果想在MS窗口中建立一個“svm-toy”的圖形界面,我該怎么做?
你可以通過選擇 "Win32 Project"來建立一個工程。另外對于"svm-train"和 "svm-predict" ,你需要選擇"Win32 Console Project"。對于libsvm2.5以后的版本,你還可以通過Makefile.win來實現(xiàn)。詳見README。
如果你沒有用Makefile.win并出現(xiàn)了以下連接錯誤:
LIBCMTD.lib(wwincrt0.obj) : error LNK2001: unresolved external symbol
_wWinMain@16
那么,你很有可能是選擇了一個錯誤的工程類型。
[Go Top]
--------------------------------------------------------------------------------
問: 我是MS Windows用戶,在這些預(yù)編譯的exe文件中,為什么只有一個(SVM_toy)運行?
你應(yīng)當(dāng)打開命令窗口,然后輸入svmtrain.exe,這樣就可以在DOS窗口中看到所有的選項了。你可以到README文件中看到一些例子
[Go Top]
--------------------------------------------------------------------------------
問:為什么有時我在training/model 文件中看不到所有的數(shù)據(jù)屬性呢?W
libsvm應(yīng)用了所謂的”稀疏“格式,這樣零值就不用存儲了。例如,有下面屬性的數(shù)據(jù)
1 0 2 0
將被替換為:
1:1 3:2
[Go Top]
--------------------------------------------------------------------------------
問:如果我的數(shù)據(jù)是非數(shù)值型的,可以用libsvm嗎?
目前l(fā)ibsvm只支持?jǐn)?shù)值型的數(shù)據(jù)。因此,你必須將非數(shù)值型的轉(zhuǎn)為數(shù)值型的數(shù)據(jù)。比如,你可以用二進制屬性來替代原來的類別屬性。
[Go Top]
--------------------------------------------------------------------------------
問:為什么要采用稀疏格式呢? 密集數(shù)據(jù)在訓(xùn)練時候會不會很慢?
這是個具有爭議的話題。將系數(shù)向量賦值給核函數(shù)是比較慢的,因此總的訓(xùn)練時間至少是采用密集格式的2倍或3倍。 但是,我們不支持密集格式的數(shù)據(jù),因為我們不能夠處理極度稀疏的數(shù)據(jù)。代碼的簡潔也是我們考慮的一個因素。目前我們決定只支持稀疏格式的數(shù)據(jù)。
[Go Top]
--------------------------------------------------------------------------------
問: 訓(xùn)練C-SVM時,其輸出結(jié)果如下, 它們代表什么意思?
optimization finished, #iter = 219
nu = 0.431030
obj = -100.877286, rho = 0.424632
nSV = 132, nBSV = 107
Total nSV = 132
obj 是對偶SVM問題的最優(yōu)目標(biāo)值. rho 是判決函數(shù)sgn(w^Tx - rho)的偏項. nSV 和 nBSV 分別代表支持向量和邊界支持向量 (即alpha_i = C)的個數(shù). nu-svm 在某中程度上可以看作 C-SVM的等價形式,不過其中的 C被替換為 nu. nu 僅表明了相應(yīng)的參數(shù). 更詳細(xì)的解釋請看libsvm document.
[Go Top]
--------------------------------------------------------------------------------
問:關(guān)于模型文件,您能否解釋的更詳細(xì)一點?
在參數(shù)后面,每一條線代表一個支持向量。 支持向量按照先列出的標(biāo)簽列出(即類標(biāo)簽列表中,第一類的支持向量首先分組,然后依次類推)
如果k是類別的總數(shù),那么每個支持向量的前面就有k-1個y*alpha系數(shù),其中alpha代表如下二分類問題的對偶解:
1 vs j, 2 vs j, ..., j-1 vs j, j vs j+1, j vs j+2, ..., j vs k
并且在前j-1個系數(shù)中,y=+1, 其余的k-j個系數(shù)中y=-1.例如,對于4分類問題,文件看起來結(jié)構(gòu)如下:
+-+-+-+--------------------+
|1|1|1|
|v|v|v|
|2|3|4|
+-+-+-+--------------------+
|1|2|2|
|v|v|v|
|2|3|4|
+-+-+-+--------------------+
|1|2|3|
|v|v|v|
|3|3|4|
+-+-+-+--------------------+
|1|2|3|
|v|v|v|
|4|4|4|
+-+-+-+--------------------+
[Go Top]
--------------------------------------------------------------------------------
問: 在緩緩存中,是否可以用浮點型或者雙精度型來存儲數(shù)據(jù)?
當(dāng)你在緩存中存入更多的數(shù)據(jù)時,我們默認(rèn)的是浮點型.一般情況下,這樣就很好了,但是對于少數(shù)困難的情況(如C非常非常大)解將是巨大的數(shù)字。這時,僅用浮點型,數(shù)值的精度可能就不夠了。
[Go Top]
--------------------------------------------------------------------------------
問:怎樣選擇核函數(shù)?
通常我們建議你首先采用RBF核函數(shù)。Keerthi 和 Lin 的最近的研究( 下載論文) 表明如果模型選擇RBF的話,就沒有必要再考慮線性核函數(shù)了。采用sigmoid核函數(shù)的矩陣不一定會正有界,而且通常它的準(zhǔn)確性也不如RBF(可參見Lin和Lin的論文 此處下載). 多項式核函數(shù)還不錯,但是如果度數(shù)很高的話,數(shù)值困難就會發(fā)生(考慮到(<1)的d次冪會趨向0,(>1)的d次冪會趨向無窮)
[Go Top]
--------------------------------------------------------------------------------
問: libsvm是否可以用來專門處理線性SVM?D
不是的,目前l(fā)ibsvm用同樣的方法處理線性/非線性SVMs. 注意:如果采用線性核函數(shù),一些技巧可能會節(jié)省訓(xùn)練/檢驗的時間。 因此libsvm對線性SVM并不時特別有效,尤其是采用很大的C的問題,這些問題數(shù)據(jù)的數(shù)值比其屬性值要大得多。你可以:
僅用很大的C.下面的論文表明了:當(dāng)C大于一個確定的閥值以后,判決函數(shù)是相同的。
S. S. Keerthi and C.-J. Lin. Asymptotic behaviors of support vector machines with Gaussian kernel . Neural Computation, 15(2003), 1667-1689.
嘗試用bsvm, 它有個對解決線性SVMs很有效的方法.你可以在下面的研究中找到更詳細(xì)的內(nèi)容:
K.-M. Chung, W.-C. Kao, T. Sun, and C.-J. Lin. Decomposition Methods for Linear Support Vector Machines. Neural Computation, 16(2004), 1689-1704.
另外,你并沒必要一定要解決線性SVMs.你可以參考前面有關(guān)如何選取核函數(shù)的問題。
[Go Top]
--------------------------------------------------------------------------------
問: 自由支持向量特別大,我該怎么辦?
當(dāng)數(shù)據(jù)過擬和時,這種情況會經(jīng)常發(fā)生. 如果數(shù)據(jù)的屬性值范圍特別大,你可以嘗試調(diào)整它們的范圍。這樣合適參數(shù)的域可能會很大。注意:libsvm里包含有數(shù)據(jù)調(diào)整程序的,即svm_scale.
[Go Top]
--------------------------------------------------------------------------------
問: 我是否可以用同樣的方法來調(diào)整訓(xùn)練數(shù)據(jù)和檢驗數(shù)據(jù)的范圍?
是的, 可以按照以下方法:
svm-scale -s scaling_parameters train_data > scaled_train_data
svm-scale -r scaling_parameters test_data > scaled_test_data
[Go Top]
--------------------------------------------------------------------------------
問:將屬性值限制到[0,1],是否比限制到 [-1,1]有很大的不同?
對于線性規(guī)劃方法,如果采用可RBF核函數(shù)并進行了參數(shù)的選擇,兩者是沒什么不同的。假設(shè)Mi和mi分別代表第i個屬性的最大值和最小值.規(guī)劃到[0,1]即:
對于[-1 1]:
在RBF核函數(shù)中:
因此在[0,1]數(shù)據(jù)規(guī)劃中用(C,g),和[-1 1]數(shù)據(jù)規(guī)劃中用(C,g/2)是一樣的。
盡管性能相同,但是計算機時間可能不同。對于有許多零入口的數(shù)據(jù), [0,1]規(guī)劃保持了輸入數(shù)據(jù)的稀疏特性,因此可能會節(jié)省計算時間。
[Go Top]
--------------------------------------------------------------------------------
問: 預(yù)測準(zhǔn)確率很低,應(yīng)該如何改進?
可以用python目下的grid.py來尋找合適的參數(shù),grid.py是一個用來選擇模型參數(shù)的工具。關(guān)于模型選擇的重要性,你可以參考我的談話: A practical guide to support vector classification
[Go Top]
--------------------------------------------------------------------------------
問: 我的數(shù)據(jù)是不平衡的,libsvm能解決這樣的問題嗎?
可以。libsvm有一個-wi選項。例如,你用:
svm-train -s 0 -c 10 -w1 1 -w-1 5 data_file
則對類別“-1”的懲罰就較大。注意-w選項僅用在C-SVC中。
[Go Top]
--------------------------------------------------------------------------------
問: nu-SVC和C-SVC有什么不同之處?
除了參數(shù)不同外,兩者基本是一樣的。C-SVC中,C的范圍是0到無窮,nu-SVC中C的范圍是[0 1]。 nu一個很好的特性是:它與支持向量的比率和訓(xùn)練誤差的比率相關(guān)。
[Go Top]
--------------------------------------------------------------------------------
問: 程序一直運行,但卻沒有輸出,應(yīng)該怎么辦?
你最好檢查一下數(shù)據(jù). 每一個訓(xùn)練/學(xué)習(xí)的數(shù)據(jù)都必須在一行,不可以分開。此外,你必須刪除空行。
[Go Top]
--------------------------------------------------------------------------------
問: 程序一直運行(有輸出,比如許多點)。應(yīng)該怎么辦?
從理論上講,如果核矩陣式半正定的,libsvm可以保證收斂。2.4以后版本的libsvm還可以處理非半正定矩陣核,比如sigmoid(tanh)核。這樣看來,你處理的情況是病態(tài)情況(比如參數(shù)過大或過?。?,這樣機會發(fā)生數(shù)值困難。
[Go Top]
--------------------------------------------------------------------------------
問: 訓(xùn)練時間太長,應(yīng)該怎么辦?
對于大型問題,請確保有足夠的緩存空間(即-m)。對于一些困難的情況(比如-c很大),會出現(xiàn)收斂很慢的情況. 你可以常識用一個較大點的終止可容忍偏差. 如果這樣仍然不行,你可以和我們聯(lián)系。我們會告訴你一些關(guān)于改善訓(xùn)練時間短小技巧。
[Go Top]
--------------------------------------------------------------------------------
問:我如何才能得到判決值?
對于回歸,程序可以打印出判決值。對于分類,可以通過解幾個二進制SVMs來實現(xiàn)多分類,因此你可以通過調(diào)用子程序svm_predict_values來實現(xiàn)輸出判決值。然后可以通過子程序svm_get_labels得到相應(yīng)的標(biāo)簽值。詳見軟件包中的README文件。
我們并不推薦以下操作,但是如果你要得到二分類的標(biāo)簽值+1和-1(注:這里的+1、-1和5、10的含義是不一樣的),你只要在svm.cpp文件中的 svm_predict_values(model, x, dec_values) 后面添加:printf("%f\n",dec_values[0]*model->label[0])就可以了。
正(負(fù))判決值對應(yīng)的值為+1(-1)
[Go Top]
--------------------------------------------------------------------------------
問:怎樣得到一個點到超平面的距離?
距離的表達式為: |decision_value| / |w|.我們有: |w|^2 = w^Tw = alpha^T Q alpha = 2*(dual_obj + sum alpha_i). 因此在svm.pp文件中,知道輸出對偶目標(biāo)值的語句,在后面加上打印輸出 w^Tw的語句就可以了.
[Go Top]
--------------------------------------------------------------------------------
問:在linux操作系統(tǒng)上,對于一些問題,如果用很大的緩存(即很大的-m),有時候會出現(xiàn)“段錯誤”("segmentation fault“),為什么?
在32位機器上,最大可設(shè)地址空間為4GB。Linux核將其分成3:1,即:用戶的空間為3GB,核空間為1G。盡管用戶有3GB的存儲空間,但是最大動態(tài)分配內(nèi)存只有2GB。因此如果你將-m設(shè)為2G,內(nèi)存將被耗盡。因此svm-train運行時候如果需要更多內(nèi)存,程序就無法運行。詳見此文.
有兩中方法可以解決這個問題。如果你的機器支持Intel的物理地址擴展,你可以在Linux核中起用HIGHMEM64G選項,這樣用戶和核都將分配到4G的空間. 此外, 你還可以使用`tub'軟件,它將為動態(tài)分配內(nèi)存 elimate the 2G boundary . `tub' 可以到http://www.bitwagon.com/tub.html下載.
[Go Top]
--------------------------------------------------------------------------------
問:: 怎樣才可以不讓svm-train 和svm-predict 在屏幕上輸出?
只要將svm.cpp中的:
#if 1
void info(char *fmt,...)
改為:
#if 0
void info(char *fmt,...)
[Go Top]
--------------------------------------------------------------------------------
問:我想用自己的核函數(shù),但我發(fā)現(xiàn)兩個核函數(shù)賦值子程序 k_function()和kernel_function().我應(yīng)該修改哪個?
我們采用兩個函數(shù)地原因是: 對于RBF核函數(shù)exp(-g |xi - xj|^2),如果我們先計算xi - xj然后平方,將有3n步操作.因此我們先考慮exp(-g (|xi|^2 - 2dot(xi,xj) +|xj|^2)),并先計算所有的|xi|^2,這樣計算步驟將減小到2vn。這是對于訓(xùn)練,但是對于預(yù)測我們不能這樣做,因此必須用一個有3n個步驟的常規(guī)子程序。如果你想使用自己的核函數(shù),最簡單的辦法是:用你核函數(shù)的代碼替換兩個子程序中的任何一個核函數(shù)的代碼。.
[Go Top]
--------------------------------------------------------------------------------
問:對于多分類SVM,libsvm采用的是什么方法 ? 為什么不用"1-against-the rest" 法 ?
對于多分類,我們采用的是1against 1法.我們的選擇建立在以下對比的基礎(chǔ)上: C.-W. Hsu and C.-J. Lin. A comparison of methods for multi-class support vector machines , IEEE Transactions on Neural Networks, 13(2002), 415-425.
"1agains1the rest"是個很好的方法,而且分類效果和"1-against-1."可以相比。但是我們采用后者,因為它訓(xùn)練的時間更短。
[Go Top]
--------------------------------------------------------------------------------
:做完交叉檢驗以后,為什么沒有模型文件輸出?
交叉檢驗只是為了尋找好的參數(shù),尋找完后,你必須在不用-v選項的情況下,重新訓(xùn)練整個數(shù)據(jù),才會得到模型文件。
[Go Top]
--------------------------------------------------------------------------------
問:對于交叉檢驗,我想使用隨機劃分,應(yīng)該如何操作?
如果你用的是 GNU C庫,默認(rèn)的種子是1.因此你在運行svm-train -v后,總是得到相同的結(jié)果. 想用不同的種子,你可在svm-train.c中添加如下代碼:
#include <time.h>
在子程序 do_cross_validation()的開始部分添加,
srand(time(0));
[Go Top]
--------------------------------------------------------------------------------
問:如果我想解決L2-svm 問題(即二次方誤差項). 我應(yīng)該怎樣修改代碼 ?
這十分簡單. 以c-svc為例, 在svm.cpp中只要修改兩個地方即可.
第一, 將solve_c_svc中的:
alpha, Cp, Cn, param->eps, si, param->shrinking);
修改為:
alpha, INF, INF, param->eps, si, param->shrinking);
第二:在SVC_Q類中, 聲明C為私有變量:
在構(gòu)造(constructor)中,將它賦給param.C:
在子程序get_Q中, 在for循環(huán)之后,添加:
data[i] += 1/C;
對于一分類svm,以上修改完全一樣。對于SVR,上面的if語句就沒有必要了,你只要用一個簡單的賦值語句即可: