Libsvm和Liblinear都是國立臺灣大學的Chih-Jen Lin博士開發的,Libsvm主要是用來進行非線性svm 分類器的生成,提出有一段時間了,而Liblinear則是去年才創建的,主要是應對large-scale的data classification,因為linear分類器的訓練比非線性分類器的訓練計算復雜度要低很多,時間也少很多,而且在large scale data上的性能和非線性的分類器性能相當,所以Liblinear是針對大數據而生的。
兩者都是一個跨平臺的通用工具庫,支持windows/linux/mac os,代碼本身是c++寫的,同時也有matlab,Python,java,c/c++擴展接口,方便不同語言環境使用,可以說是科研和企業人員的首選!像我這樣在學校的一般用matlab/c++,而我同學在百度則主要用的是python/c++,所以只是各自側重不一樣,但所使用的核心還是其svm庫。
以上Libsvm和Liblinear的主頁上都有windows下的binary文件下載,zip,tar格式都有,解壓后,找到matlab子文件目錄,參看里面的readme文件,需要在matlab中進入此目錄,運行make.m文件,matlab會根據本機默認的c/c++編譯器將.c文件生成為.mexw32文件(由于我是32位操作系統,此處為mexw32,對于64位os,則對應為mexw64),提供matlab下能使用的接口。之后生成了這些.mexw32文件復制到你自己的matlab工程根目錄中,就可以在matlab文件中調用libsvm/liblinear庫中的函數了~
http://blog.sina.com.cn/s/blog_5bd2cb260100ev25.html 這位網友對libsvm在matlab中的使用說明的很詳細,可以參考下。
有關Liblinear和Libsvm各自的優勢可以歸納如下: 1.libsvm用來就解決通用典型的分類問題 2.liblinear主要為大規模數據的線性模型設計
it can be able to handle large-scaled dataset 可以用來處理大規模的數據 it runs really faster than libsvm because it doesn’t have to compute thekernel for any two points 由于采用線性核,所以不需要計算kernel value,速度更快 trust region method for optimization looks new for machine learning people
以下為一位網友采用liblinear進行數據分類的實驗性能說明“ ”今天試用了以下liblinear,速度很快(快到我沒有想到), 我的實驗數據: 訓練集:21504 * 1500(1500是樣本的數量,21504是維度) 測試集:21504 * 2985 速度用秒來衡量,20次實驗總共不到2分鐘。
同樣的問題我用了libsvm實驗速度上相差太大,libsvm實驗5次,每次將近10分鐘,時間是其次,發現一個問題就是,libsvm比liblinear的結果相差1個百分點,沒有讀liblinear的文章,不知道問題出在那個地方,libsvm我直接用的默認參數,線性模型。這樣必然引起一個問題,如果我想評價線性模型和非線性模型的性能,我不可能一個用liblinear一個用libsvm,如果兩個都用libsvm,報告的性能肯定有一些問題。
所以如果你的問題維度很大(線性模型就有非常好的性能),不妨考慮liblinear. “
大致看了一下libsvm和liblinear的說明文檔,發現一個問題就是在線性問題上兩者的目標函數就不一樣,所以性能上的差異是正常的,應該說如果優化同一樣的目標函數兩者性能應該會差不多,但是速度很明顯,liblinear快很多。
對于什么時候用線性模型的問題,我想上面的我舉的例子用linear classifier就比較好,非線性分類不一定比線性分類器好,尤其是在樣本及其有限,同時特征維度很高的情況下,因為樣本有限的情況下,kernel map通常不準確,很有可能錯誤地劃分類別空間,可能造成比線性模型更差的結果。
說到scale,我建議不要用libsvm里自帶的scale,因為一旦使用這個工具,它就會把原來稀疏的數據,變成非稀疏的格式,這樣不但會生成非常大的數據文件,而且liblinear對稀疏數據快速處理的優勢就不能體現出來了。因此,要scale,就自己寫一個,以保持原來稀疏的格式 liblinear的好處就是速度快,尤其是對稀疏的特征。缺點就是太吃內存了。10G的數據量需要接近50G的內存,數據量再大就沒法做了 。
另外,還有一個經常提到的svm庫SVM-per:http://www.cs.cornell.edu/people/tj/svm_light/svm_perf.html 是康奈爾大學的人設計的。好像對計算機硬件的性能要求比liblinear要低…有做圖像處理的人使用這個svm-per代替liblinear。
另外,對于多分類問題以及核函數的選取,以下經驗規則可以借鑒:
如果如果特征數遠遠大于樣本數的情況下,使用線性核就可以了. 如果特征數和樣本數都很大,例如文檔分類,一般使用線性核, LIBLINEAR比LIBSVM速度要快很多. 如果特征數遠小于樣本數,這種情況一般使用RBF.但是如果一定要用線性核,則選擇LIBLINEAR較好,而且使用-s 2選項。
對于多分類問題: 對于15類場景來說,每類100幅訓練圖像,如果直接訓練一個15類的multi-class classifier,則訓練文件的Label值取1~15,wi標記不用指定(default 1)。如果對于每個類單獨訓練一個分類器,這樣就把這個類的100幅圖像作為正樣本(假設Label=1),而其余所有的訓練圖像作為負樣本(共1400幅,假設Label=-1),由此可以看出正負樣本不平衡,因此應該制定wi選項,具體地可以指定-w1 14,-w-1 1( 1是缺省值),在cross validation的時候首先指定-wi,然后通過grid.py來確定(C,g)的最優值。實際做實驗的時候,可以具體比較一下兩種情況到底有多大差別。
關于Libsvm,臺灣大學林智仁這樣描述它:”LIBSVM is an integrated software for support vector classification, (C-SVC, nu-SVC), regression (epsilon-SVR, nu-SVR) and distribution estimation (one-class SVM). It supports multi-class classification.”即Libsvm是一個整合了支持向量機(C-SVC, nu-SVC)、回歸、分布估計(one-class SVM)的軟件。并且支持多類別的分類。而對于LIblinear,官網上是這樣介紹的:”LIBLINEAR is a linear classifier for data with millions of instances and features“,即主要專門為百萬級別的數據和特征實現的線性分類器。 他們兩個都是用來做分類的,相對來說Libsvm應用的范圍較廣, 而Liblinear主要用于處理大數據量的訓練過程。在什么樣的情況下,該選擇Liblinear而不是Libsvm呢?作者給出幾點建議: 當你面對海量的數據時,這里的海量通常是百萬級別以上。海量數據分為兩個層次:樣本數量和特征的數量。 使用線性和非線性映射訓練模型得到相近的效果。 對模型訓練的時間效率要求較高。 在這類情況下,建議你使用Liblinear,而不是libsvm。文本分類是最典型的例子,文本分類的樣本量非常多,而且特征的維度也是很高,從幾千-幾百萬的數量級,因此在做文本方面的分類時最好選擇liblinear。作者給出一個例子,對比liblinear與libsvm訓練效果與時間效率。數據總共包含20,242樣本,每個樣本都包含47,236 個特征。 [plain] view plaincopy % time libsvm-2.85/svm-train -c 4 -t 0 -e 0.1 -m 800 -v 5 rcv1_train.binary Cross Validation Accuracy = 96.8136% 345.569s % time liblinear-1.21/train -c 4 -e 0.1 -v 5 rcv1_train.binary Cross Validation Accuracy = 97.0161% 2.944s
更多信息請參考: LibLinear: http://www.csie.ntu.edu.tw/~cjlin/liblinear/ LibSVM:https://www.csie.ntu.edu.tw/~cjlin/libsvm/
新聞熱點
疑難解答