2012-06-13 78 views
5

我是R和SVMs的新手,我試圖從e1071包中描述svm函數。但是,我找不到任何大型數據集,這使得我可以獲得不同大小輸入數據的良好分析結果範圍。有誰知道如何工作svm?我應該使用哪個數據集? svm的任何特定參數使其工作更難?分析支持SVM(e1071)R

我複製了一些我用來測試性能的命令。也許是最有用的,更容易得到什麼我想在這裏:

#loading libraries 
library(class) 
library(e1071) 
#I've been using golubEsets (more examples availables) 
library(golubEsets) 

#get the data: matrix 7129x38 
data(Golub_Train) 
n <- exprs(Golub_Train) 

#duplicate rows(to make the dataset larger) 
n<-rbind(n,n) 

#take training samples as a vector 
samplelabels <- as.vector([email protected]@data$ALL.AML) 

#calculate svm and profile it 
Rprof('svm.out') 
svmmodel1 <- svm(x=t(n), y=samplelabels, type='C', kernel="radial", cross=10) 
Rprof(NULL) 

我不斷增加的數據集複製的行和列,但我達到了內存極限,而不是使svm工作更難的...

+1

複製訓練點並不會讓問題變得更困難。由於大多數SVM需要將整個數據集放入主內存中,因此您最終會遇到內存錯誤。 – karenu

+0

那麼,我該如何嘗試使用適當的大數據集呢?你知道我可以使用的任何例子嗎? – Manolete

+0

是的,如果你看到我的答案,我列出了一些可用的數據集。此外,你應該做參數調整來找到最佳參數,你會發現,當你搜索給你最準確的參數時,一些訓練比其他訓練需要更長的時間。查看作者的libsvm中的實用指南:http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFYQFjAA&url=http%3A%2F%2Fwww.csie.ntu .edu.tw%2F〜cjlin%2Fpapers%2Fguide%2Fguide.pdf&ei = WtLhT46NO-jw0gG3​​0pHVAw&usg = AFQjCNFol0McRktHC6gsBxKXqQMvmQUFeg – karenu

回答

8

在「運用SVM out」方面 - 將使SVM「更難」工作的是一個更加複雜的模型,它不易分離,維數更高,數據集更大更密集。

  • 數據集大小的增加(數據點的數目)
  • 稀疏降低(更少的零)
  • 維數增加(屬性的數量)
  • 非:

    SVM性能劣化使用線性內核(並且內核參數可以使內核評估更復雜)

變參數

是否有參數,你可以換作SVM需要更長的時間。當然,這些參數會影響您獲得的解決方案的質量,並且可能沒有任何意義。

使用C-SVM,改變C將導致不同的運行時間。 (nu-SVM中的相似參數爲nu)如果數據集合理可分,使C變小會導致更長的運行時間,因爲SVM將允許更多的訓練點成爲支持向量。如果數據集不是非常可分的話,那麼將C設置得更大會導致運行時間更長,因爲您實際上告訴SVM您需要一個緊密匹配數據的窄利潤解決方案,並且計算數據不容易時需要更長的時間分離。

通常情況下,您在進行參數搜索時發現,有些參數會增加計算時間,而準確度卻無法提高。

其他參數是內核參數,如果您改變它們以增加計算內核的複雜度,那麼SVM運行時自然會增加。線性內核很簡單,而且速度最快;非線性內核當然需要更長的時間。一些參數可能不會增加內核的計算複雜度,但會迫使一個更復雜的模型,這可能需要更長的時間才能找到最佳解決方案。

數據集來使用:

UCI Machine Learning Repository是數據集的重要來源。

MNIST handwriting recognition dataset是一個很好的使用 - 你可以隨機選擇數據的子集來創建越來越大的數據集。請記住鏈接上的數據包含所有數字,SVM當然是二進制數據,所以您必須將數據減少到兩位數字或進行某種多類SVM。

你也可以很容易的生成的數據集。爲了生成一個線性數據集,隨機選擇一個超平面的法向量,然後生成一個數據點並確定它所處的超平面的哪一面來標記它。添加一些隨機性以允許超平面的特定距離內的點有時被標記爲不同。通過增加類之間的重疊來增加複雜性。或者生成一些正態分佈點的聚類,標記爲1或-1,以便分佈在邊緣重疊。經典的非線性示例是棋盤格。生成點並將它們標記爲棋盤圖案。爲了使其更難以放大正方形的數量,增加尺寸並增加數據點的數量。當然,你將不得不使用非線性內核。

+0

非常感謝您的寶貴意見。我很感激。我已更新我的問題,看看這是否有幫助 – Manolete

+0

karenu輸入矩陣呢?我真的很難理解何時以及爲什麼我需要應用轉置。我已經看到了幾個例子,每個人都在做不同的事情。如何知道何時需要應用t()輸入矩陣? – Manolete